[project @ 2000-07-03 14:32:58 by simonmar]
[ghc-hetmet.git] / ghc / interpreter / machdep.c
index ace1420..b5d9217 100644 (file)
@@ -13,8 +13,8 @@
  * included in the distribution.
  *
  * $RCSfile: machdep.c,v $
- * $Revision: 1.15 $
- * $Date: 1999/12/03 12:39:42 $
+ * $Revision: 1.32 $
+ * $Date: 2000/05/26 10:14:33 $
  * ------------------------------------------------------------------------*/
 
 #ifdef HAVE_SIGNAL_H
 #  include <types.h>
 # endif
 #endif
+
+#if 0
 #if HAVE_SYS_PARAM_H
 # include <sys/param.h>
 #endif
+#endif
+
 #ifdef HAVE_SYS_STAT_H
 # include <sys/stat.h>
 #else
@@ -45,7 +49,7 @@
 #ifdef HAVE_DOS_H
 # include <dos.h>
 #endif
-#if defined HAVE_CONIO_H && ! HUGS_FOR_WINDOWS
+#if defined HAVE_CONIO_H
 # include <conio.h>
 #endif
 #ifdef HAVE_IO_H
 # include <windows.h>
 #endif
 
-#if HUGS_FOR_WINDOWS
-#include <dir.h>
-#include <mem.h>
-
-extern HCURSOR HandCursor;            /* Forward references to cursors   */
-extern HCURSOR GarbageCursor;
-extern HCURSOR SaveCursor;
-static void    local DrawStatusLine     Args((HWND));
-#endif
-
 #if DOS
 #include <mem.h>
 extern unsigned _stklen = 8000;         /* Allocate an 8k stack segment    */
@@ -105,48 +99,13 @@ int allow_break_count = 0;
 #endif
 
 /* --------------------------------------------------------------------------
- * Prototypes for registry reading
- * ------------------------------------------------------------------------*/
-
-#if USE_REGISTRY
-
-/* where have we hidden things in the registry? */
-#if HSCRIPT
-#define HScriptRoot ("SOFTWARE\\Haskell\\HaskellScript\\")
-#endif
-
-#define HugsRoot ("SOFTWARE\\Haskell\\Hugs\\" HUGS_VERSION "\\")
-#define ProjectRoot ("SOFTWARE\\Haskell\\Projects\\")
-
-static Bool   local createKey      Args((HKEY, String, PHKEY, REGSAM));
-static Bool   local queryValue     Args((HKEY, String, String, LPDWORD, LPBYTE, DWORD));
-static Bool   local setValue       Args((HKEY, String, String, DWORD, LPBYTE, DWORD));
-static String local readRegString  Args((HKEY, String, String, String));
-static Int    local readRegInt     Args((String,Int));
-static Bool   local writeRegString Args((String,String));
-static Bool   local writeRegInt    Args((String,Int));
-
-static String local readRegChildStrings Args((HKEY, String, String, Char, String));
-#endif /* USE_REGISTRY */
-
-/* --------------------------------------------------------------------------
  * Find information about a file:
  * ------------------------------------------------------------------------*/
 
-#if RISCOS
-typedef struct { unsigned hi, lo; } Time;
-#define timeChanged(now,thn)    (now.hi!=thn.hi || now.lo!=thn.lo)
-#define timeSet(var,tm)         var.hi = tm.hi; var.lo = tm.lo
-error  timeEarlier not defined
-#else
-typedef time_t Time;
-#define timeChanged(now,thn)      (now!=thn)
-#define timeSet(var,tm)           var = tm
-#define timeEarlier(earlier,now)  (earlier < now)
-#endif
+#include "machdep_time.h"
 
-static Bool local readable      Args((String));
-static Void local getFileInfo   Args((String, Time *, Long *));
+static Bool local readable      ( String );
+static Void local getFileInfo   ( String, Time *, Long * );
 
 static Void local getFileInfo(f,tm,sz)  /* find time stamp and size of file*/
 String f;
