X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=driver%2Fghci%2Fghci.c;fp=driver%2Fghci%2Fghci.c;h=f21a12a4ba44fa224be0b0bcda14865e9a160d61;hb=0065d5ab628975892cea1ec7303f968c3338cbe1;hp=0000000000000000000000000000000000000000;hpb=28a464a75e14cece5db40f2765a29348273ff2d2;p=ghc-hetmet.git diff --git a/driver/ghci/ghci.c b/driver/ghci/ghci.c new file mode 100644 index 0000000..f21a12a --- /dev/null +++ b/driver/ghci/ghci.c @@ -0,0 +1,168 @@ +/* + * + * $Id: ghci.c,v 1.10 2005/05/05 00:58:38 sof Exp $ + * + * ghci wrapper for Win32 only + * + * This wrapper invokes ghc.exe with the added command-line + * option "--interactive". + * (On Unix this is done by the ghci.sh shell script, but + * that does not work so well on Win32.) + * + * (c) The GHC Team 2001 + * + * ghc.exe is searched for using the 'normal' search rules + * for DLLs / EXEs (i.e., first in the same dir as this wrapper, + * then system dirs, then PATH). + * + * To compile: + * + * MSVC: cl /o ghci.exe /c ghciwrap.c + * mingw: gcc -mno-cygwin -o ghci.exe ghciwrap.c + * + * If you want to associate your own icon with the wrapper, + * here's how to do it: + * + * * Create a one-line .rc file, ghci.rc (say), containing + * 0 ICON "hsicon.ico" + * (subst the string literal for the name of your icon file). + * * Compile it up (assuming the .ico file is in the same dir + * as the .rc file): + * + * MSVC: rc /i. /fo ghci.res ghci.rc + * mingw: windres -o ghci.res -i ghci.rc -O coff + * + * * Add the resulting .res file to the link line of the wrapper: + * + * MSVC: cl /o ghci.exe /c ghciwrap.c ghci.res + * mingw: gcc -mno-cygwin -o ghci.exe ghciwrap.c ghci.res + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#define BINARY_NAME "ghc.exe" +#define IACTIVE_OPTION "--interactive" + +#define errmsg(msg) fprintf(stderr, msg "\n"); fflush(stderr) +#define errmsg1(msg,val) fprintf(stderr, msg "\n",val); fflush(stderr) + +int +main(int argc, char** argv) +{ + TCHAR binPath[FILENAME_MAX+1]; + TCHAR binPathShort[MAX_PATH+1]; + DWORD dwSize = FILENAME_MAX; + TCHAR* szEnd; + int i; + char* new_cmdline; + char *ptr, *src; + unsigned int cmdline_len = 0; + char **pp; + LPTSTR pp1; + + STARTUPINFO si; + PROCESS_INFORMATION pi; + + ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); + ZeroMemory(&si, sizeof(STARTUPINFO)); + si.cb = sizeof(STARTUPINFO); + + if ( getenv("_") ) { + printf("WARNING: GHCi invoked via 'ghci.exe' in *nix-like shells (cygwin-bash, in particular)\n"); + printf(" doesn't handle Ctrl-C well; use the 'ghcii.sh' shell wrapper instead\n"); + fflush(stdout); + } + + /* Locate the binary we want to start up */ + if ( !SearchPath(NULL, + BINARY_NAME, + NULL, + dwSize, + (char*)binPath, + &szEnd) ) { + errmsg1("%s: Unable to locate ghc.exe", argv[0]); + return 1; + } + + dwSize = MAX_PATH; + /* Turn the path into short form - LFN form causes problems + when passed in argv[0]. */ + if ( !(GetShortPathName(binPath, binPathShort, dwSize)) ) { + errmsg1("%s: Unable to locate ghc.exe", argv[0]); + return 1; + } + + /* Compute length of the flattened 'argv', including extra IACTIVE_OPTION (and spaces!) */ + cmdline_len += 1 + strlen(IACTIVE_OPTION); + for(i=1;i