Updates for THINK C 6.0.  Moved the necessary UNIX emulation routines here.
diff --git a/Mac/Compat/chdir.c b/Mac/Compat/chdir.c
new file mode 100644
index 0000000..b8ec6d7
--- /dev/null
+++ b/Mac/Compat/chdir.c
@@ -0,0 +1,26 @@
+/* Chdir for the Macintosh.
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+   Pathnames must be Macintosh paths, with colons as separators. */
+
+#include "macdefs.h"
+
+/* Change current directory. */
+
+int
+chdir(path)
+	char *path;
+{
+	WDPBRec pb;
+	char name[MAXPATH];
+	
+	strncpy(name, path, sizeof name);
+	name[MAXPATH-1]= EOS;
+	pb.ioNamePtr= (StringPtr) c2pstr(name);
+	pb.ioVRefNum= 0;
+	pb.ioWDDirID= 0;
+	if (PBHSetVol(&pb, FALSE) != noErr) {
+		errno= ENOENT;
+		return -1;
+	}
+	return 0;
+}
diff --git a/Mac/Compat/dirent.h b/Mac/Compat/dirent.h
new file mode 100644
index 0000000..44cfc5a
--- /dev/null
+++ b/Mac/Compat/dirent.h
@@ -0,0 +1,22 @@
+/*
+ * "Dir.h" for the Macintosh.
+ * Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+ */
+
+#define MAXNAMLEN 31
+#define MAXPATH 256
+
+#define DIR  struct _dir
+
+struct _dir {
+	long dirid;
+	int nextfile;
+};
+
+struct dirent {
+	char d_name[MAXPATH];
+};
+
+extern DIR *opendir(char *);
+extern struct dirent *readdir(DIR *);
+extern void closedir(DIR *);
diff --git a/Mac/Compat/getbootvol.c b/Mac/Compat/getbootvol.c
new file mode 100644
index 0000000..8f5d28c
--- /dev/null
+++ b/Mac/Compat/getbootvol.c
@@ -0,0 +1,18 @@
+/* Return the name of the boot volume (not the current directory).
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+*/
+
+#include "macdefs.h"
+
+char *
+getbootvol()
+{
+	short vrefnum;
+	static unsigned char name[32];
+	
+	(void) GetVol(name, &vrefnum);
+	p2cstr(name);
+		/* Shouldn't fail; return ":" if it does */
+	strcat((char *)name, ":");
+	return (char *)name;
+}
diff --git a/Mac/Compat/getwd.c b/Mac/Compat/getwd.c
new file mode 100644
index 0000000..3a093ed
--- /dev/null
+++ b/Mac/Compat/getwd.c
@@ -0,0 +1,109 @@
+/* Get full pathname of current working directory.  The pathname is
+   copied to the parameter array 'cwd', and a pointer to this array
+   is also returned as function result.  If an error occurred, however,
+   the return value is NULL but 'cwd' is filled with an error message.
+   
+   BUG: expect spectacular crashes when called from a directory whose
+   path would be over MAXPATH bytes long (files in such directories are
+   not reachable by full pathname).
+   
+   Starting with the dir ID returned by PBHGetVol, we do successive
+   PBGetCatInfo's to get a component of the path until we reach the
+   root (recognized by a dir ID of 2).  We move up along the path
+   using the dir ID of the parent directory returned by PBGetCatInfo.
+   
+   Then we catenate the components found in reverse order with the volume
+   name (already gotten from PBHGetVol), with intervening and trailing
+   colons
+   
+   The code works correctly on MFS disks (where it always returns the
+   volume name) by simply skipping the PBGetCatinfo calls in that case.
+   There is a 'bug' in PBGetCatInfo when called for an MFS disk (with
+   HFS running): it then seems to call PBHGetVInfo, which returns a
+   larger parameter block.  But we won't run into this problem because
+   we never call PBGetCatInfo for the root (assuming that PBHGetVol
+   still sets the root ID in this case).
+
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+*/
+
+#ifdef MPW
+#include <Strings.h>
+#endif
+#include "macdefs.h"
+
+#define ROOTID 2 /* Root directory ID */
+
+char *
+getwd(cwd)
+	char *cwd;
+{
+	/* Universal parameter block. */
+	union {
+#ifdef THINK_C
+		HFileInfo f;
+		DirInfo d;
+		WDPBRec w;
+#else /* MPW */
+		struct HFileInfo f;
+		struct DirInfo d;
+		struct WDPBRec w;
+#endif
+	} pb;
+	char buf[MAXPATH]; /* Buffer to store the name components */
+	char *ecwd, *ebuf; /* Pointers to end of used part of cwd and buf */
+	int err; /* Error code of last I/O call */
+	
+	/* First, get the default volume name and working directory ID. */
+	
+	pb.w.ioNamePtr= (unsigned char *)cwd;
+	err= PBHGetVol(&pb.w, FALSE);
+	if (err != noErr) {
+		sprintf(cwd, "I/O error %d in PBHGetVol", err);
+		return NULL;
+	}
+	ecwd= strchr(p2cstr((unsigned char*)cwd), EOS);
+	ebuf= buf;
+	*ebuf = EOS;
+	
+	/* Next, if at least we're running HFS, walk up the path. */
+	
+	if (hfsrunning()) {
+		long dirid= pb.w.ioWDDirID;
+		pb.d.ioVRefNum= pb.w.ioWDVRefNum;
+		while (dirid != ROOTID) {
+			pb.d.ioNamePtr= (unsigned char *) ++ebuf;
+			pb.d.ioFDirIndex= -1;
+			pb.d.ioDrDirID= dirid;
+			err= PBGetCatInfo((CInfoPBPtr)&pb.d, FALSE);
+			if (err != noErr) {
+				sprintf(cwd, "I/O error %d in PBGetCatInfo", err);
+				return NULL;
+			}
+			dirid= pb.d.ioDrParID;
+			ebuf += strlen(p2cstr((unsigned char *)ebuf));
+			/* Should check for buf overflow */
+		}
+	}
+	
+	/* Finally, reverse the list of components and append it to cwd.
+	   Ebuf points at the EOS after last component,
+	   and there is an EOS before the first component.
+	   If there are no components, ebuf equals buf (but there
+	   is still an EOS where it points).
+	   Ecwd points at the EOS after the path built up so far,
+	   initially the volume name.
+	   We break out of the loop in the middle, thus
+	   appending a colon at the end in all cases. */
+	
+	for (;;) {
+		*ecwd++ = ':';
+		if (ebuf == buf)
+			break;
+		do { } while (*--ebuf != EOS); /* Find component start */
+		strcpy(ecwd, ebuf+1);
+		ecwd= strchr(ecwd, EOS);
+	}
+	*ecwd= EOS;
+	return cwd;
+}
diff --git a/Mac/Compat/mkdir.c b/Mac/Compat/mkdir.c
new file mode 100644
index 0000000..b064761
--- /dev/null
+++ b/Mac/Compat/mkdir.c
@@ -0,0 +1,30 @@
+/* Mkdir for the Macintosh.
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+   Pathnames must be Macintosh paths, with colons as separators. */
+
+#include "macdefs.h"
+
+/* Create a directory. */
+
+int
+mkdir(path, mode)
+	char *path;
+	int mode; /* Ignored */
+{
+	HFileParam pb;
+	char name[MAXPATH];
+		
+	if (!hfsrunning()) {
+		errno= ENODEV;
+		return -1;
+	}
+	strncpy(name, path, sizeof name);
+	pb.ioNamePtr= (StringPtr) c2pstr(name);
+	pb.ioVRefNum= 0;
+	pb.ioDirID= 0;
+	if (PBDirCreate((HParmBlkPtr)&pb, FALSE) != noErr) {
+		errno= EACCES;
+		return -1;
+	}
+	return 0;
+}
diff --git a/Mac/Compat/opendir.c b/Mac/Compat/opendir.c
new file mode 100644
index 0000000..74b8984
--- /dev/null
+++ b/Mac/Compat/opendir.c
@@ -0,0 +1,104 @@
+/*
+ * Macintosh version of UNIX directory access package
+ * (opendir, readdir, closedir).
+ * Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+ */
+
+#include "dirent.h"
+#include "macdefs.h"
+
+static DIR opened;
+
+/*
+ * Open a directory.  This means calling PBOpenWD.
+ * The value returned is always the address of opened, or NULL.
+ * (I have as yet no use for multiple open directories; this could
+ * be implemented by allocating memory dynamically.)
+ */
+
+DIR *
+opendir(path)
+	char *path;
+{
+	union {
+		WDPBRec d;
+		VolumeParam v;
+	} pb;
+	char ppath[MAXPATH];
+	short err;
+	
+	if (opened.nextfile != 0) {
+		errno = EBUSY;
+		return NULL; /* A directory is already open. */
+	}
+	strncpy(ppath+1, path, ppath[0]= strlen(path));
+	pb.d.ioNamePtr= (unsigned char *)ppath;
+	pb.d.ioVRefNum= 0;
+	if (hfsrunning()) {
+		pb.d.ioWDProcID= 0;
+		pb.d.ioWDDirID= 0;
+		err= PBOpenWD((WDPBPtr)&pb, FALSE);
+	}
+	else {
+		pb.v.ioVolIndex= 0;
+		err= PBGetVInfo((ParmBlkPtr)&pb, FALSE);
+	}
+	if (err != noErr) {
+		errno = ENOENT;
+		return NULL;
+	}
+	opened.dirid= pb.d.ioVRefNum;
+	opened.nextfile= 1;
+	return &opened;
+}
+
+/*
+ * Close a directory.
+ */
+
+void
+closedir(dirp)
+	DIR *dirp;
+{
+	if (hfsrunning()) {
+		WDPBRec pb;
+		
+		pb.ioVRefNum= dirp->dirid;
+		(void) PBCloseWD(&pb, FALSE);
+	}
+	dirp->dirid= 0;
+	dirp->nextfile= 0;
+}
+
+/*
+ * Read the next directory entry.
+ */
+
+struct dirent *
+readdir(dp)
+	DIR *dp;
+{
+	union {
+		DirInfo d;
+		FileParam f;
+		HFileInfo hf;
+	} pb;
+	short err;
+	static struct dirent dir;
+	
+	dir.d_name[0]= 0;
+	pb.d.ioNamePtr= (unsigned char *)dir.d_name;
+	pb.d.ioVRefNum= dp->dirid;
+	pb.d.ioFDirIndex= dp->nextfile++;
+	pb.d.ioDrDirID= 0;
+	if (hfsrunning())
+		err= PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+	else
+		err= PBGetFInfo((ParmBlkPtr)&pb, FALSE);
+	if (err != noErr) {
+		errno = EIO;
+		return NULL;
+	}
+	(void) p2cstr((unsigned char *)dir.d_name);
+	return &dir;
+}
diff --git a/Mac/Compat/rmdir.c b/Mac/Compat/rmdir.c
new file mode 100644
index 0000000..f31052f
--- /dev/null
+++ b/Mac/Compat/rmdir.c
@@ -0,0 +1,22 @@
+/* Rmdir for the Macintosh.
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+   Pathnames must be Macintosh paths, with colons as separators. */
+
+#include "macdefs.h"
+
+int
+rmdir(path)
+	char *path;
+{
+	IOParam pb;
+	char name[MAXPATH];
+	
+	strncpy(name, path, sizeof name);
+	pb.ioNamePtr= (StringPtr) c2pstr(name);
+	pb.ioVRefNum= 0;
+	if (PBDelete((ParmBlkPtr)&pb, FALSE) != noErr) {
+		errno= EACCES;
+		return -1;
+	}
+	return 0;
+}
diff --git a/Mac/Compat/sync.c b/Mac/Compat/sync.c
new file mode 100644
index 0000000..a6487e1
--- /dev/null
+++ b/Mac/Compat/sync.c
@@ -0,0 +1,17 @@
+/* The equivalent of the Unix 'sync' system call: FlushVol.
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+   For now, we only flush the default volume
+   (since that's the only volume written to by MacB). */
+
+#include "macdefs.h"
+
+int
+sync()
+{
+	if (FlushVol((StringPtr)0, 0) == noErr)
+		return 0;
+	else {
+		errno= ENODEV;
+		return -1;
+	}
+}
diff --git a/Mac/Include/config.h b/Mac/Include/config.h
index 2a79025..c92f1a6 100644
--- a/Mac/Include/config.h
+++ b/Mac/Include/config.h
@@ -1,10 +1,8 @@
-/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+/* config.h for Macintosh THINK C 6.0.  */
 