@@ -241,23 +200,23 @@ String f; {
  * Search for script files on the HUGS path:
  * ------------------------------------------------------------------------*/
 
-static String local hugsdir       Args((Void));
+static String local hugsdir       ( Void );
 #if HSCRIPT
-static String local hscriptDir    Args((Void));
+static String local hscriptDir    ( Void );
 #endif
-//static String local RealPath      Args((String));
-static int    local pathCmp       Args((String, String));
-static String local normPath      Args((String));
-static Void   local searchChr     Args((Int));
-static Void   local searchStr     Args((String));
-static Bool   local tryEndings    Args((String));
-
-#if DOS_FILENAMES
-# define SLASH                   '\\'
+static int    local pathCmp       ( String, String );
+static String local normPath      ( String );
+static Void   local searchChr     ( Int );
+static Void   local searchStr     ( String );
+static Bool   local tryEndings    ( String );
+
+#if (DOS_FILENAMES || __CYGWIN32__) 
+# define SLASH                   '/'
+# define SLASH_STR               "/"
 # define isSLASH(c)              ((c)=='\\' || (c)=='/')
 # define PATHSEP                 ';'
 # define PATHSEP_STR             ";"
-# define DLL_ENDING              ".dll"
+# define DLL_ENDING              ".u_o"
 #elif MAC_FILENAMES
 # define SLASH                   ':'
 # define isSLASH(c)              ((c)==SLASH)
@@ -267,6 +226,7 @@ static Bool   local tryEndings    Args((String));
 # define DLL_ENDING              ".pef" 
 #else
 # define SLASH                   '/'
+# define SLASH_STR               "/"
 # define isSLASH(c)              ((c)==SLASH)
 # define PATHSEP                 ':'
 # define PATHSEP_STR             ":"
@@ -325,49 +285,6 @@ static String local hscriptDir() {  /* Directory containing hscript.dll       */
 }
 #endif
 
-#if 0  /* apparently unused */
-static String local RealPath(s)         /* Find absolute pathname of file  */
-String s; {
-#if HAVE__FULLPATH  /* eg DOS */
-    static char path[FILENAME_MAX+1];
-    _fullpath(path,s,FILENAME_MAX+1);
-#elif HAVE_REALPATH /* eg Unix */
-    static char path[MAXPATHLEN+1];
-    realpath(s,path);                
-#else
-    static char path[FILENAME_MAX+1];
-    strcpy(path,s);
-#endif
-    return path;
-}
-#endif
-
-
-static int local pathCmp(p1,p2)       /* Compare paths after normalisation */
-String p1;
-String p2; {
-#if HAVE__FULLPATH  /* eg DOS */
-    static char path1[FILENAME_MAX+1];
-    static char path2[FILENAME_MAX+1];
-    _fullpath(path1,p1,FILENAME_MAX+1);
-    _fullpath(path2,p2,FILENAME_MAX+1);
-#elif HAVE_REALPATH /* eg Unix */
-    static char path1[MAXPATHLEN+1];
-    static char path2[MAXPATHLEN+1];
-    realpath(p1,path1);                
-    realpath(p2,path2);                
-#else
-    static char path1[FILENAME_MAX+1];
-    static char path2[FILENAME_MAX+1];
-    strcpy(path1,p1);
-    strcpy(path2,p2);
-#endif
-#if CASE_INSENSITIVE_FILENAMES
-    strlwr(path1);
-    strlwr(path2);
-#endif
-    return filenamecmp(path1,path2);
-}
 
 static String local normPath(s) /* Try, as much as possible, to normalize  */
 String s; {                     /* a pathname in some appropriate manner.  */
@@ -521,14 +438,6 @@ String along;                   /* Return NULL if file does not exist      */
 String nm; {
     /* AC, 1/21/99: modified to search hugsPath first, then projectPath */
     String s = findMPathname(along,nm,hugsPath);
-#if USE_REGISTRY
-#if 0
- ToDo:
-    if (s==NULL) {
-        s = findMPathname(along,nm,projectPath);
-    }
-#endif /* 0 */
-#endif /* USE_REGISTRY */
     return s ? s : normPath(searchBuf);
 }
 
@@ -645,9 +554,8 @@ Bool findFilesForModule (
         String  modName,
         String* path,
         String* sExt,
-        Bool* sAvail, Time* sTime, Long* sSize,
-        Bool* iAvail, Time* iTime, Long* iSize,
-        Bool* oAvail, Time* oTime, Long* oSize
+        Bool* sAvail,  Time* sTime,  Long* sSize,
+        Bool* oiAvail, Time* oiTime, Long* oSize, Long* iSize
      )
 {
    /* Let the module name given be M.
@@ -659,34 +567,48 @@ Bool findFilesForModule (
         use P to fill in the path names.
       Otherwise, move on to the next path entry.
       If all path entries are exhausted, return False.
+
+      If in standalone, only look for (and succeed for) source modules.
+      Caller free()s path.  sExt is statically allocated.
+      srcExt is only set if a valid source file is found.
    */
    Int    nPath;
    Bool   literate;
    String peStart, peEnd;
-   String augdPath;       /* .:hugsPath:installDir/GhcPrel:installDir/lib */
+   String augdPath;       /* .:hugsPath:installDir/../lib/std:installDir/lib */
+   Time   oTime,  iTime;
+   Bool   oAvail, iAvail;
 
    *path = *sExt = NULL;
-   *sAvail = *iAvail = *oAvail = FALSE;
-   *sSize  = *iSize  = *oSize  = 0;
+   *sAvail = *oiAvail = oAvail = iAvail = FALSE;
+   *sSize  = *oSize  = *iSize  = 0;
 
    augdPath = malloc( 2*(10+3+strlen(installDir)) 
-                      +strlen(hugsPath) +10/*paranoia*/);
+                      +strlen(hugsPath) +50/*paranoia*/);
    if (!augdPath)
       internal("moduleNameToFileNames: malloc failed(2)");
 
    augdPath[0] = 0;
-   strcat(augdPath, ".");
-   strcat(augdPath, PATHSEP_STR);
 
-   strcat(augdPath, hugsPath);
-   strcat(augdPath, PATHSEP_STR);
+   if (combined) {
+      strcat(augdPath, installDir);
+      strcat(augdPath, "..");
+      strcat(augdPath, SLASH_STR);
+      strcat(augdPath, "lib");
+      strcat(augdPath, SLASH_STR);
+      strcat(augdPath, "std");
+      strcat(augdPath, PATHSEP_STR);
+   }
 
    strcat(augdPath, installDir);
-   strcat(augdPath, "GhcPrel");
+   strcat(augdPath, "lib");
    strcat(augdPath, PATHSEP_STR);
 
-   strcat(augdPath, installDir);
-   strcat(augdPath, "lib");
+   /* these two were previously before the above `if' */
+   strcat(augdPath, ".");
+   strcat(augdPath, PATHSEP_STR);
+
+   strcat(augdPath, hugsPath);
    strcat(augdPath, PATHSEP_STR);
 
    /* fprintf ( stderr, "augdpath = `%s'\n", augdPath ); */
@@ -720,20 +642,25 @@ Bool findFilesForModule (
       nPath += strlen(modName);
 
       /* searchBuf now holds 'P/M'.  Try out the various endings. */
-      *path = *sExt = NULL;
-      *sAvail = *iAvail = *oAvail = FALSE;
-      *sSize  = *iSize  = *oSize  = 0;
+      *path = *sExt                         = NULL;
+      *sAvail = *oiAvail = oAvail = iAvail  = FALSE;
+      *sSize = *oSize = *iSize              = 0;
 
-      strcpy(searchBuf+nPath, DLL_ENDING);
-      if (readable(searchBuf)) {
-         *oAvail = TRUE;
-         getFileInfo(searchBuf, oTime, oSize);
-      }
-
-      strcpy(searchBuf+nPath, ".u_hi");
-      if (readable(searchBuf)) {
-         *iAvail = TRUE;
-         getFileInfo(searchBuf, iTime, iSize);
+      if (combined) {
+         strcpy(searchBuf+nPath, DLL_ENDING);
+         if (readable(searchBuf)) {
+            oAvail = TRUE;
+            getFileInfo(searchBuf, &oTime, oSize);
+         }
+         strcpy(searchBuf+nPath, HI_ENDING);
+         if (readable(searchBuf)) {
+            iAvail = TRUE;
+            getFileInfo(searchBuf, &iTime, iSize);
+         }
+         if (oAvail && iAvail) {
+            *oiAvail = TRUE;
+            *oiTime = whicheverIsLater ( oTime, iTime );
+         }
       }
 
       strcpy(searchBuf+nPath, ".hs");
@@ -753,7 +680,7 @@ Bool findFilesForModule (
       }
 
       /* Success? */
-      if (*sAvail || (*oAvail && *iAvail)) {
+      if (*sAvail || *oiAvail) {
          nPath -= strlen(modName);
          *path = malloc(nPath+1);
          if (!(*path))
@@ -769,12 +696,49 @@ Bool findFilesForModule (
 }
 
 
+/* If the primaryObjectName is (eg)
+     /foo/bar/PrelSwamp.o
+   and the extraFileName is (eg)
+     swampy_cbits
+   and DLL_ENDING is set to .o
+   return
+     /foo/bar/swampy_cbits.o
+     and set *extraFileSize to its size, or -1 if not avail
+*/
+String getExtraObjectInfo ( String primaryObjectName,
+                            String extraFileName,
+                            Int*   extraFileSize )
+{
+   Time   xTime;
+   Long   xSize;
+   String xtra;
+
+   Int i = strlen(primaryObjectName)-1;
+   while (i >= 0 && primaryObjectName[i] != SLASH) i--;
+   if (i == -1) return extraFileName;
+   i++;
+   xtra = malloc ( i+3+strlen(extraFileName)+strlen(DLL_ENDING) );
+   if (!xtra) internal("deriveExtraObjectName: malloc failed");
+   strncpy ( xtra, primaryObjectName, i );
+   xtra[i] = 0;
+   strcat ( xtra, extraFileName );
+   strcat ( xtra, DLL_ENDING );
+
+   *extraFileSize = -1;
+   if (readable(xtra)) {
+      getFileInfo ( xtra, &xTime, &xSize );
+      *extraFileSize = xSize;
+   }
+   return xtra;
+}
+
+
 /* --------------------------------------------------------------------------
  * Substitute old value of path into empty entries in new path
  * eg substPath("a:b:c::d:e","x:y:z") = "a:b:c:x:y:z:d:e"
  * ------------------------------------------------------------------------*/
 
-static String local substPath Args((String,String));
+static String local substPath ( String,String );
 
 static String local substPath(new,sub) /* substitute sub path into new path*/
 String new;
@@ -812,9 +776,6 @@ String sub; {
 Bool gcMessages = FALSE;                /* TRUE => print GC messages       */
 
 Void gcStarted() {                      /* Notify garbage collector start  */
-#if HUGS_FOR_WINDOWS
-    SaveCursor = SetCursor(GarbageCursor);
-#endif
     if (gcMessages) {
         Printf("{{Gc");
         FlushStdout();
@@ -834,9 +795,6 @@ Int recovered; {
         Printf("%d}}",recovered);
         FlushStdout();
     }
-#if HUGS_FOR_WINDOWS
-    SetCursor(SaveCursor);
-#endif
 }
 
 Cell *CStackBase;                       /* Retain start of C control stack */
@@ -903,7 +861,7 @@ void gcCStack() {
 Void gcCStack() {                       /* Garbage collect elements off    */
     Cell stackTop = NIL;                /* C stack                         */
     Cell *ptr = &stackTop;
-#if SIZEOF_INTP == 2
+#if SIZEOF_VOID_P == 2
     if (((long)(ptr) - (long)(CStackBase))&1)
         fatal("gcCStack");
 #elif STACK_ALIGNMENT == 2 /* eg Macintosh 68000 */
@@ -914,7 +872,7 @@ Void gcCStack() {                       /* Garbage collect elements off    */
         fatal("gcCStack");
 #endif
 
-#define Blargh markWithoutMove(*ptr);
+#define Blargh mark(*ptr);
 #if 0
                markWithoutMove((*ptr)/sizeof(Cell)); \
                markWithoutMove(( (void*)(*ptr)-(void*)heapTopFst)/sizeof(Cell));  \
@@ -933,7 +891,7 @@ Void gcCStack() {                       /* Garbage collect elements off    */
     GuessDirection;
 #endif
 
-#if SIZEOF_INTP==4 && STACK_ALIGNMENT == 2 /* eg Macintosh 68000 */
+#if SIZEOF_VOID_P==4 && STACK_ALIGNMENT == 2 /* eg Macintosh 68000 */
     ptr = (Cell *)((long)(&stackTop) + 2);
     StackGrowsDown;
 #endif
@@ -945,275 +903,13 @@ Void gcCStack() {                       /* Garbage collect elements off    */
 #endif
 
 /* --------------------------------------------------------------------------
- * Terminal dependent stuff:
- * ------------------------------------------------------------------------*/
-
-#if (HAVE_TERMIO_H | HAVE_SGTTY_H | HAVE_TERMIOS_H)
-
-/* grab the varargs prototype for ioctl */
-#if HAVE_SYS_IOCTL_H
-# include <sys/ioctl.h>
-#endif
-
-/* The order of these three tests is very important because
- * some systems have more than one of the requisite header file
- * but only one of them seems to work.
- * Anyone changing the order of the tests should try enabling each of the
- * three branches in turn and write down which ones work as well as which
- * OS/compiler they're using.
- *
- * OS            Compiler      sgtty     termio  termios   notes
- * Linux 2.0.18  gcc 2.7.2     absent    works   works     1
- *
- * Notes:
- * 1) On Linux, termio.h just #includes termios.h and sgtty.h is
- *    implemented using termios.h.
- *    sgtty.h is in /usr/include/bsd which is not on my standard include
- *    path.  Adding it does no harm but you might as well use termios.
- *    --
- *    reid-alastair@cs.yale.edu
- */
-#if HAVE_TERMIOS_H
-
-#include <termios.h>
-typedef  struct termios  TermParams;
-#define  getTerminal(tp) tcgetattr(fileno(stdin), &tp)
-#define  setTerminal(tp) tcsetattr(fileno(stdin), TCSAFLUSH, &tp)
-#define  noEcho(tp)      tp.c_lflag    &= ~(ICANON | ECHO); \
-                         tp.c_cc[VMIN]  = 1;                \
-                         tp.c_cc[VTIME] = 0;
-
-#elif HAVE_SGTTY_H
-
-#include <sgtty.h>
-typedef  struct sgttyb   TermParams;
-#define  getTerminal(tp) ioctl(fileno(stdin),TIOCGETP,&tp)
-#define  setTerminal(tp) ioctl(fileno(stdin),TIOCSETP,&tp)
-#if HPUX
-#define  noEcho(tp)      tp.sg_flags |= RAW; tp.sg_flags &= (~ECHO);
-#else
-#define  noEcho(tp)      tp.sg_flags |= CBREAK; tp.sg_flags &= (~ECHO);
-#endif
-
-#elif HAVE_TERMIO_H
-
-#include <termio.h>
-typedef  struct termio   TermParams;
-#define  getTerminal(tp) ioctl(fileno(stdin),TCGETA,&tp)
-#define  setTerminal(tp) ioctl(fileno(stdin),TCSETAF,&tp)
-#define  noEcho(tp)      tp.c_lflag    &= ~(ICANON | ECHO); \
-                         tp.c_cc[VMIN]  = 1;                \
-                         tp.c_cc[VTIME] = 0;
-
-#endif
-
-static Bool messedWithTerminal = FALSE;
-static TermParams originalSettings;
-
-Void normalTerminal() {                 /* restore terminal initial state  */
-    if (messedWithTerminal)
-        setTerminal(originalSettings);
-}
-
-Void noechoTerminal() {                 /* set terminal into noecho mode   */
-    TermParams settings;
-
-    if (!messedWithTerminal) {
-        getTerminal(originalSettings);
-        messedWithTerminal = TRUE;
-    }
-    getTerminal(settings);
-    noEcho(settings);
-    setTerminal(settings);
-}
-
-Int getTerminalWidth() {                /* determine width of terminal     */
-#ifdef TIOCGWINSZ
-#ifdef _M_UNIX                          /* SCO Unix 3.2.4 defines TIOCGWINSZ*/
-#include <sys/stream.h>                 /* Required by sys/ptem.h          */
-#include <sys/ptem.h>                   /* Required to declare winsize     */
-#endif
-    static struct winsize terminalSize;
-    ioctl(fileno(stdout),TIOCGWINSZ,&terminalSize);
-    return (terminalSize.ws_col==0)? 80 : terminalSize.ws_col;
-#else
-    return 80;
-#endif
-}
-
-Int readTerminalChar() {                /* read character from terminal    */
-    return getchar();                   /* without echo, assuming that     */
-}                                       /* noechoTerminal() is active...   */
-
-#elif SYMANTEC_C
-
-Int readTerminalChar() {                /* read character from terminal    */
-    return getchar();                   /* without echo, assuming that     */
-}                                       /* noechoTerminal() is active...   */
-Int getTerminalWidth() {
-    return console_options.ncols;
-}
-
-Void normalTerminal() {
-    csetmode(C_ECHO, stdin);
-}
-
-Void noechoTerminal() {
-    csetmode(C_NOECHO, stdin);
-}
-
-#else /* no terminal driver - eg DOS, RISCOS */
-
-static Bool terminalEchoReqd = TRUE;
-
-Int getTerminalWidth() {
-#if RISCOS
-    int dummy, width;
-    (void) os_swi3r(OS_ReadModeVariable, -1, 1, 0, &dummy, &dummy, &width);
-    return width+1;
-#else
-    return 80;
-#endif
-}
-
-Void normalTerminal() {                 /* restore terminal initial state  */
-    terminalEchoReqd = TRUE;
-}
-
-Void noechoTerminal() {                 /* turn terminal echo on/off       */
-    terminalEchoReqd = FALSE;
-}
-
-Int readTerminalChar() {                /* read character from terminal    */
-    if (terminalEchoReqd) {
-        return getchar();
-    } else {
-#if IS_WIN32 && !HUGS_FOR_WINDOWS && !__BORLANDC__
-       /* When reading a character from the console/terminal, we want
-        * to operate in 'raw' mode (to use old UNIX tty parlance) and have
-        * it return when a character is available and _not_ wait until
-        * the next time the user hits carriage return. On Windows platforms,
-        * this _can_ be done by reading directly from the console, using
-        * getch().  However, this doesn't sit well with programming
-        * environments such as Emacs which allow you to create sub-processes
-        * running Hugs, and then communicate with the running interpreter
-        * through its standard input and output handles. If you use getch()
-        * in that setting, you end up trying to read the (unused) console
-        * of the editor itself, through which not a lot of characters is
-        * bound to come out, since the editor communicates input to Hugs
-        * via the standard input handle.
-        *
-        * To avoid this rather unfortunate situation, we use the Win32
-        * console API and re-jig the input properties of the standard
-        * input handle before trying to read a character using stdio's
-        * getchar().
-        * 
-        * The 'cost' of this solution is that it is Win32 specific and
-        * won't work with Windows 3.1 + it is kind of ugly and verbose
-        * to have to futz around with the console properties on a
-        * per-char basis. Both of these disadvantages aren't in my
-        * opinion fatal.
-        *
-        * -- sof 5/99
-        */
-        Int c;
-       DWORD mo;
-       HANDLE hIn;
-       /* I don't quite understand why, but if the FILE*'s underlying file
-          descriptor is in text mode, we seem to lose the first carriage
-          return.
-        */
-       setmode(fileno(stdin), _O_BINARY);
-       hIn = GetStdHandle(STD_INPUT_HANDLE);
-       GetConsoleMode(hIn, &mo);
-       SetConsoleMode(hIn, mo & ~(ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT));
-       /* 
-        * On Win9x, the first time you change the mode (as above) a
-        * raw '\n' is inserted.  Since enter maps to a raw '\r', and we
-        * map this (below) to '\n', we can just ignore all *raw* '\n's.
-        */
-       do {
-         c = getc(stdin);
-       } while (c == '\n');
-       /* Same as it ever was - revert back state of stdin. */
-       SetConsoleMode(hIn, mo);
-       setmode(fileno(stdin), _O_TEXT);
-#else
-       Int c = getch();
-#endif
-        return c=='\r' ? '\n' : c;      /* slight paranoia about CR-LF    */
-    }
-}
-
-#endif /* no terminal driver */
-
-/* --------------------------------------------------------------------------
  * Interrupt handling:
  * ------------------------------------------------------------------------*/
 
-Bool    broken         = FALSE;
-static  Bool breakReqd = FALSE;
-static  sigProto(ignoreBreak);
-static  Void local installHandlers Args((Void));
-
-Bool breakOn(reqd)                      /* set break trapping on if reqd,  */
-Bool reqd; {                            /* or off otherwise, returning old */
-    Bool old  = breakReqd;
-
-    breakReqd = reqd;
-    if (reqd) {
-        if (broken) {                   /* repond to break signal received */
-            broken = FALSE;             /* whilst break trap disabled      */
-            sigRaise(breakHandler);
-            /* not reached */
-        }
-#if HANDLERS_CANT_LONGJMP
-        ctrlbrk(ignoreBreak);
-#else
-        ctrlbrk(breakHandler);
-#endif
-    } else {
-        ctrlbrk(ignoreBreak);
-    }
-    return old;
-}
-
-static sigHandler(ignoreBreak) {        /* record but don't respond to break*/
-    ctrlbrk(ignoreBreak);         /* reinstall signal handler               */
-                                  /* redundant on BSD systems but essential */
-                                  /* on POSIX and other systems             */
-    broken = TRUE;
-    interruptStgRts();
-    sigResume;
-}
-
-#if !DONT_PANIC
-static sigProto(panic);
-static sigHandler(panic) {              /* exit in a panic, on receipt of  */
-    everybody(EXIT);                    /* an unexpected signal            */
-    fprintf(stderr,"\nUnexpected signal\n");
-    exit(1);
-    sigResume;/*NOTREACHED*/
-}
-#endif /* !DONT_PANIC */
-
-#if IS_WIN32
-BOOL WINAPI consoleHandler(DWORD dwCtrlType) {
-    switch (dwCtrlType) {              /* Allows Hugs to be terminated    */
-       case CTRL_CLOSE_EVENT :         /* from the window's close menu.   */
-           ExitProcess(0);
-    }
-    return FALSE;
-}
-#endif
-static Void local installHandlers() { /* Install handlers for all fatal    */ 
+static Void installHandlers ( void ) { /* Install handlers for all fatal   */ 
                                       /* signals except SIGINT and SIGBREAK*/
 #if IS_WIN32
-    SetConsoleCtrlHandler(consoleHandler,TRUE);
+    /* SetConsoleCtrlHandler(consoleHandler,TRUE); */
 #endif
 #if !DONT_PANIC && !DOS
 # ifdef SIGABRT
@@ -1368,157 +1064,6 @@ int chdir(const char *s) {
 #endif
 
 
-/*---------------------------------------------------------------------------
- * Printf-related operations:
- *-------------------------------------------------------------------------*/
-
-#if !defined(HAVE_VSNPRINTF)
-int vsnprintf(buffer, count, fmt, ap)
-char*       buffer;
-int         count;
-const char* fmt;
-va_list     ap; {
-#if defined(HAVE__VSNPRINTF)
-    return _vsnprintf(buffer, count, fmt, ap);
-#else
-    return 0;
-#endif
-}
-#endif /* HAVE_VSNPRINTF */
-
-#if !defined(HAVE_SNPRINTF)
-int snprintf(char* buffer, int count, const char* fmt, ...) {
-#if defined(HAVE__VSNPRINTF)
-    int r;
-    va_list ap;                    /* pointer into argument list           */
-    va_start(ap, fmt);             /* make ap point to first arg after fmt */
-    r = vsnprintf(buffer, count, fmt, ap);
-    va_end(ap);                    /* clean up                             */
-    return r;
-#else
-    return 0;
-#endif
-}
-#endif /* HAVE_SNPRINTF */
-
-/* --------------------------------------------------------------------------
- * Read/write values from/to the registry
- *
- * All reads are from either HUGS_CURRENT_USER\\hugs_ROOT\\key or 
- * HUGS_LOCAL_MACHINE\\hugs_ROOT\\key.  (Machine entry is only used if
- * user entry doesn't exist).
- *
- * All writes are to HUGS_CURRENT_USER\\HugsRoot\\key
- * ------------------------------------------------------------------------*/
-
-#if USE_REGISTRY
-
-#define HugsRoot ("SOFTWARE\\Haskell\\Hugs\\" HUGS_VERSION "\\")
-
-static Bool   local createKey      Args((HKEY, PHKEY, REGSAM));
-static Bool   local queryValue     Args((HKEY, String, LPDWORD, LPBYTE, DWORD));
-static Bool   local setValue       Args((HKEY, String, DWORD, LPBYTE, DWORD));
-
-static Bool local createKey(hKey, phRootKey, samDesired)
-HKEY    hKey;
-PHKEY   phRootKey; 
-REGSAM  samDesired; {
-    DWORD  dwDisp;
-    return RegCreateKeyEx(hKey, HugsRoot,
-                          0, "", REG_OPTION_NON_VOLATILE,
-                          samDesired, NULL, phRootKey, &dwDisp) 
-           == ERROR_SUCCESS;
-}
-
-static Bool local queryValue(hKey, regPath, var, type, buf, bufSize)
-HKEY    hKey;
-String  regPath;
-String  var;
-LPDWORD type;
-LPBYTE  buf;
-DWORD   bufSize; {
-    HKEY hRootKey;
-
-    if (!createKey(hKey, regPath, &hRootKey, KEY_READ)) {
-        return FALSE;
-    } else {
-        LONG res = RegQueryValueEx(hRootKey, var, NULL, type, buf, &bufSize);
-        RegCloseKey(hRootKey);
-        return (res == ERROR_SUCCESS);
-    }
-}
-
-static Bool local setValue(hKey, regPath, var, type, buf, bufSize)
-HKEY   hKey;
-String regPath;
-String var;
-DWORD  type;
-LPBYTE buf;
-DWORD  bufSize; {
-    HKEY hRootKey;
-
-    if (!createKey(hKey, regPath, &hRootKey, KEY_WRITE)) {
-        return FALSE;
-    } else {
-        LONG res = RegSetValueEx(hRootKey, var, 0, type, buf, bufSize);
-        RegCloseKey(hRootKey);
-        return (res == ERROR_SUCCESS);
-    }
-}
-
-static String local readRegString(key,regPath,var,def) /* read String from registry */
-HKEY   key;
-String regPath;
-String var; 
-String def; {
-    static char  buf[300];
-    DWORD type;
-    if (queryValue(key, regPath,var, &type, buf, sizeof(buf))
-        && type == REG_SZ) {
-        return (String)buf;
-    } else {
-        return def;
-    }
-}
-
-static Int local readRegInt(var, def)            /* read Int from registry */
-String var;
-Int    def; {
-    DWORD buf;
-    DWORD type;
-
-    if (queryValue(HKEY_CURRENT_USER, HugsRoot, var, &type, 
-                   (LPBYTE)&buf, sizeof(buf))
-        && type == REG_DWORD) {
-        return (Int)buf;
-    } else if (queryValue(HKEY_LOCAL_MACHINE, HugsRoot, var, &type, 
-                          (LPBYTE)&buf, sizeof(buf))
-               && type == REG_DWORD) {
-        return (Int)buf;
-    } else {
-        return def;
-    }
-}
-
-static Bool local writeRegString(var,val)      /* write String to registry */
-String var;                        
-String val; {
-    if (NULL == val) {
-        val = "";
-    }
-    return setValue(HKEY_CURRENT_USER, HugsRoot, var, 
-                    REG_SZ, (LPBYTE)val, lstrlen(val)+1);
-}
-
-static Bool local writeRegInt(var,val)         /* write String to registry */
-String var;                        
-Int    val; {
-    return setValue(HKEY_CURRENT_USER, HugsRoot, var, 
-                    REG_DWORD, (LPBYTE)&val, sizeof(val));
-}
-
-#endif /* USE_REGISTRY */
-
 /* --------------------------------------------------------------------------
  * Things to do with the argv/argc and the env
  * ------------------------------------------------------------------------*/
@@ -1541,17 +1086,12 @@ Void machdep(what)                      /* Handle machine specific         */
 Int what; {                             /* initialisation etc..            */
     switch (what) {
         case MARK    : break;
-        case INSTALL : installHandlers();
+        case POSTPREL: break;
+        case PREPREL : installHandlers();
                        break;
         case RESET   :
         case BREAK   :
-        case EXIT    : normalTerminal();
-#if HUGS_FOR_WINDOWS
-                       if (what==EXIT)
-                           DestroyWindow(hWndMain);
-                       else
-                           SetCursor(LoadCursor(NULL,IDC_ARROW));
-#endif
+        case EXIT    : 
                        break;
     }
 }