-/* Define if on Macintosh, compiling with any C compiler. */
+/* Define if on Macintosh (THINK C or MPW */
 #define macintosh
 
-#define HAVE_STDARG_PROTOTYPES 1
-
 /* Define if on AIX 3.
    System headers sometimes define this.
    We just want to avoid a redefinition error message.  */
@@ -12,6 +10,9 @@
 #undef _ALL_SOURCE
 #endif
 
+/* Define if type char is unsigned and you are not using gcc.  */
+#undef __CHAR_UNSIGNED__
+
 /* Define to empty if the keyword does not work.  */
 #undef const
 
@@ -85,25 +86,69 @@
    (as it does on SGI IRIX 4.x) */
 #undef BAD_EXEC_PROTOTYPES
 
+/* Define if your compiler botches static forward declarations
+   (as it does on SCI ODT 3.0) */
+#undef BAD_STATIC_FORWARD
+
+/* Define to `long' if <time.h> doesn't define.  */
+#undef clock_t
+
 /* Define if getpgrp() must be called as getpgrp(0)
    and (consequently) setpgrp() as setpgrp(0, 0). */
-#undef GETPGRP_HAVE_ARGS
+#undef GETPGRP_HAVE_ARG
+
+/* Define this if your time.h defines altzone */
+#undef HAVE_ALTZONE
 
 /* Define if your compiler supports function prototypes */
 #define HAVE_PROTOTYPES
 
+/* Define if your compiler supports variable length function prototypes
+   (e.g. void fprintf(FILE *, char *, ...);) *and* <stdarg.h> */
+#define HAVE_STDARG_PROTOTYPES
+
+/* Define if you have POSIX threads */
+#undef _POSIX_THREADS
+
+/* Define to empty if the keyword does not work.  */
+#undef signed
+
 /* Define if  you can safely include both <sys/select.h> and <sys/time.h>
    (which you can't on SCO ODT 3.0). */
 #undef SYS_SELECT_WITH_SYS_TIME
 
+/* Define if you want to use SGI (IRIX 4) dynamic linking.
+   This requires the "dl" library by Jack Jansen,
+   ftp://ftp.cwi.nl/pub/dynload/dl-1.6.tar.Z.
+   Don't bother on IRIX 5, it already has dynamic linking using SunOS
+   style shared libraries */ 
+#undef WITH_SGI_DL
+
+/* Define if you want to emulate SGI (IRIX 4) dynamic linking.
+   This is rumoured to work on VAX (Ultrix), Sun3 (SunOS 3.4),
+   Sequent Symmetry (Dynix), and Atari ST.
+   This requires the "dl-dld" library,
+   ftp://ftp.cwi.nl/pub/dynload/dl-dld-1.1.tar.Z,
+   as well as the "GNU dld" library,
+   ftp://ftp.cwi.nl/pub/dynload/dld-3.2.3.tar.Z.
+   Don't bother on SunOS 4 or 5, they already have dynamic linking using
+   shared libraries */ 
+#undef WITH_DL_DLD
+
 /* Define if you want to compile in rudimentary thread support */
 #undef WITH_THREAD
 
 /* Define if you want to use the GNU readline library */
 #undef WITH_READLINE
 
+/* Define if you have chown.  */
+#undef HAVE_CHOWN
+
 /* Define if you have clock.  */
-#define HAVE_CLOCK 1
+#define HAVE_CLOCK
+
+/* Define if you have dlopen.  */
+#undef HAVE_DLOPEN
 
 /* Define if you have ftime.  */
 #undef HAVE_FTIME
@@ -114,17 +159,23 @@
 /* Define if you have getpgrp.  */
 #undef HAVE_GETPGRP
 
+/* Define if you have getpid.  */
+#undef HAVE_GETPID
+
 /* Define if you have gettimeofday.  */
 #undef HAVE_GETTIMEOFDAY
 
 /* Define if you have getwd.  */
 #define HAVE_GETWD 1
 
+/* Define if you have link.  */
+#undef HAVE_LINK
+
 /* Define if you have lstat.  */
 #undef HAVE_LSTAT
 
-/* Define if you have readline.  */
-#undef HAVE_READLINE
+/* Define if you have nice.  */
+#undef HAVE_NICE
 
 /* Define if you have readlink.  */
 #undef HAVE_READLINK
@@ -132,6 +183,9 @@
 /* Define if you have select.  */
 #undef HAVE_SELECT
 
+/* Define if you have setgid.  */
+#undef HAVE_SETGID
+
 /* Define if you have setpgid.  */
 #undef HAVE_SETPGID
 
@@ -141,8 +195,11 @@
 /* Define if you have setsid.  */
 #undef HAVE_SETSID
 
+/* Define if you have setuid.  */
+#undef HAVE_SETUID
+
 /* Define if you have setvbuf.  */
-#define HAVE_SETVBUF 1
+#define HAVE_SETVBUF
 
 /* Define if you have siginterrupt.  */
 #undef HAVE_SIGINTERRUPT
@@ -168,14 +225,17 @@
 /* Define if you have the <dlfcn.h> header file.  */
 #undef HAVE_DLFCN_H
 
+/* Define if you have the <fcntl.h> header file.  */
+#undef HAVE_FCNTL_H
+
 /* Define if you have the <signal.h> header file.  */
-#define HAVE_SIGNAL_H 1
+#define HAVE_SIGNAL_H
 
 /* Define if you have the <stdarg.h> header file.  */
-#define HAVE_STDARG_H 1
+#define HAVE_STDARG_H
 
 /* Define if you have the <stdlib.h> header file.  */
-#define HAVE_STDLIB_H 1
+#define HAVE_STDLIB_H
 
 /* Define if you have the <sys/audioio.h> header file.  */
 #undef HAVE_SYS_AUDIOIO_H
@@ -186,6 +246,9 @@
 /* Define if you have the <sys/select.h> header file.  */
 #undef HAVE_SYS_SELECT_H
 
+/* Define if you have the <sys/time.h> header file.  */
+#undef HAVE_SYS_TIME_H
+
 /* Define if you have the <sys/times.h> header file.  */
 #undef HAVE_SYS_TIMES_H
 
@@ -207,12 +270,18 @@
 /* Define if you have the dl library (-ldl).  */
 #undef HAVE_LIBDL
 
+/* Define if you have the inet library (-linet).  */
+#undef HAVE_LIBINET
+
 /* Define if you have the mpc library (-lmpc).  */
 #undef HAVE_LIBMPC
 
 /* Define if you have the nsl library (-lnsl).  */
 #undef HAVE_LIBNSL
 
+/* Define if you have the pthreads library (-lpthreads).  */
+#undef HAVE_LIBPTHREADS
+
 /* Define if you have the seq library (-lseq).  */
 #undef HAVE_LIBSEQ
 
@@ -222,5 +291,11 @@
 /* Define if you have the sun library (-lsun).  */
 #undef HAVE_LIBSUN
 
+/* Define if you have the termcap library (-ltermcap).  */
+#undef HAVE_LIBTERMCAP
+
+/* Define if you have the termlib library (-ltermlib).  */
+#undef HAVE_LIBTERMLIB
+
 /* Define if you have the thread library (-lthread).  */
 #undef HAVE_LIBTHREAD
diff --git a/Mac/Include/macdefs.h b/Mac/Include/macdefs.h
new file mode 100644
index 0000000..dcdedb1
--- /dev/null
+++ b/Mac/Include/macdefs.h
@@ -0,0 +1,38 @@
+/* Useful #includes and #defines for programming a set of Unix
+   look-alike file system access functions on the Macintosh.
+   Public domain by Guido van Rossum, CWI, Amsterdam (July 1987).
+*/
+
+#include <Types.h>
+#include <Files.h>
+#include <OSUtils.h>
+
+#ifndef MPW
+#include <pascal.h>
+#endif
+
+#include <errno.h>
+#include <string.h>
+
+/* Difference in origin between Mac and Unix clocks: */
+#define TIMEDIFF ((unsigned long) \
+	(((1970-1904)*365 + (1970-1904)/4) * 24 * 3600))
+
+/* Macro to find out whether we can do HFS-only calls: */
+#define FSFCBLen (* (short *) 0x3f6)
+#define hfsrunning() (FSFCBLen > 0)
+
+/* Universal constants: */
+#define MAXPATH 256
+#define TRUE 1
+#define FALSE 0
+#ifndef NULL
+#define NULL 0
+#endif
+#define EOS '\0'
+#define SEP ':'
+
+#if 0 // doesn't work
+/* Call Macsbug: */
+pascal void Debugger() extern 0xA9FF;
+#endif
diff --git a/Mac/Modules/config.c b/Mac/Modules/config.c
index a018551..abb5296 100644
--- a/Mac/Modules/config.c
+++ b/Mac/Modules/config.c
@@ -1,5 +1,6 @@
-/***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+/* Generated automatically from ../../Modules/config.c.in by makesetup. */
+/* -*- C -*- ***********************************************
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -34,6 +35,7 @@
 #include "myproto.h"
 #include "mymalloc.h"
 #include "osdefs.h"
+#include "intrcheck.h"
 
 
 #ifndef NO_MAIN
@@ -52,17 +54,9 @@
 	char **argv;
 {
 #ifdef macintosh
-
-#ifndef MPW /* XXX RJW undefined in MPW */
-	wargs(&argc, &argv);
+	/* Macs always support stdwin */
+//	wargs(&argc, &argv);
 #endif
-
-#ifndef MPW_3 /* XXX RJW doesn't seem to work with MPW C 3.0 */
-	extern int std_open_hook();
-	set_open_hook (std_open_hook);
-#endif
-#endif
-
 	argv0 = argv[0];
 	realmain(argc, argv);
 }
@@ -76,6 +70,40 @@
 #endif
 
 
+/* Python version information */
+
+#include "patchlevel.h"
+
+/* Return the version string.  This is constructed from the official
+   version number (from patchlevel.h), and the current date (if known
+   to the compiler, else a manually inserted date). */
+
+#define VERSION "%s (%s)"
+
+#ifdef __DATE__
+#define DATE __DATE__
+#else
+#define DATE "Aug 17 1994"
+#endif
+
+char *
+getversion()
+{
+	static char version[80];
+	sprintf(version, VERSION, PATCHLEVEL, DATE);
+	return version;
+}
+
+
+/* Return the copyright string.  This is updated manually. */
+
+char *
+getcopyright()
+{
+	return "Copyright 1991-1994 Stichting Mathematisch Centrum, Amsterdam";
+}
+
+
 /* Return the initial python search path.  This is called once from
    initsys() to initialize sys.path.
    The environment variable PYTHONPATH is fetched and the default path
@@ -85,14 +113,14 @@
 
 #ifndef PYTHONPATH
 #ifdef macintosh
-#define PYTHONPATH ": :Lib :Lib:stdwin :Demo"
+#define PYTHONPATH ": :Lib :Lib:stdwin :Lib:test :Lib:mac"
 #endif /* macintosh */
 #endif /* !PYTHONPATH */
 
 #ifndef PYTHONPATH
-#ifdef MSDOS
+#if defined(MSDOS) || defined(NT)
 #define PYTHONPATH ".;..\\lib;\\python\\lib"
-#endif /* MSDOS */
+#endif /* MSDOS || NT */
 #endif /* !PYTHONPATH */
 
 #ifndef PYTHONPATH
@@ -146,6 +174,7 @@
 extern void initnis();
 extern void initpwd();
 extern void initgrp();
+extern void initcrypt();
 extern void initselect();
 extern void initsocket();
 extern void initaudioop();
@@ -166,6 +195,10 @@
 extern void initfl();
 extern void initthread();
 extern void inittiming();
+extern void initsignal();
+extern void initnew();
+extern void initdl();
+extern void initsyslog();
 
 /* -- ADDMODULE MARKER 1 -- */
 
@@ -187,9 +220,11 @@
 	{"audioop", initaudioop},
 	{"imageop", initimageop},
 	{"rgbimg", initrgbimg},
-	{"stdwin", initstdwin},
+//	{"stdwin", initstdwin},
 	{"md5", initmd5},
 	{"rotor", initrotor},
+//	{"signal", initsignal},
+	{"new", initnew},
 
 /* -- ADDMODULE MARKER 2 -- */
 
diff --git a/Mac/Modules/macmodule.c b/Mac/Modules/macmodule.c
index f684dd2..b495dfa 100644
--- a/Mac/Modules/macmodule.c
+++ b/Mac/Modules/macmodule.c
@@ -36,9 +36,9 @@
 
 #include <fcntl.h>
 
-#include ":::unixemu:macdefs.h"
-#include ":::unixemu:dir.h"
-#include ":::unixemu:stat.h"
+#include "macdefs.h"
+#include "dirent.h"
+#include "stat.h"
 
 #ifndef MAXPATHLEN
 #define MAXPATHLEN 1024
@@ -46,14 +46,13 @@
 
 /* Prototypes for Unix simulation on Mac */
 
-int access PROTO((const char *path, int mode));
 int chdir PROTO((const char *path));
 char *getbootvol PROTO((void));
 char *getwd PROTO((char *));
 int mkdir PROTO((const char *path, int mode));
 DIR * opendir PROTO((char *));
 void closedir PROTO((DIR *));
-struct direct * readdir PROTO((DIR *));
+struct dirent * readdir PROTO((DIR *));
 int rmdir PROTO((const char *path));
 int stat PROTO((const char *path, struct stat *buf));
 int sync PROTO((void));
@@ -129,14 +128,6 @@
 }
 
 static object *
-mac_access(self, args)
-	object *self;
-	object *args;
-{
-	return mac_strint(args, access);
-}
-
-static object *
 mac_chdir(self, args)
 	object *self;
 	object *args;
@@ -243,7 +234,7 @@
 	char *name;
 	object *d, *v;
 	DIR *dirp;
-	struct direct *ep;
+	struct dirent *ep;
 	if (!getargs(args, "s", &name))
 		return NULL;
 	BGN_SAVE
@@ -376,11 +367,17 @@
 	END_SAVE
 	if (res != 0)
 		return mac_error();
-	return mkvalue("(llll)",
+	return mkvalue("(llllllllll)",
 		    (long)st.st_mode,
+		    0L /* st_ino */,
+		    (long)st.st_dev,
+		    (long)st.st_nlink,
+		    (long)st.st_uid,
+		    (long)st.st_gid,
 		    (long)st.st_size,
-		    (long)st.st_rsize,
-		    (long)st.st_mtime);
+		    (long)st.st_atime,
+		    (long)st.st_mtime,
+		    (long)st.st_ctime);
 }
 
 static object *
@@ -426,7 +423,6 @@
 }
 
 static struct methodlist mac_methods[] = {
-	{"access_",	mac_access}, /* "access" is a Python reserved word */
 	{"chdir",	mac_chdir},
 	{"close",	mac_close},
 #ifdef MPW
diff --git a/Mac/Python/macgetmtime.c b/Mac/Python/macgetmtime.c
index c581009..9ba8136 100644
--- a/Mac/Python/macgetmtime.c
+++ b/Mac/Python/macgetmtime.c
@@ -1,4 +1,4 @@
-#include "::unixemu:stat.h"
+#include <stat.h>
 
 /* Interfaced used by import.c */
 
diff --git a/Mac/Python/macguesstabsize.c b/Mac/Python/macguesstabsize.c
index 7027e97..56b39a1 100644
--- a/Mac/Python/macguesstabsize.c
+++ b/Mac/Python/macguesstabsize.c
@@ -10,12 +10,12 @@
 guesstabsize(path)
 	char *path;
 {
-	char s[256];
+	Str255 s;
 	int refnum;
 	Handle h;
 	int tabsize = 0;
 	s[0] = strlen(path);
-	strncpy(s+1, path, s[0]);
+	memcpy(s+1, path, s[0]);
 	refnum = OpenResFile(s);
 /* printf("%s --> refnum=%d\n", path, refnum); */
 	if (refnum == -1)
diff --git a/Mac/scripts/crlf.py b/Mac/scripts/crlf.py
index f52867a..6506cdc 100755
--- a/Mac/scripts/crlf.py
+++ b/Mac/scripts/crlf.py
@@ -1,5 +1,9 @@
 #! /usr/local/bin/python
 
+# Replace \r by \n -- useful after transferring files from the Mac...
+# Run this on UNIX.
+# Usage: crlf.py file ...
+
 import sys
 import os
 import string
@@ -7,8 +11,8 @@
 def main():
 	args = sys.argv[1:]
 	if not args:
-		print 'no files'
-		sys.exit(1)
+		print 'usage:', sys.argv[0], 'file ...'
+		sys.exit(2)
 	for file in args:
 		print file, '...'
 		data = open(file, 'r').read()
diff --git a/Mac/scripts/unshar.py b/Mac/scripts/unshar.py
new file mode 100644
index 0000000..fa60e5a
--- /dev/null
+++ b/Mac/scripts/unshar.py
@@ -0,0 +1,71 @@
+# Extract files from a SHAR archive.
+# Run this on the Mac.
+# Usage:
+# >>> import unshar
+# >>> f = open('SHAR')
+# >>> unshar.unshar(f)
+
+import string
+
+def unshar(fp, verbose=0, overwrite=0):
+	ofp = None
+	file = None
+	while 1:
+		line = fp.readline()
+		if verbose > 3: print 'Got:', `line`
+		if line[:1] == 'X':
+			# Most common case first
+			if ofp: ofp.write(line[1:])
+			continue
+		if not line:
+			if verbose: print 'EOF'
+			if ofp:
+				print 'Unterminated file -- closing'
+				ofp.close()
+				ofp = None
+			break
+		if line[0] == '#':
+			if verbose: print line,
+			continue
+		if line[:14] == 'sed "s/^X//" >':
+			if verbose: print "!!!", `line`
+			i = string.find(line, "'")
+			j = string.find(line, "'", i+1)
+			if i >= 0 and j > i:
+				file = line[i+1:j]
+				if '/' in file:
+					words = string.splitfields(file, '/')
+					for funny in '', '.':
+						while funny in words: words.remove(funny)
+					for i in range(len(words)):
+						if words[i] == '..': words[i] = ''
+					words.insert(0, '')
+					file = string.joinfields(words, ':')
+				try:
+					ofp = open(file, 'r')
+					ofp.close()
+					ofp = None
+					over = 1
+				except IOError:
+					over = 0
+				if over and not overwrite:
+					print 'Skipping', file, '(already exists) ...'
+					continue
+				ofp = open(file, 'w')
+				if over:
+					print 'Overwriting', file, '...'
+				else:
+					print 'Writing', file, '...'
+			continue
+		if line == 'END_OF_FILE\n':
+			if not file:
+				print 'Unexpected END_OF_FILE marker'
+			if ofp:
+				print 'done'
+				ofp.close()
+				ofp = None
+			else:
+				print 'done skipping'
+			file = None
+			continue
+		if verbose: print "...", `line`