diff --git a/Include/accessobject.h b/Include/accessobject.h
index 31b7190..fd8c2e9 100644
--- a/Include/accessobject.h
+++ b/Include/accessobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/allobjects.h b/Include/allobjects.h
index 17d6dd2..2b361c1 100644
--- a/Include/allobjects.h
+++ b/Include/allobjects.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -30,6 +30,10 @@
 
 /* "allobjects.c" -- Source for precompiled header "allobjects.h" */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #ifdef THINK_C
 #define macintosh
 #endif
@@ -37,7 +41,7 @@
 #include <stdio.h>
 #include <string.h>
 
-#include "PROTO.h"
+#include "myproto.h"
 
 #include "object.h"
 #include "objimpl.h"
diff --git a/Include/assert.h b/Include/assert.h
index dbce369..d007eca 100644
--- a/Include/assert.h
+++ b/Include/assert.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,7 +28,13 @@
 
 ******************************************************************/
 
+#ifdef MPW /* This is for MPW's File command */
+
+#define assert(e) { if (!(e)) { printf("### Python: Assertion failed:\n\
+    File %s; Line %d\n", __FILE__, __LINE__); abort(); } }
+#else
 #define assert(e) { if (!(e)) { printf("Assertion failed\n"); abort(); } }
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/Include/bitset.h b/Include/bitset.h
index f7dbe8f..6fa5be6 100644
--- a/Include/bitset.h
+++ b/Include/bitset.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/bltinmodule.h b/Include/bltinmodule.h
index 0c8ecc2..e4f47e0 100644
--- a/Include/bltinmodule.h
+++ b/Include/bltinmodule.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -31,6 +31,7 @@
 /* Built-in module interface */
 
 extern object *getbuiltin PROTO((object *));
+extern int setbuiltin PROTO((char *, object *));
 
 #ifdef __cplusplus
 }
diff --git a/Include/ceval.h b/Include/ceval.h
index 1c830c3..3b16085 100644
--- a/Include/ceval.h
+++ b/Include/ceval.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,6 +35,7 @@
 object *getglobals PROTO((void));
 object *getlocals PROTO((void));
 object *getowner PROTO((void));
+object *getframe PROTO((void));
 
 void printtraceback PROTO((object *));
 void flushline PROTO((void));
@@ -87,7 +88,7 @@
 extern object *save_thread PROTO((void));
 extern void restore_thread PROTO((object *));
 
-#ifdef USE_THREAD
+#ifdef WITH_THREAD
 
 #define BGN_SAVE { \
 			object *_save; \
@@ -97,14 +98,14 @@
 #define END_SAVE	restore_thread(_save); \
 		 }
 
-#else /* !USE_THREAD */
+#else /* !WITH_THREAD */
 
 #define BGN_SAVE {
 #define RET_SAVE
 #define RES_SAVE
 #define END_SAVE }
 
-#endif /* !USE_THREAD */
+#endif /* !WITH_THREAD */
 
 #ifdef __cplusplus
 }
diff --git a/Include/cgensupport.h b/Include/cgensupport.h
index 8472b03..4b295b3 100644
--- a/Include/cgensupport.h
+++ b/Include/cgensupport.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,7 +35,7 @@
 #define mknewlongobject(x) newintobject(x)
 #define mknewshortobject(x) newintobject((long)x)
 #define mknewfloatobject(x) newfloatobject(x)
-#define mknewcharobject(c) mkvalue("c", c)
+#define mknewcharobject(ch) mkvalue("c", ch)
 
 extern int getiobjectarg PROTO((object *args, int nargs, int i, object **p_a));
 extern int getilongarg PROTO((object *args, int nargs, int i, long *p_a));
diff --git a/Include/classobject.h b/Include/classobject.h
index a244ef8..bd6cc1d 100644
--- a/Include/classobject.h
+++ b/Include/classobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/compile.h b/Include/compile.h
index a23fea1..4526523 100644
--- a/Include/compile.h
+++ b/Include/compile.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/dictobject.h b/Include/dictobject.h
index f1df1ef..4afed79 100644
--- a/Include/dictobject.h
+++ b/Include/dictobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/errcode.h b/Include/errcode.h
index d2a2ac6..e8db943 100644
--- a/Include/errcode.h
+++ b/Include/errcode.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -29,11 +29,15 @@
 ******************************************************************/
 
 /* Error codes passed around between file input, tokenizer, parser and
-   interpreter.  This was necessary so we can turn them into Python
-   exceptions at a higher level. */
+   interpreter.  This is necessary so we can turn them into Python
+   exceptions at a higher level.  Note that some errors have a
+   slightly different meaning when passed from the tokenizer to the
+   parser than when passed from the parser to the interpreter; e.g.
+   the parser only returns E_EOF when it hits EOF immediately, and it
+   never returns E_OK. */
 
 #define E_OK		10	/* No error */
-#define E_EOF		11	/* (Unexpected) EOF read */
+#define E_EOF		11	/* End Of File */
 #define E_INTR		12	/* Interrupted */
 #define E_TOKEN		13	/* Bad token */
 #define E_SYNTAX	14	/* Syntax error */
diff --git a/Include/errors.h b/Include/errors.h
index 2444ee1..050ff19 100755
--- a/Include/errors.h
+++ b/Include/errors.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -33,7 +33,7 @@
 void err_set PROTO((object *));
 void err_setval PROTO((object *, object *));
 void err_setstr PROTO((object *, char *));
-int err_occurred PROTO((void));
+object *err_occurred PROTO((void));
 void err_get PROTO((object **, object **));
 void err_clear PROTO((void));
 
@@ -64,12 +64,13 @@
 extern int err_badarg PROTO((void));
 extern object *err_nomem PROTO((void));
 extern object *err_errno PROTO((object *));
-extern void err_input PROTO((int));
 
 extern void err_badcall PROTO((void));
 
 extern object *err_getexc PROTO((void));
 
+extern int sigcheck PROTO((void)); /* In sigcheck.c or signalmodule.c */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/eval.h b/Include/eval.h
index 91e2374..ed33d44 100644
--- a/Include/eval.h
+++ b/Include/eval.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/fileobject.h b/Include/fileobject.h
index 00e4ca9..c52a6aa 100644
--- a/Include/fileobject.h
+++ b/Include/fileobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,6 +35,7 @@
 #define is_fileobject(op) ((op)->ob_type == &Filetype)
 
 extern object *newfileobject PROTO((char *, char *));
+extern void setfilebufsize PROTO((object *, int));
 extern object *newopenfileobject
 	PROTO((FILE *, char *, char *, int (*)FPROTO((FILE *))));
 extern FILE *getfilefile PROTO((object *));
diff --git a/Include/floatobject.h b/Include/floatobject.h
index dad1fe1..1d0484f 100644
--- a/Include/floatobject.h
+++ b/Include/floatobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/frameobject.h b/Include/frameobject.h
index 5eeb2ad..2458881 100644
--- a/Include/frameobject.h
+++ b/Include/frameobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -52,6 +52,7 @@
 	int f_iblock;		/* index in f_blockstack */
 	int f_lasti;		/* Last instruction if called */
 	int f_lineno;		/* Current line number */
+	object *f_trace;	/* Trace function */
 } frameobject;
 
 
@@ -70,11 +71,11 @@
 /* List access macros */
 
 #ifdef NDEBUG
-#define GETITEM(v, i) GETLISTITEM((listobject *)(v), (i))
+#define GETITEM(v, i) GETTUPLEITEM((tupleobject *)(v), (i))
 #define GETITEMNAME(v, i) GETSTRINGVALUE((stringobject *)GETITEM((v), (i)))
 #else
-#define GETITEM(v, i) getlistitem((v), (i))
-#define GETITEMNAME(v, i) getstringvalue(getlistitem((v), (i)))
+#define GETITEM(v, i) gettupleitem((v), (i))
+#define GETITEMNAME(v, i) getstringvalue(GETITEM(v, i))
 #endif
 
 #define GETUSTRINGVALUE(s) ((unsigned char *)GETSTRINGVALUE(s))
@@ -95,6 +96,11 @@
 
 object **extend_stack PROTO((frameobject *, int, int));
 
+/* Conversions between "fast locals" and locals in dictionary */
+
+void locals_2_fast PROTO((frameobject *, int));
+void fast_2_locals PROTO((frameobject *));
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/funcobject.h b/Include/funcobject.h
index ffe2996..84b0dcf 100644
--- a/Include/funcobject.h
+++ b/Include/funcobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,6 +35,8 @@
 	object *func_code;
 	object *func_globals;
 	object *func_name;
+	int	func_argcount;
+	object *func_argdefs;
 } funcobject;
 
 extern typeobject Functype;
@@ -44,6 +46,8 @@
 extern object *newfuncobject PROTO((object *, object *));
 extern object *getfunccode PROTO((object *));
 extern object *getfuncglobals PROTO((object *));
+extern object *getfuncargstuff PROTO((object *, int *));
+extern int     setfuncargstuff PROTO((object *, int, object *));
 
 #ifdef __cplusplus
 }
diff --git a/Include/grammar.h b/Include/grammar.h
index 506304f..f2e008f 100644
--- a/Include/grammar.h
+++ b/Include/grammar.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -34,7 +34,7 @@
 
 /* A label of an arc */
 
-typedef struct _label {
+typedef struct {
 	int	lb_type;
 	char	*lb_str;
 } label;
@@ -43,21 +43,21 @@
 
 /* A list of labels */
 
-typedef struct _labellist {
+typedef struct {
 	int	ll_nlabels;
 	label	*ll_label;
 } labellist;
 
 /* An arc from one state to another */
 
-typedef struct _arc {
+typedef struct {
 	short		a_lbl;		/* Label of this arc */
 	short		a_arrow;	/* State where this arc goes to */
 } arc;
 
 /* A state in a DFA */
 
-typedef struct _state {
+typedef struct {
 	int		 s_narcs;
 	arc		*s_arc;		/* Array of arcs */
 	
@@ -70,7 +70,7 @@
 
 /* A DFA */
 
-typedef struct _dfa {
+typedef struct {
 	int		 d_type;	/* Non-terminal this represents */
 	char		*d_name;	/* For printing */
 	int		 d_initial;	/* Initial state */
@@ -81,7 +81,7 @@
 
 /* A grammar */
 
-typedef struct _grammar {
+typedef struct {
 	int		 g_ndfas;
 	dfa		*g_dfa;		/* Array of DFAs */
 	labellist	 g_ll;
diff --git a/Include/import.h b/Include/import.h
index d960c9f..c335995 100644
--- a/Include/import.h
+++ b/Include/import.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/intobject.h b/Include/intobject.h
index 7b778e9..2ede41e 100644
--- a/Include/intobject.h
+++ b/Include/intobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/intrcheck.h b/Include/intrcheck.h
index 7f1b526..2914a6a 100644
--- a/Include/intrcheck.h
+++ b/Include/intrcheck.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/listobject.h b/Include/listobject.h
index 7af8058..610096b 100644
--- a/Include/listobject.h
+++ b/Include/listobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -62,6 +62,7 @@
 extern object *getlistslice PROTO((object *, int, int));
 extern int setlistslice PROTO((object *, int, int, object *));
 extern int sortlist PROTO((object *));
+extern object *listtuple PROTO((object *));
 
 /* Macro, trading safety for speed */
 #define GETLISTITEM(op, i) ((op)->ob_item[i])
diff --git a/Include/longintrepr.h b/Include/longintrepr.h
index 2188153..b8d279d 100644
--- a/Include/longintrepr.h
+++ b/Include/longintrepr.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/longobject.h b/Include/longobject.h
index 1b048fd..ce2cd0b 100644
--- a/Include/longobject.h
+++ b/Include/longobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -42,6 +42,7 @@
 extern double dgetlongvalue PROTO((object *));
 
 object *long_scan PROTO((char *, int));
+object *long_escan PROTO((char *, char **, int));
 
 #ifdef __cplusplus
 }
diff --git a/Include/mappingobject.h b/Include/mappingobject.h
index 7d006dd..8844c77 100644
--- a/Include/mappingobject.h
+++ b/Include/mappingobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/marshal.h b/Include/marshal.h
index 7823f5c..e086e84 100644
--- a/Include/marshal.h
+++ b/Include/marshal.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/metagrammar.h b/Include/metagrammar.h
index d22f458..8248aed 100644
--- a/Include/metagrammar.h
+++ b/Include/metagrammar.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/methodobject.h b/Include/methodobject.h
index 0252334..1ef19aa 100644
--- a/Include/methodobject.h
+++ b/Include/methodobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/modsupport.h b/Include/modsupport.h
index f476f13..a1f3f1c 100644
--- a/Include/modsupport.h
+++ b/Include/modsupport.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -30,21 +30,28 @@
 
 /* Module support interface */
 
-#ifdef HAVE_PROTOTYPES
-#define USE_STDARG
+#ifdef HAVE_STDARG_PROTOTYPES
+
+#include <stdarg.h>
+
+extern int getargs PROTO((object *, char *, ...));
+extern object *mkvalue PROTO((char *, ...));
+
+#else
+
+#include <varargs.h>
+
+/* Better to have no prototypes at all for varargs functions in this case */
+extern int getargs();
+extern object *mkvalue();
+
 #endif
 
-#ifdef USE_STDARG
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
+extern int vgetargs PROTO((object *, char *, va_list));
+extern object *vmkvalue PROTO((char *, va_list));
 
 extern object *initmodule PROTO((char *, struct methodlist *));
-extern int getargs PROTO((object *, char *, ...));
-extern int vgetargs PROTO((object *, char *, va_list));
-extern object *mkvalue PROTO((char *, ...));
-extern object *vmkvalue PROTO((char *, va_list));
+extern object *initmodule2 PROTO((char *, struct methodlist *, object *));
 
 /* The following are obsolete -- use getargs directly! */
 #define getnoarg(v) getargs(v, "")
diff --git a/Include/moduleobject.h b/Include/moduleobject.h
index b4c0cdf..0605d31 100644
--- a/Include/moduleobject.h
+++ b/Include/moduleobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/mymalloc.h b/Include/mymalloc.h
index 24e2125..ea676c3 100644
--- a/Include/mymalloc.h
+++ b/Include/mymalloc.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -32,41 +32,35 @@
 
 #ifdef macintosh
 #define ANY void
-#ifndef THINK_C_3_0
-#define HAVE_STDLIB
-#endif
-#endif
-
-#ifdef sun
-/* Maybe not for very old versions of SunOS ? */
-#define HAVE_STDLIB
-#endif
-
-#ifdef sgi
-#define HAVE_STDLIB
 #endif
 
 #ifdef __STDC__
 #define ANY void
-#define HAVE_STDLIB
 #endif
 
 #ifdef __TURBOC__
 #define ANY void
-#define HAVE_STDLIB
 #endif
 
 #ifdef __GNUC__
 #define ANY void
-#define HAVE_STDLIB
 #endif
 
 #ifndef ANY
 #define ANY char
 #endif
 
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#else /* !HAVE_STDLIB */
+extern ANY *malloc PROTO((size_t));
+extern ANY *calloc PROTO((size_t, size_t));
+extern ANY *realloc PROTO((ANY *, size_t));
+extern void free PROTO((ANY *)); /* XXX sometimes int on Unix old systems */
+#endif /* !HAVE_STDLIB */
+
 #ifndef NULL
-#define NULL 0
+#define NULL ((ANY *)0)
 #endif
 
 /* XXX Always allocate one extra byte, since some malloc's return NULL
@@ -80,17 +74,6 @@
 #define DEL(p) free((ANY *)p)
 #define XDEL(p) if ((p) == NULL) ; else DEL(p)
 
-#ifdef HAVE_STDLIB
-#include <stdlib.h>
-#define MALLARG size_t
-#else
-#define MALLARG size_t
-extern ANY *malloc PROTO((MALLARG));
-extern ANY *calloc PROTO((MALLARG, MALLARG));
-extern ANY *realloc PROTO((ANY *, MALLARG));
-extern void free PROTO((ANY *)); /* XXX sometimes int on Unix old systems */
-#endif
-
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/myproto.h b/Include/myproto.h
index e6de60e..6862755 100644
--- a/Include/myproto.h
+++ b/Include/myproto.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/myselect.h b/Include/myselect.h
index 174da11..e4f2b28 100644
--- a/Include/myselect.h
+++ b/Include/myselect.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,38 +28,28 @@
 
 ******************************************************************/
 
-/* Common definitions for files that use the BSD select system call.
-   This is so complicated because every UNIX variant requires that
-   you include a different set of headers.  Customizing this one file
-   should be easier than patching each of the files using select()... */
+/* Include file for users of select() */
 
+/* NB caller must include <sys/types.h> */
 
-/* XXX You may have to include some of these only if not already included */
-#include <sys/types.h>
-#include <sys/time.h> /* Implies <time.h> everywhere, as far as I know */
-#include <sys/param.h>
+#ifdef HAVE_SYS_SELECT_H
 
-
-/* Hacks for various systems that need hand-holding... */
-
-#ifdef _SEQUENT_
 #include <sys/select.h>
-/* Sequent doesn't seem to define struct timezone anywhere?!?! */
-struct timezone {
-    int tz_minuteswest;
-    int tz_dsttime;
-};
-#endif
 
-#ifdef _AIX /* I *think* this works */
-/* AIX defines fd_set in a separate file.  Sigh... */
-#include <sys/select.h>
-#endif
+#ifdef SYS_SELECT_WITH_SYS_TIME
+#include "mytime.h"
+#else /* !SYS_SELECT_WITH_SYS_TIME */
+#include <time.h>
+#endif /* !SYS_SELECT_WITH_SYS_TIME */
 
+#else /* !HAVE_SYS_SELECT_H */
 
+#include "mytime.h"
 
-/* (Very) old versions of BSD don't define the FD_* set of macros.
-   The following will usually do... */
+#endif /* !HAVE_SYS_SELECT_H */
+
+/* If the fd manipulation macros aren't defined,
+   here is a set that should do the job */
 
 #ifndef	FD_SETSIZE
 #define	FD_SETSIZE	256
@@ -67,12 +57,12 @@
 
 #ifndef FD_SET
 
-typedef long	fd_mask;
+typedef long fd_mask;
 
 #define NFDBITS	(sizeof(fd_mask) * NBBY)	/* bits per mask */
 #ifndef howmany
 #define	howmany(x, y)	(((x)+((y)-1))/(y))
-#endif
+#endif /* howmany */
 
 typedef	struct fd_set {
 	fd_mask	fds_bits[howmany(FD_SETSIZE, NFDBITS)];
diff --git a/Include/mytime.h b/Include/mytime.h
index fd263d6..e175d5a 100644
--- a/Include/mytime.h
+++ b/Include/mytime.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/node.h b/Include/node.h
index 84238df..24019a6 100644
--- a/Include/node.h
+++ b/Include/node.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/object.h b/Include/object.h
index 24989bf..416ca77 100644
--- a/Include/object.h
+++ b/Include/object.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -133,48 +133,66 @@
 method blocks.
 */
 
+typedef object * (*unaryfunc) PROTO((object *));
+typedef object * (*binaryfunc) PROTO((object *, object *));
+typedef int (*inquiry) PROTO((object *));
+typedef int (*coercion) PROTO((object **, object **));
+typedef object *(*intargfunc) PROTO((object *, int));
+typedef object *(*intintargfunc) PROTO((object *, int, int));
+typedef int(*intobjargproc) PROTO((object *, int, object *));
+typedef int(*intintobjargproc) PROTO((object *, int, int, object *));
+typedef int(*objobjargproc) PROTO((object *, object *, object *));
+
 typedef struct {
-	object *(*nb_add) FPROTO((object *, object *));
-	object *(*nb_subtract) FPROTO((object *, object *));
-	object *(*nb_multiply) FPROTO((object *, object *));
-	object *(*nb_divide) FPROTO((object *, object *));
-	object *(*nb_remainder) FPROTO((object *, object *));
-	object *(*nb_divmod) FPROTO((object *, object *));
-	object *(*nb_power) FPROTO((object *, object *));
-	object *(*nb_negative) FPROTO((object *));
-	object *(*nb_positive) FPROTO((object *));
-	object *(*nb_absolute) FPROTO((object *));
-	int (*nb_nonzero) FPROTO((object *));
-	object *(*nb_invert) FPROTO((object *));
-	object *(*nb_lshift) FPROTO((object *, object *));
-	object *(*nb_rshift) FPROTO((object *, object *));
-	object *(*nb_and) FPROTO((object *, object *));
-	object *(*nb_xor) FPROTO((object *, object *));
-	object *(*nb_or) FPROTO((object *, object *));
-	int (*nb_coerce) FPROTO((object **, object **));
-	object *(*nb_int) FPROTO((object *));
-	object *(*nb_long) FPROTO((object *));
-	object *(*nb_float) FPROTO((object *));
-	object *(*nb_oct) FPROTO((object *));
-	object *(*nb_hex) FPROTO((object *));
+	binaryfunc nb_add;
+	binaryfunc nb_subtract;
+	binaryfunc nb_multiply;
+	binaryfunc nb_divide;
+	binaryfunc nb_remainder;
+	binaryfunc nb_divmod;
+	binaryfunc nb_power;
+	unaryfunc nb_negative;
+	unaryfunc nb_positive;
+	unaryfunc nb_absolute;
+	inquiry nb_nonzero;
+	unaryfunc nb_invert;
+	binaryfunc nb_lshift;
+	binaryfunc nb_rshift;
+	binaryfunc nb_and;
+	binaryfunc nb_xor;
+	binaryfunc nb_or;
+	coercion nb_coerce;
+	unaryfunc nb_int;
+	unaryfunc nb_long;
+	unaryfunc nb_float;
+	unaryfunc nb_oct;
+	unaryfunc nb_hex;
 } number_methods;
 
 typedef struct {
-	int (*sq_length) FPROTO((object *));
-	object *(*sq_concat) FPROTO((object *, object *));
-	object *(*sq_repeat) FPROTO((object *, int));
-	object *(*sq_item) FPROTO((object *, int));
-	object *(*sq_slice) FPROTO((object *, int, int));
-	int (*sq_ass_item) FPROTO((object *, int, object *));
-	int (*sq_ass_slice) FPROTO((object *, int, int, object *));
+	inquiry sq_length;
+	binaryfunc sq_concat;
+	intargfunc sq_repeat;
+	intargfunc sq_item;
+	intintargfunc sq_slice;
+	intobjargproc sq_ass_item;
+	intintobjargproc sq_ass_slice;
 } sequence_methods;
 
 typedef struct {
-	int (*mp_length) FPROTO((object *));
-	object *(*mp_subscript) FPROTO((object *, object *));
-	int (*mp_ass_subscript) FPROTO((object *, object *, object *));
+	inquiry mp_length;
+	binaryfunc mp_subscript;
+	objobjargproc mp_ass_subscript;
 } mapping_methods;
 
+typedef void (*destructor) PROTO((object *));
+typedef int (*printfunc) PROTO((object *, FILE *, int));
+typedef object *(*getattrfunc) PROTO((object *, char *));
+typedef int (*setattrfunc) PROTO((object *, char *, object *));
+typedef int (*cmpfunc) PROTO((object *, object *));
+typedef object *(*reprfunc) PROTO((object *));
+typedef long (*hashfunc) PROTO((object *));
+
 typedef struct _typeobject {
 	OB_VARHEAD
 	char *tp_name; /* For printing */
@@ -182,12 +200,12 @@
 	
 	/* Methods to implement standard operations */
 	
-	void (*tp_dealloc) FPROTO((object *));
-	int (*tp_print) FPROTO((object *, FILE *, int));
-	object *(*tp_getattr) FPROTO((object *, char *));
-	int (*tp_setattr) FPROTO((object *, char *, object *));
-	int (*tp_compare) FPROTO((object *, object *));
-	object *(*tp_repr) FPROTO((object *));
+	destructor tp_dealloc;
+	printfunc tp_print;
+	getattrfunc tp_getattr;
+	setattrfunc tp_setattr;
+	cmpfunc tp_compare;
+	reprfunc tp_repr;
 	
 	/* Method suites for standard classes */
 	
@@ -197,7 +215,8 @@
 
 	/* More standard operations (at end for binary compatibility) */
 
-	long (*tp_hash) FPROTO((object *));
+	hashfunc tp_hash;
+	binaryfunc tp_call;
 #ifdef COUNT_ALLOCS
 	/* these must be last */
 	int tp_alloc;
@@ -327,6 +346,29 @@
 
 
 /*
+A common programming style in Python requires the forward declaration
+of static, initialized structures, e.g. for a typeobject that is used
+by the functions whose address must be used in the initializer.
+Some compilers (notably SCO ODT 3.0, I seem to remember early AIX as
+well) botch this if you use the static keyword for both declarations
+(they allocate two objects, and use the first, uninitialized one until
+the second declaration is encountered).  Therefore, the forward
+declaration should use the 'forwardstatic' keyword.  This expands to
+static on most systems, but to extern on a few.  The actual storage
+and name will still be static because the second declaration is
+static, so no linker visible symbols will be generated.  (Standard C
+compilers take offense to the extern forward declaration of a static
+object, so I can't just put extern in all cases. :-( )
+*/
+
+#ifdef BAD_STATIC_FORWARD
+#define staticforward extern
+#else
+#define staticforward static
+#endif /* BAD_STATIC_FORWARD */
+
+
+/*
 123456789-123456789-123456789-123456789-123456789-123456789-123456789-12
 
 More conventions
diff --git a/Include/objimpl.h b/Include/objimpl.h
index 25f8b94..c904cf8 100644
--- a/Include/objimpl.h
+++ b/Include/objimpl.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/opcode.h b/Include/opcode.h
index 53ce333..b6a42cc 100644
--- a/Include/opcode.h
+++ b/Include/opcode.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -119,6 +119,8 @@
 #define LOAD_LOCAL	115	/* Index in name list */
 #define LOAD_GLOBAL	116	/* Index in name list */
 
+#define SET_FUNC_ARGS	117	/* Argcount */
+
 #define SETUP_LOOP	120	/* Target address (absolute) */
 #define SETUP_EXCEPT	121	/* "" */
 #define SETUP_FINALLY	122	/* "" */
diff --git a/Include/osdefs.h b/Include/osdefs.h
index 5ff75ba..c84043f 100644
--- a/Include/osdefs.h
+++ b/Include/osdefs.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -36,7 +36,7 @@
 #define DELIM ' '
 #endif
 
-#ifdef MSDOS
+#if defined(MSDOS) || defined(NT)
 #define SEP '\\'
 #define MAXPATHLEN 256
 #define DELIM ';'
diff --git a/Include/parsetok.h b/Include/parsetok.h
index 9150cd6..b27cf4e 100644
--- a/Include/parsetok.h
+++ b/Include/parsetok.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -30,9 +30,17 @@
 
 /* Parser-tokenizer link interface */
 
-extern int parsestring PROTO((char *, grammar *, int, node **_ret));
-extern int parsefile PROTO((FILE *, char *, grammar *, int,
-					char *, char *, node **));
+typedef struct {
+	int error;
+	char *filename;
+	int lineno;
+	int offset;
+	char *text;
+} perrdetail;
+
+extern node *parsestring PROTO((char *, grammar *, int, perrdetail *));
+extern node *parsefile PROTO((FILE *, char *, grammar *, int,
+			    char *, char *, perrdetail *));
 
 #ifdef __cplusplus
 }
diff --git a/Include/pgenheaders.h b/Include/pgenheaders.h
index 8395960..8a0b079 100644
--- a/Include/pgenheaders.h
+++ b/Include/pgenheaders.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -31,9 +31,12 @@
 /* Include files and extern declarations used by most of the parser.
    This is a precompiled header for THINK C. */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #ifdef THINK_C
 #define macintosh
-/* #define THINK_C_3_0		/*** TURN THIS ON FOR THINK C 3.0 ***/
 #endif
 
 #include <stdio.h>
@@ -44,17 +47,11 @@
 #undef label
 #endif
 
-#ifdef THINK_C_3_0
-#include <proto.h>
-#endif
-
-#ifdef macintosh
-#ifndef THINK_C_3_0
+#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
 #endif
-#endif
 
-#include "PROTO.h"
+#include "myproto.h"
 #include "mymalloc.h"
 
 extern void fatal PROTO((char *));
diff --git a/Include/pyerrors.h b/Include/pyerrors.h
index 2444ee1..050ff19 100644
--- a/Include/pyerrors.h
+++ b/Include/pyerrors.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -33,7 +33,7 @@
 void err_set PROTO((object *));
 void err_setval PROTO((object *, object *));
 void err_setstr PROTO((object *, char *));
-int err_occurred PROTO((void));
+object *err_occurred PROTO((void));
 void err_get PROTO((object **, object **));
 void err_clear PROTO((void));
 
@@ -64,12 +64,13 @@
 extern int err_badarg PROTO((void));
 extern object *err_nomem PROTO((void));
 extern object *err_errno PROTO((object *));
-extern void err_input PROTO((int));
 
 extern void err_badcall PROTO((void));
 
 extern object *err_getexc PROTO((void));
 
+extern int sigcheck PROTO((void)); /* In sigcheck.c or signalmodule.c */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/pythonrun.h b/Include/pythonrun.h
index e25a3de..1f357cd 100644
--- a/Include/pythonrun.h
+++ b/Include/pythonrun.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -39,8 +39,8 @@
 int run_tty_1 PROTO((FILE *, char *));
 int run_tty_loop PROTO((FILE *, char *));
 
-int parse_string PROTO((char *, int, struct _node **));
-int parse_file PROTO((FILE *, char *, int, struct _node **));
+struct _node *parse_string PROTO((char *, int));
+struct _node *parse_file PROTO((FILE *, char *, int));
 
 object *run_string PROTO((char *, int, object *, object *));
 object *run_file PROTO((FILE *, char *, int, object *, object *));
@@ -51,6 +51,8 @@
 
 void goaway PROTO((int));
 
+void cleanup PROTO((void));
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/Include/pythread.h b/Include/pythread.h
index 806882f..680b7fb 100644
--- a/Include/pythread.h
+++ b/Include/pythread.h
@@ -1,6 +1,9 @@
 #ifndef _THREAD_H_included
 #define _THREAD_H_included
 
+#define NO_EXIT_PROG		/* don't define exit_prog() */
+				/* (the result is no use of signals on SGI) */
+
 #ifndef PROTO
 #if defined(__STDC__) || defined(__cplusplus)
 #define PROTO(args)	args
@@ -20,6 +23,7 @@
 int start_new_thread PROTO((void (*)(void *), void *));
 void exit_thread PROTO((void));
 void _exit_thread PROTO((void));
+long get_thread_ident PROTO((void));
 
 type_lock allocate_lock PROTO((void));
 void free_lock PROTO((type_lock));
@@ -33,8 +37,10 @@
 void down_sema PROTO((type_sema));
 void up_sema PROTO((type_sema));
 
+#ifndef NO_EXIT_PROG
 void exit_prog PROTO((int));
 void _exit_prog PROTO((int));
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/Include/rangeobject.h b/Include/rangeobject.h
index 39d20c6..9befd9b 100644
--- a/Include/rangeobject.h
+++ b/Include/rangeobject.h
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/rename1.h b/Include/rename1.h
index cfad02b..1e944a0 100755
--- a/Include/rename1.h
+++ b/Include/rename1.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/stringobject.h b/Include/stringobject.h
index fa2e8a1..6896a55 100644
--- a/Include/stringobject.h
+++ b/Include/stringobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -66,6 +66,7 @@
 extern unsigned int getstringsize PROTO((object *));
 extern char *getstringvalue PROTO((object *));
 extern void joinstring PROTO((object **, object *));
+extern void joinstring_decref PROTO((object **, object *));
 extern int resizestring PROTO((object **, int));
 extern object *formatstring PROTO((object *, object *));
 
diff --git a/Include/structmember.h b/Include/structmember.h
index 2462aa7..6bd9e72 100644
--- a/Include/structmember.h
+++ b/Include/structmember.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/sysmodule.h b/Include/sysmodule.h
index f6e4d08..93e3a51 100644
--- a/Include/sysmodule.h
+++ b/Include/sysmodule.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/thread.h b/Include/thread.h
index 806882f..680b7fb 100644
--- a/Include/thread.h
+++ b/Include/thread.h
@@ -1,6 +1,9 @@
 #ifndef _THREAD_H_included
 #define _THREAD_H_included
 
+#define NO_EXIT_PROG		/* don't define exit_prog() */
+				/* (the result is no use of signals on SGI) */
+
 #ifndef PROTO
 #if defined(__STDC__) || defined(__cplusplus)
 #define PROTO(args)	args
@@ -20,6 +23,7 @@
 int start_new_thread PROTO((void (*)(void *), void *));
 void exit_thread PROTO((void));
 void _exit_thread PROTO((void));
+long get_thread_ident PROTO((void));
 
 type_lock allocate_lock PROTO((void));
 void free_lock PROTO((type_lock));
@@ -33,8 +37,10 @@
 void down_sema PROTO((type_sema));
 void up_sema PROTO((type_sema));
 
+#ifndef NO_EXIT_PROG
 void exit_prog PROTO((int));
 void _exit_prog PROTO((int));
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/Include/token.h b/Include/token.h
index 6939cc8..9281773 100644
--- a/Include/token.h
+++ b/Include/token.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/traceback.h b/Include/traceback.h
index 07c0c1e..f86306d 100644
--- a/Include/traceback.h
+++ b/Include/traceback.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Include/tupleobject.h b/Include/tupleobject.h
index 9897f6d..b422a40 100644
--- a/Include/tupleobject.h
+++ b/Include/tupleobject.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Lib/UserList.py b/Lib/UserList.py
index 9fbcc02..1c8a622 100644
--- a/Lib/UserList.py
+++ b/Lib/UserList.py
@@ -1,11 +1,9 @@
 # A more or less complete user-defined wrapper around list objects
 
 class UserList:
-	def __init__(self, *args):
-		if len(args) > 1: raise TypeError, 'too many args'
+	def __init__(self, list = None):
 		self.data = []
-		if args:
-			list = args[0]
+		if list is not None:
 			if type(list) == type(self.data):
 				self.data[:] = list
 			else:
diff --git a/Lib/aifc.py b/Lib/aifc.py
index aa1e56c..c1418be 100644
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -179,7 +179,10 @@
 
 def _read_string(file):
 	length = ord(file.read(1))
-	data = file.read(length)
+	if length == 0:
+		data = ''
+	else:
+		data = file.read(length)
 	if length & 1 == 0:
 		dummy = file.read(1)
 	return data
diff --git a/Lib/audiodev.py b/Lib/audiodev.py
index d0dcfed..02d63f7 100644
--- a/Lib/audiodev.py
+++ b/Lib/audiodev.py
@@ -1,28 +1,40 @@
-import AL, SUNAUDIODEV
-
 error = 'audiodev.error'
 
 class Play_Audio_sgi:
 	# Private instance variables
 	access frameratelist, nchannelslist, sampwidthlist, oldparams, \
 		  params, config, inited_outrate, inited_width, \
-		  inited_nchannels, port, converter: private
+		  inited_nchannels, port, converter, classinited: private
 
-	frameratelist = [(48000, AL.RATE_48000),
-			 (44100, AL.RATE_44100),
-			 (32000, AL.RATE_32000),
-			 (22050, AL.RATE_22050),
-			 (16000, AL.RATE_16000),
-			 (11025, AL.RATE_11025),
-			 ( 8000,  AL.RATE_8000)]
-	nchannelslist = [(1, AL.MONO),
-			 (2, AL.STEREO)]
-	sampwidthlist = [(1, AL.SAMPLE_8),
-			 (2, AL.SAMPLE_16),
-			 (3, AL.SAMPLE_24)]
+	classinited = 0
+	frameratelist = nchannelslist = sampwidthlist = None
+
+	def initclass(self):
+		import AL
+		Play_Audio_sgi.frameratelist = [
+			  (48000, AL.RATE_48000),
+			  (44100, AL.RATE_44100),
+			  (32000, AL.RATE_32000),
+			  (22050, AL.RATE_22050),
+			  (16000, AL.RATE_16000),
+			  (11025, AL.RATE_11025),
+			  ( 8000,  AL.RATE_8000),
+			  ]
+		Play_Audio_sgi.nchannelslist = [
+			  (1, AL.MONO),
+			  (2, AL.STEREO),
+			  ]
+		Play_Audio_sgi.sampwidthlist = [
+			  (1, AL.SAMPLE_8),
+			  (2, AL.SAMPLE_16),
+			  (3, AL.SAMPLE_24),
+			  ]
+		Play_Audio_sgi.classinited = 1
 
 	def __init__(self):
-		import al
+		import al, AL
+		if not self.classinited:
+			self.initclass()
 		self.oldparams = []
 		self.params = [AL.OUTPUT_RATE, 0]
 		self.config = al.newconfig()
@@ -37,7 +49,7 @@
 		if self.port:
 			self.stop()
 		if self.oldparams:
-			import al
+			import al, AL
 			al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
 			self.oldparams = []
 
@@ -54,7 +66,7 @@
 			self.port.closeport()
 			self.port = None
 		if self.oldparams:
-			import al
+			import al, AL
 			al.setparams(AL.DEFAULT_DEVICE, self.oldparams)
 			self.oldparams = []
 
@@ -75,6 +87,7 @@
 				break
 		else:
 			if width == 0:
+				import AL
 				self.inited_width = 0
 				self.config.setwidth(AL.SAMPLE_16)
 				self.converter = self.ulaw2lin
@@ -94,7 +107,7 @@
 		if not (self.inited_outrate and self.inited_nchannels):
 			raise error, 'params not specified'
 		if not self.port:
-			import al
+			import al, AL
 			self.port = al.openport('Python', 'w', self.config)
 			self.oldparams = self.params[:]
 			al.getparams(AL.DEFAULT_DEVICE, self.oldparams)
@@ -156,7 +169,7 @@
 		if not (self.inited_outrate and self.inited_width and self.inited_nchannels):
 			raise error, 'params not specified'
 		if not self.port:
-			import sunaudiodev
+			import sunaudiodev, SUNAUDIODEV
 			self.port = sunaudiodev.open('w')
 			info = self.port.getinfo()
 			info.o_sample_rate = self.outrate
diff --git a/Lib/bdb.py b/Lib/bdb.py
index 6b3eab9..9b50767 100644
--- a/Lib/bdb.py
+++ b/Lib/bdb.py
@@ -17,6 +17,8 @@
 		self.breaks = {}
 	
 	def reset(self):
+		import linecache
+		linecache.checkcache()
 		self.botframe = None
 		self.stopframe = None
 		self.returnframe = None
@@ -134,11 +136,35 @@
 		self.returnframe = frame
 		self.quitting = 0
 	
+	def set_trace(self):
+		# Start debugging from here
+		try:
+			1 + ''
+		except:
+			frame = sys.exc_traceback.tb_frame.f_back
+		self.reset()
+		while frame:
+			frame.f_trace = self.trace_dispatch
+			self.botframe = frame
+			frame = frame.f_back
+		self.set_step()
+		sys.settrace(self.trace_dispatch)
+
 	def set_continue(self):
 		# Don't stop except at breakpoints or when finished
 		self.stopframe = self.botframe
 		self.returnframe = None
 		self.quitting = 0
+		if not self.breaks:
+			# no breakpoints; run without debugger overhead
+			sys.settrace(None)
+			try:
+				1 + ''	# raise an exception
+			except:
+				frame = sys.exc_traceback.tb_frame.f_back
+			while frame and frame is not self.botframe:
+				del frame.f_trace
+				frame = frame.f_back
 	
 	def set_quit(self):
 		self.stopframe = self.botframe
@@ -177,7 +203,7 @@
 			return 'There are no breakpoints in that file!'
 		del self.breaks[filename]
 	
-	def clear_all_breaks(self, filename, lineno):
+	def clear_all_breaks(self):
 		if not self.breaks:
 			return 'There are no breakpoints!'
 		self.breaks = {}
@@ -217,11 +243,14 @@
 	# 
 	
 	def format_stack_entry(self, frame_lineno):
-		import codehack, linecache, repr, string
+		import linecache, repr, string
 		frame, lineno = frame_lineno
 		filename = frame.f_code.co_filename
 		s = filename + '(' + `lineno` + ')'
-		s = s + codehack.getcodename(frame.f_code)
+		if frame.f_code.co_name:
+		    s = s + frame.f_code.co_name
+		else:
+		    s = s + "<lambda>"
 		if frame.f_locals.has_key('__args__'):
 			args = frame.f_locals['__args__']
 			if args is not None:
@@ -269,17 +298,19 @@
 			sys.settrace(None)
 
 
+def set_trace():
+	Bdb().set_trace()
+
 # -------------------- testing --------------------
 
 class Tdb(Bdb):
 	def user_call(self, frame, args):
-		import codehack
-		name = codehack.getcodename(frame.f_code)
+		name = frame.f_code.co_name
 		if not name: name = '???'
 		print '+++ call', name, args
 	def user_line(self, frame):
-		import linecache, string, codehack
-		name = codehack.getcodename(frame.f_code)
+		import linecache, string
+		name = frame.f_code.co_name
 		if not name: name = '???'
 		fn = frame.f_code.co_filename
 		line = linecache.getline(fn, frame.f_lineno)
@@ -300,7 +331,5 @@
 	return a/2
 
 def test():
-	import linecache
-	linecache.checkcache()
 	t = Tdb()
 	t.run('import bdb; bdb.foo(10)')
diff --git a/Lib/calendar.py b/Lib/calendar.py
index 4dfcf0c..e9b1644 100644
--- a/Lib/calendar.py
+++ b/Lib/calendar.py
@@ -106,12 +106,7 @@
 	return str
 
 # Print a month's calendar
-def prmonth(year, month, *rest):
-	if rest[2:]: raise TypeError, 'too many args'
-	w = 0
-	l = 0
-	if rest[0:]: w = rest[0]
-	if rest[1:]: l = rest[1]
+def prmonth(year, month, w = 0, l = 0):
 	w = max(2, w)
 	l = max(1, l)
 	print _center(month_name[month] + ' ' + `year`, 7*(w+1) - 1),
diff --git a/Lib/cmd.py b/Lib/cmd.py
index 87ddcfa..85115bb 100644
--- a/Lib/cmd.py
+++ b/Lib/cmd.py
@@ -56,8 +56,36 @@
 		else:
 			import newdir
 			names = newdir.dir(self.__class__)
-			cmds = []
+			cmds_doc = []
+			cmds_undoc = []
+			help = {}
+			for name in names:
+				if name[:5] == 'help_':
+					help[name[5:]]=1
 			for name in names:
 				if name[:3] == 'do_':
-					cmds.append(name[3:])
-			print cmds
+					cmd=name[3:]
+					if help.has_key(cmd):
+						cmds_doc.append(cmd)
+						del help[cmd]
+					else:
+						cmds_undoc.append(cmd)
+			print 
+			self.print_topics("Documented commands (type help " \
+		                          "<topic>):",cmds_doc, 15, 80)
+			self.print_topics("Miscellaneous help topics:",
+		                          help.keys(), 15, 80)
+			self.print_topics("Undocumented commands:", 
+		                          cmds_undoc, 15, 80)
+
+	def print_topics(self, header, cmds, cmdlen, maxcol):
+		if cmds:
+			print header;
+			print "="*len(header)
+			(cmds_per_line,junk)=divmod(maxcol,cmdlen)
+			col=cmds_per_line
+			for cmd in cmds:
+				if col==0: print
+				print (("%-"+`cmdlen`+"s") % cmd),
+				col = (col+1) % cmds_per_line
+			print "\n"
diff --git a/Lib/codehack.py b/Lib/codehack.py
index d00d2bf..1f16814 100644
--- a/Lib/codehack.py
+++ b/Lib/codehack.py
@@ -7,6 +7,10 @@
 import os
 import linecache
 
+# XXX The functions getcodename() and getfuncname() are now obsolete
+# XXX as code and function objects now have a name attribute --
+# XXX co.co_name and f.func_name.
+
 # Extract the function or class name from a code object.
 # This is a bit of a hack, since a code object doesn't contain
 # the name directly.  So what do we do:
diff --git a/Lib/dis.py b/Lib/dis.py
index cd62500..846dc32 100644
--- a/Lib/dis.py
+++ b/Lib/dis.py
@@ -135,7 +135,8 @@
 def_op('RAISE_EXCEPTION', 81)
 def_op('LOAD_LOCALS', 82)
 def_op('RETURN_VALUE', 83)
-
+def_op('LOAD_GLOBALS', 84)
+def_op('EXEC_STMT', 85)
 def_op('BUILD_FUNCTION', 86)
 def_op('POP_BLOCK', 87)
 def_op('END_FINALLY', 88)
@@ -173,6 +174,7 @@
 
 name_op('LOAD_LOCAL', 115)	# Index in name list
 name_op('LOAD_GLOBAL', 116)	# Index in name list
+def_op('SET_FUNC_ARGS', 117)	# Argcount
 
 jrel_op('SETUP_LOOP', 120)	# Distance to target address
 jrel_op('SETUP_EXCEPT', 121)	# ""
diff --git a/Lib/ftplib.py b/Lib/ftplib.py
index c441f1f..d160303 100644
--- a/Lib/ftplib.py
+++ b/Lib/ftplib.py
@@ -9,10 +9,7 @@
 # >>> from ftplib import FTP
 # >>> ftp = FTP('ftp.cwi.nl') # connect to host, default port
 # >>> ftp.login() # default, i.e.: user anonymous, passwd user@hostname
-# >>> def handle_one_line(line): # callback for ftp.retrlines
-# ...     print line
-# ... 
-# >>> ftp.retrlines('LIST', handle_one_line) # list directory contents
+# >>> ftp.retrlines('LIST') # list directory contents
 # total 43
 # d--x--x--x   2 root     root         512 Jul  1 16:50 bin
 # d--x--x--x   2 root     root         512 Sep 16  1991 etc
@@ -20,7 +17,7 @@
 # drwxr-srwt  15 root     ftp        10240 Nov  5 20:43 pub
 # >>> ftp.quit()
 #
-# To download a file, use ftp.retrlines('RETR ' + filename, handle_one_line),
+# To download a file, use ftp.retrlines('RETR ' + filename),
 # or ftp.retrbinary() with slightly different arguments.
 # To upload a file, use ftp.storlines() or ftp.storbinary(), which have
 # an open file as argument.
@@ -30,9 +27,14 @@
 
 import os
 import sys
-import socket
 import string
 
+# Import SOCKS module if it exists, else standard socket module socket
+try:
+    import SOCKS; socket = SOCKS
+except ImportError:
+    import socket
+
 
 # Magic number from <socket.h>
 MSG_OOB = 0x1				# Process data out of band
@@ -59,14 +61,6 @@
 CRLF = '\r\n'
 
 
-# Next port to be used by makeport(), with PORT_OFFSET added
-# (This is now only used when the python interpreter doesn't support
-# the getsockname() method yet)
-nextport = 0
-PORT_OFFSET = 40000
-PORT_CYCLE = 1000
-
-
 # The class itself
 class FTP:
 
@@ -74,7 +68,7 @@
 	# Initialize host to localhost, port to standard ftp port
 	# Optional arguments are host (for connect()),
 	# and user, passwd, acct (for login())
-	def __init__(self, *args):
+	def __init__(self, host = '', user = '', passwd = '', acct = ''):
 		# Initialize the instance to something mostly harmless
 		self.debugging = 0
 		self.host = ''
@@ -82,18 +76,16 @@
 		self.sock = None
 		self.file = None
 		self.welcome = None
-		if args:
-			self.connect(args[0])
-			if args[1:]:
-				apply(self.login, args[1:])
+		if host:
+			self.connect(host)
+			if user: self.login(user, passwd, acct)
 
 	# Connect to host.  Arguments:
 	# - host: hostname to connect to (default previous host)
 	# - port: port to connect to (default previous port)
-	def connect(self, *args):
-		if args: self.host = args[0]
-		if args[1:]: self.port = args[1]
-		if args[2:]: raise TypeError, 'too many args'
+	def connect(self, host = '', port = 0):
+		if host: self.host = host
+		if port: self.port = port
 		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 		self.sock.connect(self.host, self.port)
 		self.file = self.sock.makefile('r')
@@ -208,19 +200,8 @@
 	def makeport(self):
 		global nextport
 		sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
-		try:
-			getsockname = sock.getsockname
-		except AttributeError:
-			if self.debugging > 1:
-				print '*** getsockname not supported',
-				print '-- using manual port assignment ***'
-			port = nextport + PORT_OFFSET
-			nextport = (nextport + 1) % PORT_CYCLE
-			sock.bind('', port)
-			getsockname = None
-		sock.listen(0) # Assigns the port if not explicitly bound
-		if getsockname:
-			host, port = getsockname()
+		sock.listen(1)
+		host, port = sock.getsockname()
 		resp = self.sendport(port)
 		return sock
 
@@ -235,13 +216,7 @@
 		return conn
 
 	# Login, default anonymous
-	def login(self, *args):
-		user = passwd = acct = ''
-		n = len(args)
-		if n > 3: raise TypeError, 'too many arguments'
-		if n > 0: user = args[0]
-		if n > 1: passwd = args[1]
-		if n > 2: acct = args[2]
+	def login(self, user = '', passwd = '', acct = ''):
 		if not user: user = 'anonymous'
 		if user == 'anonymous' and passwd in ('', '-'):
 			thishost = socket.gethostname()
@@ -278,11 +253,7 @@
 	# The callback function is called for each line, with trailing
 	# CRLF stripped.  This creates a new port for you.
 	# print_lines is the default callback 
-	def retrlines(self, cmd, *args):
-		callback = None
-		if args:
-			callback = args[0]
-			if args[1:]: raise TypeError, 'too many args'
+	def retrlines(self, cmd, callback = None):
 		if not callback: callback = print_line
 		resp = self.sendcmd('TYPE A')
 		conn = self.transfercmd(cmd)
@@ -423,30 +394,22 @@
 # Usage: ftp [-d] host [-l[dir]] [-d[dir]] [file] ...
 def test():
 	import marshal
-	global nextport
-	try:
-		nextport = marshal.load(open('.@nextport', 'r'))
-	except IOError:
-		pass
-	try:
-		debugging = 0
-		while sys.argv[1] == '-d':
-			debugging = debugging+1
-			del sys.argv[1]
-		host = sys.argv[1]
-		ftp = FTP(host)
-		ftp.set_debuglevel(debugging)
-		ftp.login()
-		for file in sys.argv[2:]:
-			if file[:2] == '-l':
-				ftp.dir(file[2:])
-			elif file[:2] == '-d':
-				cmd = 'CWD'
-				if file[2:]: cmd = cmd + ' ' + file[2:]
-				resp = ftp.sendcmd(cmd)
-			else:
-				ftp.retrbinary('RETR ' + file, \
-					       sys.stdout.write, 1024)
-		ftp.quit()
-	finally:
-		marshal.dump(nextport, open('.@nextport', 'w'))
+	debugging = 0
+	while sys.argv[1] == '-d':
+		debugging = debugging+1
+		del sys.argv[1]
+	host = sys.argv[1]
+	ftp = FTP(host)
+	ftp.set_debuglevel(debugging)
+	ftp.login()
+	for file in sys.argv[2:]:
+		if file[:2] == '-l':
+			ftp.dir(file[2:])
+		elif file[:2] == '-d':
+			cmd = 'CWD'
+			if file[2:]: cmd = cmd + ' ' + file[2:]
+			resp = ftp.sendcmd(cmd)
+		else:
+			ftp.retrbinary('RETR ' + file, \
+				       sys.stdout.write, 1024)
+	ftp.quit()
diff --git a/Lib/irix5/FCNTL.py b/Lib/irix5/FCNTL.py
index 1271b9e..12c60fa 100755
--- a/Lib/irix5/FCNTL.py
+++ b/Lib/irix5/FCNTL.py
@@ -1,35 +1,35 @@
-# These lines were generated by h2py.py (see demo/scripts)
-# from <sys/fcntl.h> on Irix 4.0.2.
-# The applicability on other systems is not clear.
-
+# Generated by h2py from /usr/include/sys/fcntl.h
 FNDELAY = 0x04
 FAPPEND = 0x08
 FSYNC = 0x10
-FRCACH = 0x20
-FASYNC = 0x40
-FNONBLK = 0x80
-FCREAT = 0x100
-FTRUNC = 0x200
-FEXCL = 0x400
-FNOCTTY = 0x800
+FNONBLOCK = 0x80
+FASYNC = 0x1000
+FNONBLK = FNONBLOCK
+FDIRECT = 0x8000
+FCREAT = 0x0100
+FTRUNC = 0x0200
+FEXCL = 0x0400
+FNOCTTY = 0x0800
 O_RDONLY = 0
 O_WRONLY = 1
 O_RDWR = 2
-O_ACCMODE = 0x3
-O_NDELAY = FNDELAY
-O_APPEND = FAPPEND
-O_SYNC = FSYNC
-O_NONBLOCK = FNONBLK
-O_CREAT = FCREAT
-O_TRUNC = FTRUNC
-O_EXCL = FEXCL
-O_NOCTTY = FNOCTTY
+O_NDELAY = 0x04
+O_APPEND = 0x08
+O_SYNC = 0x10
+O_NONBLOCK = 0x80
+O_DIRECT = 0x8000
+O_CREAT = 0x100
+O_TRUNC = 0x200
+O_EXCL = 0x400
+O_NOCTTY = 0x800
 F_DUPFD = 0
 F_GETFD = 1
 F_SETFD = 2
 F_GETFL = 3
 F_SETFL = 4
-F_GETLK = 5
+F_GETLK = 14
+F_O_GETLK = 5
+F_GETLK = 14
 F_SETLK = 6
 F_SETLKW = 7
 F_CHKFL = 8
@@ -37,13 +37,17 @@
 F_FREESP = 11
 F_SETBSDLK = 12
 F_SETBSDLKW = 13
-F_RGETLK = 20
-F_RSETLK = 21
+F_DIOINFO = 30
+F_RSETLK = 20
+F_RGETLK = 21
 F_RSETLKW = 22
-F_GETOWN = 10
-F_SETOWN = 11
+F_GETOWN = 23
+F_SETOWN = 24
+F_O_GETOWN = 10
+F_O_SETOWN = 11
 F_RDLCK = 01
 F_WRLCK = 02
 F_UNLCK = 03
-FD_CLOEXEC = 0x1
-FD_NODUP_FORK = 0x2
+O_ACCMODE = 3
+FD_CLOEXEC = 1
+FD_NODUP_FORK = 4
diff --git a/Lib/irix5/IN.py b/Lib/irix5/IN.py
index 78be3ef..325a021 100755
--- a/Lib/irix5/IN.py
+++ b/Lib/irix5/IN.py
@@ -1,8 +1,4 @@
-# Symbolic constants from <netinet/in.h>.
-# These constants are SGI specific!
-# See demo/scripts/h2py.py for a tool to help generate a version for
-# your system.
-
+# Generated by h2py from /usr/include/netinet/in.h
 IPPROTO_IP = 0
 IPPROTO_ICMP = 1
 IPPROTO_IGMP = 2
@@ -14,6 +10,8 @@
 IPPROTO_IDP = 22
 IPPROTO_TP = 29
 IPPROTO_XTP = 36
+IPPROTO_HELLO = 63
+IPPROTO_ND = 77
 IPPROTO_EON = 80
 IPPROTO_RAW = 255
 IPPROTO_MAX = 256
@@ -42,6 +40,11 @@
 INADDR_NONE = 0xffffffff
 IN_LOOPBACKNET = 127
 IP_OPTIONS = 1
+IP_MULTICAST_IF = 2
+IP_MULTICAST_TTL = 3
+IP_MULTICAST_LOOP = 4
+IP_ADD_MEMBERSHIP = 5
+IP_DROP_MEMBERSHIP = 6
 IP_HDRINCL = 7
 IP_TOS = 8
 IP_TTL = 9
@@ -49,11 +52,32 @@
 IP_RECVRETOPTS = 11
 IP_RECVDSTADDR = 12
 IP_RETOPTS = 13
-IP_MULTICAST_IF = 2
-IP_MULTICAST_TTL = 3
-IP_MULTICAST_LOOP = 4
-IP_ADD_MEMBERSHIP = 5
-IP_DROP_MEMBERSHIP = 6
+IP_OPTIONS = 1
+IP_HDRINCL = 2
+IP_TOS = 3
+IP_TTL = 4
+IP_RECVOPTS = 5
+IP_RECVRETOPTS = 6
+IP_RECVDSTADDR = 7
+IP_RETOPTS = 8
+IP_MULTICAST_IF = 20
+IP_MULTICAST_TTL = 21
+IP_MULTICAST_LOOP = 22
+IP_ADD_MEMBERSHIP = 23
+IP_DROP_MEMBERSHIP = 24
+IRIX4_IP_OPTIONS = 1
+IRIX4_IP_MULTICAST_IF = 2
+IRIX4_IP_MULTICAST_TTL = 3
+IRIX4_IP_MULTICAST_LOOP = 4
+IRIX4_IP_ADD_MEMBERSHIP = 5
+IRIX4_IP_DROP_MEMBERSHIP = 6
+IRIX4_IP_HDRINCL = 7
+IRIX4_IP_TOS = 8
+IRIX4_IP_TTL = 9
+IRIX4_IP_RECVOPTS = 10
+IRIX4_IP_RECVRETOPTS = 11
+IRIX4_IP_RECVDSTADDR = 12
+IRIX4_IP_RETOPTS = 13
 IP_DEFAULT_MULTICAST_TTL = 1
 IP_DEFAULT_MULTICAST_LOOP = 1
 IP_MAX_MEMBERSHIPS = 20
diff --git a/Lib/irix5/SOCKET.py b/Lib/irix5/SOCKET.py
index 8a15ef9..0ba0742 100755
--- a/Lib/irix5/SOCKET.py
+++ b/Lib/irix5/SOCKET.py
@@ -1,8 +1,23 @@
+# Generated by h2py from /usr/include/sys/socket.h
 SOCK_STREAM = 1
 SOCK_DGRAM = 2
 SOCK_RAW = 3
 SOCK_RDM = 4
 SOCK_SEQPACKET = 5
+NC_TPI_CLTS = 1
+NC_TPI_COTS = 2
+NC_TPI_COTS_ORD = 3
+NC_TPI_RAW = 4
+SOCK_DGRAM = NC_TPI_CLTS
+SOCK_STREAM = NC_TPI_COTS
+SOCK_RAW = NC_TPI_RAW
+SOCK_RDM = 5
+SOCK_SEQPACKET = 6
+IRIX4_SOCK_STREAM = 1
+IRIX4_SOCK_DGRAM = 2
+IRIX4_SOCK_RAW = 3
+IRIX4_SOCK_RDM = 4
+IRIX4_SOCK_SEQPACKET = 5
 SO_DEBUG = 0x0001
 SO_ACCEPTCONN = 0x0002
 SO_REUSEADDR = 0x0004
@@ -13,6 +28,9 @@
 SO_LINGER = 0x0080
 SO_OOBINLINE = 0x0100
 SO_REUSEPORT = 0x0200
+SO_ORDREL = 0x0200
+SO_IMASOCKET = 0x0400
+SO_CHAMELEON = 0x1000
 SO_SNDBUF = 0x1001
 SO_RCVBUF = 0x1002
 SO_SNDLOWAT = 0x1003
@@ -21,6 +39,7 @@
 SO_RCVTIMEO = 0x1006
 SO_ERROR = 0x1007
 SO_TYPE = 0x1008
+SO_PROTOTYPE = 0x1009
 SOL_SOCKET = 0xffff
 AF_UNSPEC = 0
 AF_UNIX = 1
@@ -30,7 +49,6 @@
 AF_CHAOS = 5
 AF_NS = 6
 AF_ISO = 7
-AF_OSI = AF_ISO
 AF_ECMA = 8
 AF_DATAKIT = 9
 AF_CCITT = 10
@@ -44,7 +62,14 @@
 AF_RAW = 18
 AF_LINK = 18
 pseudo_AF_XTP = 19
-AF_MAX = 20
+AF_NIT = 17
+AF_802 = 18
+AF_OSI = 19
+AF_X25 = 20
+AF_OSINET = 21
+AF_GOSIP = 22
+AF_SDL = 23
+AF_MAX = (AF_SDL+1)
 PF_UNSPEC = AF_UNSPEC
 PF_UNIX = AF_UNIX
 PF_INET = AF_INET
@@ -53,7 +78,6 @@
 PF_CHAOS = AF_CHAOS
 PF_NS = AF_NS
 PF_ISO = AF_ISO
-PF_OSI = AF_ISO
 PF_ECMA = AF_ECMA
 PF_DATAKIT = AF_DATAKIT
 PF_CCITT = AF_CCITT
@@ -67,11 +91,18 @@
 PF_LINK = AF_LINK
 PF_XTP = pseudo_AF_XTP
 PF_RAW = AF_RAW
+PF_NIT = AF_NIT
+PF_802 = AF_802
+PF_OSI = AF_OSI
+PF_X25 = AF_X25
+PF_OSINET = AF_OSINET
+PF_GOSIP = AF_GOSIP
 PF_MAX = AF_MAX
 SOMAXCONN = 5
 MSG_OOB = 0x1
 MSG_PEEK = 0x2
 MSG_DONTROUTE = 0x4
+MSG_EOR = 0x8
 MSG_BTAG = 0x40
 MSG_ETAG = 0x80
 MSG_MAXIOVLEN = 16
diff --git a/Lib/irix5/cddb.py b/Lib/irix5/cddb.py
index d7fdc96..0dee709 100755
--- a/Lib/irix5/cddb.py
+++ b/Lib/irix5/cddb.py
@@ -138,6 +138,19 @@
 					continue
 				self.track[trackno] = value
 		f.close()
+		for i in range(2, len(self.track)):
+			track = self.track[i]
+			# if track title starts with `,', use initial part
+			# of previous track's title
+			if track[0] == ',':
+				try:
+					off = string.index(self.track[i - 1],
+							   ',')
+				except string.index_error:
+					pass
+				else:
+					self.track[i] = self.track[i-1][:off] \
+							+ track
 
 	def write(self):
 		import posixpath
@@ -153,6 +166,17 @@
 		f.write('album.title:\t' + self.title + '\n')
 		f.write('album.artist:\t' + self.artist + '\n')
 		f.write('album.toc:\t' + self.toc + '\n')
+		prevpref = None
 		for i in range(1, len(self.track)):
-			f.write('track' + `i` + '.title:\t' + self.track[i] + '\n')
+			track = self.track[i]
+			try:
+				off = string.index(track, ',')
+			except string.index_error:
+				prevpref = None
+			else:
+				if prevpref and track[:off] == prevpref:
+					track = track[off:]
+				else:
+					prevpref = track[:off]
+			f.write('track' + `i` + '.title:\t' + track + '\n')
 		f.close()
diff --git a/Lib/irix5/flp.py b/Lib/irix5/flp.py
index c3f6f3b..bc4a8ab 100755
--- a/Lib/irix5/flp.py
+++ b/Lib/irix5/flp.py
@@ -432,10 +432,10 @@
 
 def test():
     import time
-    t0 = time.millitimer()
+    t0 = time.time()
     if len(sys.argv) == 2:
 	forms = parse_forms(sys.argv[1])
-	t1 = time.millitimer()
+	t1 = time.time()
 	print 'parse time:', 0.001*(t1-t0), 'sec.'
 	keys = forms.keys()
 	keys.sort()
@@ -443,8 +443,8 @@
 	    _printform(forms[i])
     elif len(sys.argv) == 3:
 	form = parse_form(sys.argv[1], sys.argv[2])
-	t1 = time.millitimer()
-	print 'parse time:', 0.001*(t1-t0), 'sec.'
+	t1 = time.time()
+	print 'parse time:', round(t1-t0, 3), 'sec.'
 	_printform(form)
     else:
 	print 'Usage: test fdfile [form]'
diff --git a/Lib/lib-old/codehack.py b/Lib/lib-old/codehack.py
index d00d2bf..1f16814 100644
--- a/Lib/lib-old/codehack.py
+++ b/Lib/lib-old/codehack.py
@@ -7,6 +7,10 @@
 import os
 import linecache
 
+# XXX The functions getcodename() and getfuncname() are now obsolete
+# XXX as code and function objects now have a name attribute --
+# XXX co.co_name and f.func_name.
+
 # Extract the function or class name from a code object.
 # This is a bit of a hack, since a code object doesn't contain
 # the name directly.  So what do we do:
diff --git a/Lib/lib-old/newdir.py b/Lib/lib-old/newdir.py
index 26a7df0..937c49e 100644
--- a/Lib/lib-old/newdir.py
+++ b/Lib/lib-old/newdir.py
@@ -65,11 +65,9 @@
 # Approximation of builtin dir(); but note that this lists the user's
 # variables by default, not the current local name space.
 
-def dir(*args):
-	if len(args) > 0:
-		if len(args) == 1:
-			args = args[0]
-		return listattrs(args)
+def dir(x = None):
+	if x is not None:
+		return listattrs(x)
 	else:
 		import __main__
 		return listattrs(__main__)
diff --git a/Lib/lib-old/packmail.py b/Lib/lib-old/packmail.py
index d612c88..13b1bdc 100644
--- a/Lib/lib-old/packmail.py
+++ b/Lib/lib-old/packmail.py
@@ -41,12 +41,28 @@
 # Pack all files from a directory
 def packall(outfp, dirname):
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	names.sort()
 	packsome(outfp, dirname, names)
 
 # Pack all files from a directory that are not older than a give one
 def packnotolder(outfp, dirname, oldest):
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	oldest = os.path.join(dirname, oldest)
 	st = os.stat(oldest)
 	mtime = st[ST_MTIME]
@@ -67,6 +83,14 @@
 	print 'packtree', dirname
 	outfp.write('mkdir ' + unixfix(dirname) + '\n')
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	subdirs = []
 	for name in names:
 		fullname = os.path.join(dirname, name)
diff --git a/Lib/lib-stdwin/WindowSched.py b/Lib/lib-stdwin/WindowSched.py
index 56ca6f8..b2fbe76 100644
--- a/Lib/lib-stdwin/WindowSched.py
+++ b/Lib/lib-stdwin/WindowSched.py
@@ -1,5 +1,5 @@
 # Combine a real-time scheduling queue and stdwin event handling.
-# Uses the millisecond timer.
+# Keeps times in milliseconds.
 
 import stdwin, stdwinq
 from stdwinevents import WE_TIMER
@@ -19,11 +19,11 @@
 		mainloop.dispatch(event)
 		return
 	#
-	# Use millisleep for very short delays or if there are no windows
+	# Use sleep for very short delays or if there are no windows
 	#
 	if msecs < 100 or mainloop.countwindows() == 0:
 		if msecs > 0:
-			time.millisleep(msecs)
+			time.sleep(msecs * 0.001)
 		return
 	#
 	# Post a timer event on an arbitrary window and wait for it
@@ -35,7 +35,10 @@
 	if event[0] <> WE_TIMER:
 		mainloop.dispatch(event)
 
-q = sched.scheduler(time.millitimer, delayfunc)
+def millitimer():
+	return int(1000 * time.time())
+
+q = sched.scheduler(millitimer, delayfunc)
 
 # Export functions enter, enterabs and cancel just like a scheduler
 #
diff --git a/Lib/lib-stdwin/filewin.py b/Lib/lib-stdwin/filewin.py
index a03c3f7..df6aa7d 100644
--- a/Lib/lib-stdwin/filewin.py
+++ b/Lib/lib-stdwin/filewin.py
@@ -2,19 +2,19 @@
 # File windows, a subclass of textwin (which is a subclass of gwin)
 
 import textwin
-import builtin
+import __builtin__
 
 
 # FILE WINDOW
 
 def open_readonly(fn): # Open a file window
-	fp = builtin.open(fn, 'r')
+	fp = __builtin__.open(fn, 'r')
 	w = textwin.open_readonly(fn, fp.read())
 	w.fn = fn
 	return w
 
 def open(fn): # Open a file window
-	fp = builtin.open(fn, 'r')
+	fp = __builtin__.open(fn, 'r')
 	w = textwin.open(fn, fp.read())
 	w.fn = fn
 	return w
diff --git a/Lib/lib-stdwin/wdb.py b/Lib/lib-stdwin/wdb.py
index d5c28bb..4018ab1 100644
--- a/Lib/lib-stdwin/wdb.py
+++ b/Lib/lib-stdwin/wdb.py
@@ -241,7 +241,7 @@
 			stdwin.fleep()
 	
 	def draw(self, detail):
-		import linecache, codehack, string
+		import linecache, string
 		d = self.win.begindrawing()
 		try:
 			h, v = 0, 0
@@ -252,7 +252,7 @@
 				else:
 					s = '  '
 				s = s + fn + '(' + `lineno` + ')'
-				s = s + codehack.getcodename(f.f_code)
+				s = s + f.f_code.co_name
 				if f.f_locals.has_key('__args__'):
 					args = f.f_locals['__args__']
 					if args is not None:
@@ -286,6 +286,8 @@
 	try: apply(x.runcall, args)
 	finally: x.close()
 
+def set_trace():
+	Wdb().set_trace()
 
 # Post-Mortem interface
 
@@ -304,6 +306,4 @@
 TESTCMD = 'import x; x.main()'
 
 def test():
-	import linecache
-	linecache.checkcache()
 	run(TESTCMD)
diff --git a/Lib/mimetools.py b/Lib/mimetools.py
index 2a076f0..2844fa4 100644
--- a/Lib/mimetools.py
+++ b/Lib/mimetools.py
@@ -1,8 +1,10 @@
 # Various tools used by MIME-reading or MIME-writing programs.
 
 
-import string
+import os
 import rfc822
+import string
+import tempfile
 
 
 # A derived class of rfc822.Message that knows about MIME headers and
@@ -67,7 +69,7 @@
 	def getencoding(self):
 		if self.encodingheader == None:
 			return '7bit'
-		return self.encodingheader
+		return string.lower(self.encodingheader)
 
 	def gettype(self):
 		return self.type
@@ -110,3 +112,75 @@
 	timestamp = `int(time.time())`
 	seed = `rand.rand()`
 	return _prefix + '.' + timestamp + '.' + seed
+
+
+# Subroutines for decoding some common content-transfer-types
+
+# XXX This requires that uudecode and mmencode are in $PATH
+
+def decode(input, output, encoding):
+	if decodetab.has_key(encoding):
+		pipethrough(input, decodetab[encoding], output)
+	else:
+		raise ValueError, \
+		      'unknown Content-Transfer-Encoding: %s' % encoding
+
+def encode(input, output, encoding):
+	if encodetab.has_key(encoding):
+		pipethrough(input, encodetab[encoding], output)
+	else:
+		raise ValueError, \
+		      'unknown Content-Transfer-Encoding: %s' % encoding
+
+uudecode_pipe = '''(
+TEMP=/tmp/@uu.$$
+sed "s%^begin [0-7][0-7]* .*%begin 600 $TEMP%" | uudecode
+cat $TEMP
+rm $TEMP
+)'''
+
+decodetab = {
+	'uuencode':		uudecode_pipe,
+	'x-uuencode':		uudecode_pipe,
+	'quoted-printable':	'mmencode -u -q',
+	'base64':		'mmencode -u -b',
+}
+
+encodetab = {
+	'x-uuencode':		'uuencode tempfile',
+	'uuencode':		'uuencode tempfile',
+	'quoted-printable':	'mmencode -q',
+	'base64':		'mmencode -b',
+}
+
+def pipeto(input, command):
+	pipe = os.popen(command, 'w')
+	copyliteral(input, pipe)
+	pipe.close()
+
+def pipethrough(input, command, output):
+	tempname = tempfile.mktemp()
+	try:
+		temp = open(tempname, 'w')
+	except IOError:
+		print '*** Cannot create temp file', `tempname`
+		return
+	copyliteral(input, temp)
+	temp.close()
+	pipe = os.popen(command + ' <' + tempname, 'r')
+	copybinary(pipe, output)
+	pipe.close()
+	os.unlink(tempname)
+
+def copyliteral(input, output):
+	while 1:
+		line = input.readline()
+		if not line: break
+		output.write(line)
+
+def copybinary(input, output):
+	BUFSIZE = 8192
+	while 1:
+		line = input.read(BUFSIZE)
+		if not line: break
+		output.write(line)
diff --git a/Lib/multifile.py b/Lib/multifile.py
index 7a52ab6..71e0dd0 100644
--- a/Lib/multifile.py
+++ b/Lib/multifile.py
@@ -85,6 +85,17 @@
 			err('*** Missing endmarker in MultiFile.readline()\n')
 		return ''
 	#
+	def readlines(self):
+		list = []
+		while 1:
+			line = self.readline()
+			if not line: break
+			list.append(line)
+		return list
+	#
+	def read(self): # Note: no size argument -- read until EOF only!
+		return string.joinfields(self.readlines(), '')
+	#
 	def next(self):
 		while self.readline(): pass
 		if self.level > 1 or self.last:
diff --git a/Lib/newdir.py b/Lib/newdir.py
index 26a7df0..937c49e 100644
--- a/Lib/newdir.py
+++ b/Lib/newdir.py
@@ -65,11 +65,9 @@
 # Approximation of builtin dir(); but note that this lists the user's
 # variables by default, not the current local name space.
 
-def dir(*args):
-	if len(args) > 0:
-		if len(args) == 1:
-			args = args[0]
-		return listattrs(args)
+def dir(x = None):
+	if x is not None:
+		return listattrs(x)
 	else:
 		import __main__
 		return listattrs(__main__)
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index e7f0627..fb08b0c 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -60,10 +60,7 @@
 	# - host: hostname to connect to
 	# - port: port to connect to (default the standard NNTP port)
 
-	def __init__(self, host, *args):
-		if len(args) > 1: raise TypeError, 'too many args'
-		if args: port = args[0]
-		else: port = NNTP_PORT
+	def __init__(self, host, port = NNTP_PORT):
 		self.host = host
 		self.port = port
 		self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
diff --git a/Lib/ospath.py b/Lib/ospath.py
index 866d02e..1e66759 100644
--- a/Lib/ospath.py
+++ b/Lib/ospath.py
@@ -1,15 +1,3 @@
-# ospath.py is to {posix,mac}path.py what os.py is to modules {posix,mac}
-
-try:
-	import posix
-	name = 'posix'
-	del posix
-except ImportError:
-	import mac
-	name = 'mac'
-	del mac
-
-if name == 'posix':
-	from posixpath import *
-elif name == 'mac':
-	from macpath import *
+# ospath.py is obsolete
+import os
+exec 'from %s import *' % os.name
diff --git a/Lib/packmail.py b/Lib/packmail.py
index d612c88..13b1bdc 100644
--- a/Lib/packmail.py
+++ b/Lib/packmail.py
@@ -41,12 +41,28 @@
 # Pack all files from a directory
 def packall(outfp, dirname):
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	names.sort()
 	packsome(outfp, dirname, names)
 
 # Pack all files from a directory that are not older than a give one
 def packnotolder(outfp, dirname, oldest):
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	oldest = os.path.join(dirname, oldest)
 	st = os.stat(oldest)
 	mtime = st[ST_MTIME]
@@ -67,6 +83,14 @@
 	print 'packtree', dirname
 	outfp.write('mkdir ' + unixfix(dirname) + '\n')
 	names = os.listdir(dirname)
+	try:
+	    names.remove('.')
+	except:
+	    pass
+	try:
+	    names.remove('..')
+	except:
+	    pass
 	subdirs = []
 	for name in names:
 		fullname = os.path.join(dirname, name)
diff --git a/Lib/pdb.doc b/Lib/pdb.doc
index c92b572..43a91c2 100644
--- a/Lib/pdb.doc
+++ b/Lib/pdb.doc
@@ -61,9 +61,10 @@
 	Move the current frame one level up in the stack trace
 	(to a newer frame).
 
-b(reak) [lineno]
-	With a line number argument, set a break there in the current file.
-	Without argument, list all breaks.
+b(reak) [lineno | function]
+	With a line number argument, set a break there in the current
+	file.  With a function name, set a break at the entry of that
+	function.  Without argument, list all breaks.
 
 cl(ear) [lineno]
 	With a line number argument, clear that break in the current file.
diff --git a/Lib/pdb.py b/Lib/pdb.py
index 64451d5..a77dd29 100755
--- a/Lib/pdb.py
+++ b/Lib/pdb.py
@@ -74,17 +74,31 @@
 	# Return true to exit from the command loop 
 	
 	do_h = cmd.Cmd.do_help
-	
+
 	def do_break(self, arg):
 		if not arg:
 			print self.get_all_breaks() # XXX
 			return
-		try:
+		# Try line number as argument
+		try:	
 			lineno = int(eval(arg))
+			filename = self.curframe.f_code.co_filename
 		except:
-			print '*** Error in argument:', `arg`
-			return
-		filename = self.curframe.f_code.co_filename
+			# Try function name as the argument
+			import codehack
+			try:
+				func = eval(arg, self.curframe.f_globals,
+					    self.curframe.f_locals)
+				if hasattr(func, 'im_func'):
+					func = func.im_func
+				code = func.func_code
+			except:
+				print '*** Could not eval argument:', arg
+				return
+			lineno = codehack.getlineno(code)
+			filename = code.co_filename
+
+		# now set the break point
 		err = self.set_break(filename, lineno)
 		if err: print '***', err
 	do_b = do_break
@@ -159,10 +173,10 @@
 	do_q = do_quit
 	
 	def do_args(self, arg):
-		if self.curframe.f_locals.has_key('__return__'):
-			print `self.curframe.f_locals['__return__']`
+		if self.curframe.f_locals.has_key('__args__'):
+			print `self.curframe.f_locals['__args__']`
 		else:
-			print '*** Not arguments?!'
+			print '*** No arguments?!'
 	do_a = do_args
 	
 	def do_retval(self, arg):
@@ -229,7 +243,6 @@
 	do_l = do_list
 
 	def do_whatis(self, arg):
-		import codehack
 		try:
 			value = eval(arg, self.curframe.f_globals, \
 					self.curframe.f_locals)
@@ -241,13 +254,13 @@
 		try: code = value.func_code
 		except: pass
 		if code:
-			print 'Function', codehack.getcodename(code)
+			print 'Function', code.co_name
 			return
 		# Is it an instance method?
 		try: code = value.im_func.func_code
 		except: pass
 		if code:
-			print 'Method', codehack.getcodename(code)
+			print 'Method', code.co_name
 			return
 		# None of the above...
 		print type(value)
@@ -276,6 +289,137 @@
 		print self.format_stack_entry(frame_lineno)
 
 
+	# Help methods (derived from pdb.doc)
+
+	def help_help(self):
+		self.help_h()
+
+	def help_h(self):
+		print """h(elp)
+	Without argument, print the list of available commands.
+	With a command name as argument, print help about that command
+	"help pdb" pipes the full documentation file to the $PAGER
+	"help exec" gives help on the ! command"""
+
+	def help_where(self):
+		self.help_w()
+
+	def help_w(self):
+		print """w(here)
+	Print a stack trace, with the most recent frame at the bottom.
+	An arrow indicates the "current frame", which determines the
+	context of most commands."""
+
+	def help_down(self):
+		self.help_d()
+
+	def help_d(self):
+		print """d(own)
+	Move the current frame one level down in the stack trace
+	(to an older frame)."""
+
+	def help_up(self):
+		self.help_u()
+
+	def help_u(self):
+		print """u(p)
+	Move the current frame one level up in the stack trace
+	(to a newer frame)."""
+
+	def help_break(self):
+		self.help_b()
+
+	def help_b(self):
+		print """b(reak) [lineno | function]
+	With a line number argument, set a break there in the current
+	file.  With a function name, set a break at the entry of that
+	function.  Without argument, list all breaks."""
+
+	def help_clear(self):
+		self.help_cl()
+
+	def help_cl(self):
+		print """cl(ear) [lineno]
+	With a line number argument, clear that break in the current file.
+	Without argument, clear all breaks (but first ask confirmation)."""
+
+	def help_step(self):
+		self.help_s()
+
+	def help_s(self):
+		print """s(tep)
+	Execute the current line, stop at the first possible occasion
+	(either in a function that is called or in the current function)."""
+
+	def help_next(self):
+		self.help_n()
+
+	def help_n(self):
+		print """n(ext)
+	Continue execution until the next line in the current function
+	is reached or it returns."""
+
+	def help_return(self):
+		self.help_r()
+
+	def help_r(self):
+		print """r(eturn)
+	Continue execution until the current function returns."""
+
+	def help_continue(self):
+		self.help_c()
+
+	def help_cont(self):
+		self.help_c()
+
+	def help_c(self):
+		print """c(ont(inue))
+	Continue execution, only stop when a breakpoint is encountered."""
+
+	def help_list(self):
+		self.help_l()
+
+	def help_l(self):
+		print """l(ist) [first [,last]]
+	List source code for the current file.
+	Without arguments, list 11 lines around the current line
+	or continue the previous listing.
+	With one argument, list 11 lines starting at that line.
+	With two arguments, list the given range;
+	if the second argument is less than the first, it is a count."""
+
+	def help_args(self):
+		self.help_a()
+
+	def help_a(self):
+		print """a(rgs)
+	Print the argument list of the current function."""
+
+	def help_p(self):
+		print """p expression
+	Print the value of the expression."""
+
+	def help_exec(self):
+		print """(!) statement
+	Execute the (one-line) statement in the context of
+	the current stack frame.
+	The exclamation point can be omitted unless the first word
+	of the statement resembles a debugger command.
+	To assign to a global variable you must always prefix the
+	command with a 'global' command, e.g.:
+	(Pdb) global list_options; list_options = ['-l']
+	(Pdb)"""
+
+	def help_quit(self):
+		self.help_q()
+
+	def help_q(self):
+		print """q(uit)	Quit from the debugger.
+	The program being executed is aborted."""
+
+	def help_pdb(self):
+		help()
+
 # Simplified interface
 
 def run(statement):
@@ -287,6 +431,8 @@
 def runcall(*args):
 	apply(Pdb().runcall, args)
 
+def set_trace():
+	Pdb().set_trace()
 
 # Post-Mortem interface
 
@@ -306,8 +452,6 @@
 TESTCMD = 'import x; x.main()'
 
 def test():
-	import linecache
-	linecache.checkcache()
 	run(TESTCMD)
 
 # print help
diff --git a/Lib/plat-irix5/FCNTL.py b/Lib/plat-irix5/FCNTL.py
index 1271b9e..12c60fa 100755
--- a/Lib/plat-irix5/FCNTL.py
+++ b/Lib/plat-irix5/FCNTL.py
@@ -1,35 +1,35 @@
-# These lines were generated by h2py.py (see demo/scripts)
-# from <sys/fcntl.h> on Irix 4.0.2.
-# The applicability on other systems is not clear.
-
+# Generated by h2py from /usr/include/sys/fcntl.h
 FNDELAY = 0x04
 FAPPEND = 0x08
 FSYNC = 0x10
-FRCACH = 0x20
-FASYNC = 0x40
-FNONBLK = 0x80
-FCREAT = 0x100
-FTRUNC = 0x200
-FEXCL = 0x400
-FNOCTTY = 0x800
+FNONBLOCK = 0x80
+FASYNC = 0x1000
+FNONBLK = FNONBLOCK
+FDIRECT = 0x8000
+FCREAT = 0x0100
+FTRUNC = 0x0200
+FEXCL = 0x0400
+FNOCTTY = 0x0800
 O_RDONLY = 0
 O_WRONLY = 1
 O_RDWR = 2
-O_ACCMODE = 0x3
-O_NDELAY = FNDELAY
-O_APPEND = FAPPEND
-O_SYNC = FSYNC
-O_NONBLOCK = FNONBLK
-O_CREAT = FCREAT
-O_TRUNC = FTRUNC
-O_EXCL = FEXCL
-O_NOCTTY = FNOCTTY
+O_NDELAY = 0x04
+O_APPEND = 0x08
+O_SYNC = 0x10
+O_NONBLOCK = 0x80
+O_DIRECT = 0x8000
+O_CREAT = 0x100
+O_TRUNC = 0x200
+O_EXCL = 0x400
+O_NOCTTY = 0x800
 F_DUPFD = 0
 F_GETFD = 1
 F_SETFD = 2
 F_GETFL = 3
 F_SETFL = 4
-F_GETLK = 5
+F_GETLK = 14
+F_O_GETLK = 5
+F_GETLK = 14
 F_SETLK = 6
 F_SETLKW = 7
 F_CHKFL = 8
@@ -37,13 +37,17 @@
 F_FREESP = 11
 F_SETBSDLK = 12
 F_SETBSDLKW = 13
-F_RGETLK = 20
-F_RSETLK = 21
+F_DIOINFO = 30
+F_RSETLK = 20
+F_RGETLK = 21
 F_RSETLKW = 22
-F_GETOWN = 10
-F_SETOWN = 11
+F_GETOWN = 23
+F_SETOWN = 24
+F_O_GETOWN = 10
+F_O_SETOWN = 11
 F_RDLCK = 01
 F_WRLCK = 02
 F_UNLCK = 03
-FD_CLOEXEC = 0x1
-FD_NODUP_FORK = 0x2
+O_ACCMODE = 3
+FD_CLOEXEC = 1
+FD_NODUP_FORK = 4
diff --git a/Lib/plat-irix5/IN.py b/Lib/plat-irix5/IN.py
index 78be3ef..325a021 100755
--- a/Lib/plat-irix5/IN.py
+++ b/Lib/plat-irix5/IN.py
@@ -1,8 +1,4 @@
-# Symbolic constants from <netinet/in.h>.
-# These constants are SGI specific!
-# See demo/scripts/h2py.py for a tool to help generate a version for
-# your system.
-
+# Generated by h2py from /usr/include/netinet/in.h
 IPPROTO_IP = 0
 IPPROTO_ICMP = 1
 IPPROTO_IGMP = 2
@@ -14,6 +10,8 @@
 IPPROTO_IDP = 22
 IPPROTO_TP = 29
 IPPROTO_XTP = 36
+IPPROTO_HELLO = 63
+IPPROTO_ND = 77
 IPPROTO_EON = 80
 IPPROTO_RAW = 255
 IPPROTO_MAX = 256
@@ -42,6 +40,11 @@
 INADDR_NONE = 0xffffffff
 IN_LOOPBACKNET = 127
 IP_OPTIONS = 1
+IP_MULTICAST_IF = 2
+IP_MULTICAST_TTL = 3
+IP_MULTICAST_LOOP = 4
+IP_ADD_MEMBERSHIP = 5
+IP_DROP_MEMBERSHIP = 6
 IP_HDRINCL = 7
 IP_TOS = 8
 IP_TTL = 9
@@ -49,11 +52,32 @@
 IP_RECVRETOPTS = 11
 IP_RECVDSTADDR = 12
 IP_RETOPTS = 13
-IP_MULTICAST_IF = 2
-IP_MULTICAST_TTL = 3
-IP_MULTICAST_LOOP = 4
-IP_ADD_MEMBERSHIP = 5
-IP_DROP_MEMBERSHIP = 6
+IP_OPTIONS = 1
+IP_HDRINCL = 2
+IP_TOS = 3
+IP_TTL = 4
+IP_RECVOPTS = 5
+IP_RECVRETOPTS = 6
+IP_RECVDSTADDR = 7
+IP_RETOPTS = 8
+IP_MULTICAST_IF = 20
+IP_MULTICAST_TTL = 21
+IP_MULTICAST_LOOP = 22
+IP_ADD_MEMBERSHIP = 23
+IP_DROP_MEMBERSHIP = 24
+IRIX4_IP_OPTIONS = 1
+IRIX4_IP_MULTICAST_IF = 2
+IRIX4_IP_MULTICAST_TTL = 3
+IRIX4_IP_MULTICAST_LOOP = 4
+IRIX4_IP_ADD_MEMBERSHIP = 5
+IRIX4_IP_DROP_MEMBERSHIP = 6
+IRIX4_IP_HDRINCL = 7
+IRIX4_IP_TOS = 8
+IRIX4_IP_TTL = 9
+IRIX4_IP_RECVOPTS = 10
+IRIX4_IP_RECVRETOPTS = 11
+IRIX4_IP_RECVDSTADDR = 12
+IRIX4_IP_RETOPTS = 13
 IP_DEFAULT_MULTICAST_TTL = 1
 IP_DEFAULT_MULTICAST_LOOP = 1
 IP_MAX_MEMBERSHIPS = 20
diff --git a/Lib/plat-irix5/SOCKET.py b/Lib/plat-irix5/SOCKET.py
index 8a15ef9..0ba0742 100755
--- a/Lib/plat-irix5/SOCKET.py
+++ b/Lib/plat-irix5/SOCKET.py
@@ -1,8 +1,23 @@
+# Generated by h2py from /usr/include/sys/socket.h
 SOCK_STREAM = 1
 SOCK_DGRAM = 2
 SOCK_RAW = 3
 SOCK_RDM = 4
 SOCK_SEQPACKET = 5
+NC_TPI_CLTS = 1
+NC_TPI_COTS = 2
+NC_TPI_COTS_ORD = 3
+NC_TPI_RAW = 4
+SOCK_DGRAM = NC_TPI_CLTS
+SOCK_STREAM = NC_TPI_COTS
+SOCK_RAW = NC_TPI_RAW
+SOCK_RDM = 5
+SOCK_SEQPACKET = 6
+IRIX4_SOCK_STREAM = 1
+IRIX4_SOCK_DGRAM = 2
+IRIX4_SOCK_RAW = 3
+IRIX4_SOCK_RDM = 4
+IRIX4_SOCK_SEQPACKET = 5
 SO_DEBUG = 0x0001
 SO_ACCEPTCONN = 0x0002
 SO_REUSEADDR = 0x0004
@@ -13,6 +28,9 @@
 SO_LINGER = 0x0080
 SO_OOBINLINE = 0x0100
 SO_REUSEPORT = 0x0200
+SO_ORDREL = 0x0200
+SO_IMASOCKET = 0x0400
+SO_CHAMELEON = 0x1000
 SO_SNDBUF = 0x1001
 SO_RCVBUF = 0x1002
 SO_SNDLOWAT = 0x1003
@@ -21,6 +39,7 @@
 SO_RCVTIMEO = 0x1006
 SO_ERROR = 0x1007
 SO_TYPE = 0x1008
+SO_PROTOTYPE = 0x1009
 SOL_SOCKET = 0xffff
 AF_UNSPEC = 0
 AF_UNIX = 1
@@ -30,7 +49,6 @@
 AF_CHAOS = 5
 AF_NS = 6
 AF_ISO = 7
-AF_OSI = AF_ISO
 AF_ECMA = 8
 AF_DATAKIT = 9
 AF_CCITT = 10
@@ -44,7 +62,14 @@
 AF_RAW = 18
 AF_LINK = 18
 pseudo_AF_XTP = 19
-AF_MAX = 20
+AF_NIT = 17
+AF_802 = 18
+AF_OSI = 19
+AF_X25 = 20
+AF_OSINET = 21
+AF_GOSIP = 22
+AF_SDL = 23
+AF_MAX = (AF_SDL+1)
 PF_UNSPEC = AF_UNSPEC
 PF_UNIX = AF_UNIX
 PF_INET = AF_INET
@@ -53,7 +78,6 @@
 PF_CHAOS = AF_CHAOS
 PF_NS = AF_NS
 PF_ISO = AF_ISO
-PF_OSI = AF_ISO
 PF_ECMA = AF_ECMA
 PF_DATAKIT = AF_DATAKIT
 PF_CCITT = AF_CCITT
@@ -67,11 +91,18 @@
 PF_LINK = AF_LINK
 PF_XTP = pseudo_AF_XTP
 PF_RAW = AF_RAW
+PF_NIT = AF_NIT
+PF_802 = AF_802
+PF_OSI = AF_OSI
+PF_X25 = AF_X25
+PF_OSINET = AF_OSINET
+PF_GOSIP = AF_GOSIP
 PF_MAX = AF_MAX
 SOMAXCONN = 5
 MSG_OOB = 0x1
 MSG_PEEK = 0x2
 MSG_DONTROUTE = 0x4
+MSG_EOR = 0x8
 MSG_BTAG = 0x40
 MSG_ETAG = 0x80
 MSG_MAXIOVLEN = 16
diff --git a/Lib/plat-irix5/cddb.py b/Lib/plat-irix5/cddb.py
index d7fdc96..0dee709 100755
--- a/Lib/plat-irix5/cddb.py
+++ b/Lib/plat-irix5/cddb.py
@@ -138,6 +138,19 @@
 					continue
 				self.track[trackno] = value
 		f.close()
+		for i in range(2, len(self.track)):
+			track = self.track[i]
+			# if track title starts with `,', use initial part
+			# of previous track's title
+			if track[0] == ',':
+				try:
+					off = string.index(self.track[i - 1],
+							   ',')
+				except string.index_error:
+					pass
+				else:
+					self.track[i] = self.track[i-1][:off] \
+							+ track
 
 	def write(self):
 		import posixpath
@@ -153,6 +166,17 @@
 		f.write('album.title:\t' + self.title + '\n')
 		f.write('album.artist:\t' + self.artist + '\n')
 		f.write('album.toc:\t' + self.toc + '\n')
+		prevpref = None
 		for i in range(1, len(self.track)):
-			f.write('track' + `i` + '.title:\t' + self.track[i] + '\n')
+			track = self.track[i]
+			try:
+				off = string.index(track, ',')
+			except string.index_error:
+				prevpref = None
+			else:
+				if prevpref and track[:off] == prevpref:
+					track = track[off:]
+				else:
+					prevpref = track[:off]
+			f.write('track' + `i` + '.title:\t' + track + '\n')
 		f.close()
diff --git a/Lib/plat-irix5/flp.py b/Lib/plat-irix5/flp.py
index c3f6f3b..bc4a8ab 100755
--- a/Lib/plat-irix5/flp.py
+++ b/Lib/plat-irix5/flp.py
@@ -432,10 +432,10 @@
 
 def test():
     import time
-    t0 = time.millitimer()
+    t0 = time.time()
     if len(sys.argv) == 2:
 	forms = parse_forms(sys.argv[1])
-	t1 = time.millitimer()
+	t1 = time.time()
 	print 'parse time:', 0.001*(t1-t0), 'sec.'
 	keys = forms.keys()
 	keys.sort()
@@ -443,8 +443,8 @@
 	    _printform(forms[i])
     elif len(sys.argv) == 3:
 	form = parse_form(sys.argv[1], sys.argv[2])
-	t1 = time.millitimer()
-	print 'parse time:', 0.001*(t1-t0), 'sec.'
+	t1 = time.time()
+	print 'parse time:', round(t1-t0, 3), 'sec.'
 	_printform(form)
     else:
 	print 'Usage: test fdfile [form]'
diff --git a/Lib/plat-sunos4/FCNTL.py b/Lib/plat-sunos4/FCNTL.py
index 0ba5e67..1256d81 100755
--- a/Lib/plat-sunos4/FCNTL.py
+++ b/Lib/plat-sunos4/FCNTL.py
@@ -1,10 +1,10 @@
+# Generated by h2py from stdin
 _FOPEN = (-1)
 _FREAD = 0x0001
 _FWRITE = 0x0002
 _FNDELAY = 0x0004
 _FAPPEND = 0x0008
-_FMARK = 0x0010
-_FDEFER = 0x0020
+_FSETBLK = 0x0010
 _FASYNC = 0x0040
 _FSHLOCK = 0x0080
 _FEXLOCK = 0x0100
@@ -15,6 +15,8 @@
 _FSYNC = 0x2000
 _FNONBLOCK = 0x4000
 _FNOCTTY = 0x8000
+_FMARK = 0x10000
+_FDEFER = 0x20000
 O_RDONLY = 0
 O_WRONLY = 1
 O_RDWR = 2
@@ -25,7 +27,6 @@
 O_NONBLOCK = _FNONBLOCK
 O_NOCTTY = _FNOCTTY
 O_SYNC = _FSYNC
-O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)
 FAPPEND = _FAPPEND
 FSYNC = _FSYNC
 FASYNC = _FASYNC
@@ -36,6 +37,7 @@
 FWRITE = _FWRITE
 FMARK = _FMARK
 FDEFER = _FDEFER
+FSETBLK = _FSETBLK
 FSHLOCK = _FSHLOCK
 FEXLOCK = _FEXLOCK
 FOPEN = _FOPEN
@@ -62,3 +64,4 @@
 F_WRLCK = 2
 F_UNLCK = 3
 F_UNLKSYS = 4
+O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)
diff --git a/Lib/plat-sunos4/IN.py b/Lib/plat-sunos4/IN.py
index 05188af..a05a944 100755
--- a/Lib/plat-sunos4/IN.py
+++ b/Lib/plat-sunos4/IN.py
@@ -1,8 +1,4 @@
-# Symbolic constants from <netinet/in.h>.
-# These constants are SunOS specific!  (Possibly even SunOS 4.1.1)
-# See demo/scripts/h2py.py for a tool to help generate a version for
-# your system.
-
+# Generated by h2py from /usr/include/netinet/in.h
 IPPROTO_IP = 0
 IPPROTO_ICMP = 1
 IPPROTO_IGMP = 2
diff --git a/Lib/plat-sunos4/SOCKET.py b/Lib/plat-sunos4/SOCKET.py
index c1b8542..65ce4bc 100755
--- a/Lib/plat-sunos4/SOCKET.py
+++ b/Lib/plat-sunos4/SOCKET.py
@@ -1,3 +1,4 @@
+# Generated by h2py from /usr/include/sys/socket.h
 SOCK_STREAM = 1
 SOCK_DGRAM = 2
 SOCK_RAW = 3
diff --git a/Lib/plat-sunos4/WAIT.py b/Lib/plat-sunos4/WAIT.py
new file mode 100755
index 0000000..43612f0
--- /dev/null
+++ b/Lib/plat-sunos4/WAIT.py
@@ -0,0 +1,13 @@
+# Generated by h2py from /usr/include/sys/wait.h
+WUNTRACED = 0004
+WNOHANG = 0100
+WEXITED = 0001
+WTRAPPED = 0002
+WSTOPPED = WUNTRACED
+WCONTINUED = 0010
+WNOWAIT = 0200
+WOPTMASK = (WEXITED|WTRAPPED|WSTOPPED|WCONTINUED|WNOHANG|WNOWAIT)
+WSTOPFLG = 0177
+WCONTFLG = 0177777
+WCOREFLG = 0200
+WSIGMASK = 0177
diff --git a/Lib/plat-sunos4/regen b/Lib/plat-sunos4/regen
index f1482db..8b52d74 100755
--- a/Lib/plat-sunos4/regen
+++ b/Lib/plat-sunos4/regen
@@ -8,4 +8,5 @@
 h2py </usr/include/sys/fcntlcom.h >FCNTL.py
 echo "O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)" >>FCNTL.py
 h2py /usr/include/sys/socket.h
+h2py /usr/include/sys/wait.h
 h2py -i '(u_long)' /usr/include/netinet/in.h
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 96116d1..6110f8e 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -130,7 +130,7 @@
 
 
 # Is a path a regular file?
-# This follows symbolic links, so both islink() and isdir() can be true
+# This follows symbolic links, so both islink() and isfile() can be true
 # for the same path.
 
 def isfile(path):
@@ -205,7 +205,7 @@
 	for name in names:
 		if name not in exceptions:
 			name = join(top, name)
-			if isdir(name):
+			if isdir(name) and not islink(name):
 				walk(name, func, arg)
 
 
@@ -239,29 +239,35 @@
 
 
 # Expand paths containing shell variable substitutions.
-# This is done by piping it through the shell.
-# Shell quoting characters (\ " ' `) are protected by a backslash.
-# NB: a future version may avoid starting a subprocess and do the
-# substitutions internally.  This may slightly change the syntax
-# for variables.
+# This expands the forms $variable and ${variable} only.
+# Non-existant variables are left unchanged.
+
+_varprog = None
 
 def expandvars(path):
+	global _varprog
 	if '$' not in path:
 		return path
-	q = ''
-	for c in path:
-		if c in ('\\', '"', '\'', '`'):
-			c = '\\' + c
-		q = q + c
-	d = '!'
-	if q == d:
-		d = '+'
-	p = posix.popen('cat <<' + d + '\n' + q + '\n' + d + '\n', 'r')
-	res = p.read()
-	del p
-	if res[-1:] == '\n':
-		res = res[:-1]
-	return res
+	if not _varprog:
+		import regex
+		_varprog = regex.compile('$\([a-zA-Z0-9_]+\|{[^}]*}\)')
+	i = 0
+	while 1:
+		i = _varprog.search(path, i)
+		if i < 0:
+			break
+		name = _varprog.group(1)
+		j = i + len(_varprog.group(0))
+		if name[:1] == '{' and name[-1:] == '}':
+			name = name[1:-1]
+		if posix.environ.has_key(name):
+			tail = path[j:]
+			path = path[:i] + posix.environ[name]
+			i = len(path)
+			path = path + tail
+		else:
+			i = j
+	return path
 
 
 # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
diff --git a/Lib/profile.doc b/Lib/profile.doc
index 753d159..bf5d8e3 100644
--- a/Lib/profile.doc
+++ b/Lib/profile.doc
@@ -1,74 +1,702 @@
-The Python Profiler
+profile.doc                     last updated 6/23/94 [by Guido]
 
-To use the profiler in its simplest form:
+ PROFILER DOCUMENTATION and (mini) USER'S MANUAL
 
-	>>> import profile
-	>>> profile.run(statement)
+Copyright 1994, by InfoSeek Corporation, all rights reserved.
+Written by James Roskind
 
-This will execute the statement and print statistics.  To get more
-information out of the profiler, use:
+Permission to use, copy, modify, and distribute this Python software
+and its associated documentation for any purpose (subject to the
+restriction in the following sentence) without fee is hereby granted,
+provided that the above copyright notice appears in all copies, and
+that both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of InfoSeek not be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission.  This permission is
+explicitly restricted to the copying and modification of the software
+to remain in Python, compiled Python, or other languages (such as C)
+wherein the modified or derived code is exclusively imported into a
+Python module.
 
-	>>> import profile
-	>>> profile.run(statement, dump_file)
+INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
-where dump_file is a string naming a file to which the (binary)
-profile statistics is to be dumped.  The binary format is a dump of a
-dictionary.  The key is the function name in the format described
-above; the value is a tuple consisting of, in order, number of calls,
-total time spent in the function, total time spent in the function and
-all functions called from it, a list of functions called by this
-function, and a list of functions that called this function.  The dump
-can be read back using the following code:
 
-	>>> import marshal
-	>>> f = open(dump_file, 'r')
-	>>> dict = marshal.load(f)
-	>>> f.close()
+The profiler was written after only programming in Python for 3 weeks.
+As a result, it is probably clumsy code, but I don't know for sure yet
+'cause I'm a beginner :-).  I did work hard to make the code run fast,
+so that profiling would be a reasonable thing to do.  I tried not to
+repeat code fragments, but I'm sure I did some stuff in really awkward
+ways at times.  Please send suggestions for improvements to:
+jar@infoseek.com.  I won't promise *any* support.  ...but I'd
+appreciate the feedback.
 
-An easier way of doing this is by using the class `Stats' which is
-also defined in profile:
 
-	>>> import profile
-	>>> s = profile.Stats().init(dump_file)
+SECTION HEADING LIST:
+  INTRODUCTION
+  HOW IS THIS profile DIFFERENT FROM THE OLD profile MODULE?
+  INSTANT USERS MANUAL
+  WHAT IS DETERMINISTIC PROFILING?
+  REFERENCE MANUAL			  
+    FUNCTION	profile.run(string, filename_opt)
+    CLASS	Stats(filename, ...)
+    METHOD	strip_dirs()
+    METHOD	add(filename, ...)
+    METHOD	sort_stats(key, ...)
+    METHOD	reverse_order()
+    METHOD	print_stats(restriction, ...)
+    METHOD	print_callers(restrictions, ...)
+    METHOD	print_callees(restrictions, ...)
+    METHOD	ignore()
+  LIMITATIONS
+  CALIBRATION
+  EXTENSIONS: Deriving Better Profilers
 
-The following methods are defined for instances of `Stats':
 
-	print_stats()	-- Print the statistics in a format similar to
-			   the format profile.run() uses.
-	print_callers()	-- For each function, print all functions
-			   which it calls.
-	print_callees()	-- For each function, print all functions from
-			   which it is called.
-	sort_stats(n)	-- Sort the statistics for subsequent
-			   printing.  The argument determines on which
-			   field the output should be sorted.
-			   Possibilities are
-				-1	function name
-				0	number of calls
-				1	total time spent in a function
-				2	total time spent in a function
-					plus all functions it called
-	strip_dirs()	-- Strip the directory names off of the file
-			   names which are part of the function names.
-			   This undoes the effect of sort_stats(), but
-			   a subsequent sort_stats() does work.
 
-The methods sort_stats and strip_dirs may change in the future.
+INTRODUCTION
 
-Output of profile.run(statement) and of the print_stats() method of
-the `Stats' class consists of the following fields.
+A "profiler" is a program that describes the run time performance of a
+program, providing a variety of statistics.  This documentation
+describes the profiler functionality provided in the modules
+"profile" and "pstats."  This profiler provides "deterministic
+profiling" of any Python programs.  It also provides a series of
+report generation tools to allow users to rapidly examine the results
+of a profile operation.
 
-	Number of times the function was called.
-	Total time spent in the function.
-	Mean time per function call (second field divided by first).
-	Total time spent in the function and all functions it called,
-		recursively.
-	Mean time time spent in the function and all functions it
-		called (fourth field divided by first).
-	Name of the function in the format
-		<file name>:<line number>(<function name>)
 
-The output of the print_callers and print_callees methods consists of
-the name of the function and the names of all function it called or
-was called from.  The latter names are followed by a parenthesised
-number which is the number of calls for this function.
+HOW IS THIS profile DIFFERENT FROM THE OLD profile MODULE?
+
+The big changes from standard profiling module are that you get more
+information, and you pay less CPU time.  It's not a trade-off, it's a
+trade-up.
+
+To be specific:
+
+ bugs removed: local stack frame is no longer molested, execution time
+      is now charged to correct functions, ....
+
+ accuracy increased: profiler execution time is no longer charged to
+      user's code, calibration for platform is supported, file reads
+      are not done *by* profiler *during* profiling (and charged to
+      user's code!), ...
+
+ speed increased: Overhead CPU cost was reduced by more than a factor of
+      two (perhaps a factor of five), lightweight profiler module is
+      all that must be loaded, and the report generating module
+      (pstats) is not needed during profiling. 
+
+ recursive functions support: cumulative times in recursive functions
+      are correctly calculated; recursive entries are counted; ...
+
+ large growth in report generating UI: distinct profiles runs can be added
+       together forming a comprehensive report; functions that import
+       statistics take arbitrary lists of files; sorting criteria is now
+       based on keywords (instead of 4 integer options); reports shows
+       what functions were profiled as well as what profile file was
+       referenced; output format has been improved, ...
+
+
+INSTANT USERS MANUAL
+
+This section is provided for users that "don't want to read the
+manual." It provides a very brief overview, and allows a user to
+rapidly perform profiling on an existing application.
+
+To profile an application with a main entry point of "foo()", you
+would add the following to your module:
+
+	import profile
+	profile.run("foo()")
+
+The above action would cause "foo()" to be run, and a series of
+informative lines (the profile) to be printed.  The above approach is
+most useful when working with the interpreter.  If you would like to
+save the results of a profile into a file for later examination, you
+can supply a file name as the second argument to the run() function:
+
+	import profile
+	profile.run("foo()", 'fooprof')
+
+When you wish to review the profile, you should use the methods in the
+pstats module.  Typically you would load the statistics data as
+follows:
+
+	import pstats
+	p = pstats.Stats('fooprof')
+
+The class "Stats" (the above code just created an instance of this
+class) has a variety of methods for manipulating and printing the data
+that was just read into "p".  When you ran profile.run() above, what
+was printed was the result of three method calls:
+
+	p.strip_dirs().sort_stats(-1).print_stats()
+
+The first method removed the extraneous path from all the module
+names. The second method sorted all the entries according to the
+standard module/line/name string that is printed (this is to comply
+with the semantics of the old profiler).  The third method printed out
+all the statistics.  You might try the following sort calls:
+
+	p.sort_stats('name')
+	p.print_stats()
+
+The first call will actually sort the list by function name, and the
+second call will print out the statistics.  The following are some
+interesting calls to experiment with:
+
+	p.sort_stats('cumulative').print_stats(10)
+
+This sorts the profile by cumulative time in a function, and then only
+prints the ten most significant lines.  If you want to understand what
+algorithms are taking time, the above line is what you would use.
+
+If you were looking to see what functions were looping a lot, and
+taking a lot of time, you would do:
+
+	p.sort_stats('time').print_stats(10)
+
+to sort according to time spent within each function, and then print
+the statistics for the top ten functions.
+
+You might also try:
+
+	p.sort_stats('file').print_stats('__init__')
+
+This will sort all the statistics by file name, and then print out
+statistics for only the class init methods ('cause they are spelled
+with "__init__" in them).  As one final example, you could try:
+
+	p.sort_stats('time', 'cum').print_stats(.5, 'init')
+
+This line sorts stats with a primary key of time, and a secondary key
+of cumulative time, and then prints out some of the statistics.  To be
+specific, the list is first culled down to 50% (re: .5) of its
+original size, then only lines containing "init" are maintained, and
+that sub-sub-list is printed.
+
+If you wondered what functions called the above functions, you could
+now (p is still sorted according to the last criteria) do:
+
+	p.print_callers(.5, 'init')
+
+and you would get a list of callers for each of the listed functions. 
+
+If you want more functionality, you're going to have to read the
+manual (or guess) what the following functions do:
+
+	p.print_callees()
+	p.add('fooprof')
+
+
+WHAT IS DETERMINISTIC PROFILING?
+
+"Deterministic profiling" is meant to reflect the fact that all
+"function call", "function return", and "exception" events are
+monitored, and precise timings are made for the intervals between
+these events (during which time the user's code is executing).  In
+contrast, "statistical profiling" (which is not done by this module)
+randomly samples the effective instruction pointer, and deduces where
+time is being spent.  The latter technique traditionally involves less
+overhead (as the code does not need to be instrumented), but provides
+only relative indications of where time is being spent.
+
+In Python, since there is an interpreter active during execution, the
+presence of instrumented code is not required to do deterministic
+profiling. Python automatically provides a hook (optional callback)
+for each event.  In addition, the interpreted nature of Python tends
+to add so much overhead to execution, that deterministic profiling
+tends to only add small processing overhead, in typical applications.
+The result is that deterministic profiling is not that expensive, but
+yet provides extensive run time statistics about the execution of a
+Python program.  
+
+Call count statistics can be used to identify bugs in code (surprising
+counts), and to identify possible inline-expansion points (high call
+counts).  Internal time statistics can be used to identify hot loops
+that should be carefully optimized.  Cumulative time statistics should
+be used to identify high level errors in the selection of algorithms.
+Note that the unusual handling of cumulative times in this profiler
+allows statistics for recursive implementations of algorithms to be
+directly compared to iterative implementations.
+
+
+REFERENCE MANUAL			  
+
+The primary entry point for the profiler is the global function
+profile.run().  It is typically used to create any profile
+information.  The reports are formatted and printed using methods for
+the class pstats.Stats.  The following is a description of all of
+these standard entry points and functions.  For a more in-depth view
+of some of the code, consider reading the later section on "Profiler
+Extensions," which includes discussion of how to derive "better"
+profilers from the classes presented, or reading the source code for
+these modules.
+
+
+FUNCTION	profile.run(string, filename_opt)
+
+This function takes a single argument that has can be passed to the
+"exec" statement, and an optional file name.  In all cases this
+routine attempts to "exec" its first argument, and gather profiling
+statistics from the execution. If no file name is present, then this
+function automatically prints a simple profiling report, sorted by the
+standard name string (file/line/function-name) that is presented in
+each line.  The following is a typical output from such a call:
+
+cut here----
+
+         main()
+         2706 function calls (2004 primitive calls) in 4.504 CPU seconds
+
+   Ordered by: standard name
+
+   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
+        2    0.006    0.003    0.953    0.477 pobject.py:75(save_objects)
+     43/3    0.533    0.012    0.749    0.250 pobject.py:99(evaluate)
+	...
+
+cut here----
+
+The first line indicates that this profile was generated by the call:
+profile.run('main()'), and hence the exec'ed string is 'main()'.  The
+second line indicates that 2706 calls were monitored.  Of those calls,
+2004 were "primitive."  We define "primitive" to mean that the call
+was not induced via recursion.  The next line: "Ordered by: standard
+name", indicates that the text string in the far right column was used
+to sort the output.  The column headings include:
+
+	"ncalls" for the number of calls, 
+	"tottime" for the total time spent in the given function
+		(and excluding time made in calls to sub-functions), 
+	"percall" is the quotient of "tottime" divided by "ncalls"
+	"cumtime" is the total time spent in this and all subfunctions
+		(i.e., from invocation till exit). This figure is
+		accurate *even* for recursive functions.
+	"percall" is the quotient of "cumtime" divided by primitive
+		calls
+	"filename:lineno(function)" provides the respective data of
+		each function
+
+When there are two numbers in the first column (e.g.: 43/3), then the
+latter is the number of primitive calls, and the former is the actual
+number of calls.  Note that when the function does not recurse, these
+two values are the same, and only the single figure is printed.
+
+
+CLASS	Stats(filename, ...)
+
+This class constructor creates an instance of a statistics object from
+a filename (or set of filenames).  Stats objects are manipulated by
+methods, in order to print useful reports.  
+
+The file selected by the above constructor must have been created by
+the corresponding version of profile.  To be specific, there is *NO*
+file compatibility guaranteed with future versions of this profiler,
+and there is no compatibility with files produced by other profilers
+(e.g., the standard system profiler).
+
+If several files are provided, all the statistics for identical
+functions will be coalesced, so that an overall view of several
+processes can be considered in a single report.  If additional files
+need to be combined with data in an existing Stats object, the add()
+method can be used.
+
+
+METHOD	strip_dirs()
+
+This method for the Stats class removes all leading path information
+from file names.  It is very useful in reducing the size of the
+printout to fit within (close to) 80 columns.  This method modifies
+the object, and the striped information is lost.  After performing a
+strip operation, the object is considered to have its entries in a
+"random" order, as it was just after object initialization and
+loading.  If strip_dir() causes two function names to be
+indistinguishable (i.e., they are on the same line of the same
+filename, and have the same function name), then the statistics for
+these two entries are accumulated into a single entry.
+
+
+METHOD	add(filename, ...)
+
+This methods of the Stats class accumulates additional profiling
+information into the current profiling object.  Its arguments should
+refer to filenames created my the corresponding version of
+profile.run().  Statistics for identically named (re: file, line,
+name) functions are automatically accumulated into single function
+statistics.
+
+
+METHOD	sort_stats(key, ...)
+
+This method modifies the Stats object by sorting it according to the
+supplied criteria.  The argument is typically a string identifying the
+basis of a sort (example: "time" or "name").
+
+When more than one key is provided, then additional keys are used as
+secondary criteria when the there is equality in all keys selected
+before them.  For example, sort_stats('name', 'file') will sort all
+the entries according to their function name, and resolve all ties
+(identical function names) by sorting by file name.
+
+Abbreviations can be used for any key names, as long as the
+abbreviation is unambiguous.  The following are the keys currently
+defined: 
+
+		Valid Arg       Meaning
+		  "calls"      call count
+		  "cumulative" cumulative time
+		  "file"       file name
+		  "module"     file name
+		  "pcalls"     primitive call count
+		  "line"       line number
+		  "name"       function name
+		  "nfl"        name/file/line
+		  "stdname"    standard name
+		  "time"       internal time
+
+Note that all sorts on statistics are in descending order (placing most
+time consuming items first), where as name, file, and line number
+searches are in ascending order (i.e., alphabetical). The subtle
+distinction between "nfl" and "stdname" is that the standard name is a
+sort of the name as printed, which means that the embedded line
+numbers get compared in an odd way.  For example, lines 3, 20, and 40
+would (if the file names were the same) appear in the string order
+"20" "3" and "40".  In contrast, "nfl" does a numeric compare of the
+line numbers.  In fact, sort_stats("nfl") is the same as
+sort_stats("name", "file", "line").
+
+For compatibility with the standard profiler, the numeric argument -1,
+0, 1, and 2 are permitted.  They are interpreted as "stdname",
+"calls", "time", and "cumulative" respectively.  If this old style
+format (numeric) is used, only one sort key (the numeric key) will be
+used, and additionally arguments will be silently ignored.
+
+
+METHOD	reverse_order()
+
+This method for the Stats class reverses the ordering of the basic
+list within the object.  This method is provided primarily for
+compatibility with the standard profiler.  Its utility is questionable
+now that ascending vs descending order is properly selected based on
+the sort key of choice.
+
+
+METHOD	print_stats(restriction, ...)
+
+This method for the Stats class prints out a report as described in
+the profile.run() definition.  
+
+The order of the printing is based on the last sort_stats() operation
+done on the object (subject to caveats in add() and strip_dirs()).
+
+The arguments provided (if any) can be used to limit the list down to
+the significant entries.  Initially, the list is taken to be the
+complete set of profiled functions.  Each restriction is either an
+integer (to select a count of lines), or a decimal fraction between
+0.0 and 1.0 inclusive (to select a percentage of lines), or a regular
+expression (to pattern match the standard name that is printed).  If
+several restrictions are provided, then they are applied sequentially.
+For example:
+
+	print_stats(.1, "foo:")
+
+would first limit the printing to first 10% of list, and then only 
+print functions that were part of filename ".*foo:".  In contrast, the
+command: 
+
+	print_stats("foo:", .1)
+
+would limit the list to all functions having file names ".*foo:", and
+then proceed to only print the first 10% of them.
+
+
+METHOD	print_callers(restrictions, ...)
+
+This method for the Stats class prints a list of all functions that
+called each function in the profiled database.  The ordering is
+identical to that provided by print_stats(), and the definition of the
+restricting argument is also identical.  For convenience, a number is
+shown in parentheses after each caller to show how many times this
+specific call was made.  A second non-parenthesized number is the
+cumulative time spent in the function at the right.
+
+
+METHOD	print_callees(restrictions, ...)
+
+This method for the Stats class prints a list of all function that
+were called by the indicated function.  Aside from this reversal of
+direction of calls (re: called vs was called by), the arguments and
+ordering are identical to the print_callers() method.
+
+
+METHOD	ignore()
+
+This method of the Stats class is used to dispose of the value
+returned by earlier methods.  All standard methods in this class
+return the instance that is being processed, so that the commands can
+be strung together.  For example:
+
+pstats.Stats('foofile').strip_dirs().sort_stats('cum').print_stats().ignore()
+
+would perform all the indicated functions, but it would not return
+the final reference to the Stats instance.
+
+
+
+	
+LIMITATIONS
+
+There are two fundamental limitations on this profiler.  The first is
+that it relies on the Python interpreter to dispatch "call", "return",
+and "exception" events.  Compiled C code does not get interpreted,
+and hence is "invisible" to the profiler.  All time spent in C code
+(including builtin functions) will be charged to the Python function
+that was invoked the C code.  IF the C code calls out to some native
+Python code, then those calls will be profiled properly.
+
+The second limitation has to do with accuracy of timing information.
+There is a fundamental problem with deterministic profilers involving
+accuracy.  The most obvious restriction is that the underlying "clock"
+is only ticking at a rate (typically) of about .001 seconds.  Hence no
+measurements will be more accurate that that underlying clock.  If
+enough measurements are taken, then the "error" will tend to average
+out. Unfortunately, removing this first error induces a second source
+of error...
+
+The second problem is that it "takes a while" from when an event is
+dispatched until the profiler's call to get the time actually *gets*
+the state of the clock.  Similarly, there is a certain lag when
+exiting the profiler event handler from the time that the clock's
+value was obtained (and then squirreled away), until the user's code
+is once again executing.  As a result, functions that are called many
+times, or call many functions, will typically accumulate this error.
+The error that accumulates in this fashion is typically less than the
+accuracy of the clock (i.e., less than one clock tick), but it *can*
+accumulate and become very significant.  This profiler provides a
+means of calibrating itself for a give platform so that this error can
+be probabilistically (i.e., on the average) removed.  After the
+profiler is calibrated, it will be more accurate (in a least square
+sense), but it will sometimes produce negative numbers (when call
+counts are exceptionally low, and the gods of probability work against
+you :-). )  Do *NOT* be alarmed by negative numbers in the profile.
+They should *only* appear if you have calibrated your profiler, and
+the results are actually better than without calibration.
+
+
+CALIBRATION
+
+The profiler class has a hard coded constant that is added to each
+event handling time to compensate for the overhead of calling the time
+function, and socking away the results.  The following procedure can
+be used to obtain this constant for a given platform (see discussion
+in LIMITATIONS above). 
+
+	import profile
+	pr = profile.Profile()
+	pr.calibrate(100)
+	pr.calibrate(100)
+	pr.calibrate(100)
+
+The argument to calibrate() is the number of times to try to do the
+sample calls to get the CPU times.  If your computer is *very* fast,
+you might have to do:
+
+	pr.calibrate(1000)
+
+or even:
+
+	pr.calibrate(10000)
+
+The object of this exercise is to get a fairly consistent result.
+When you have a consistent answer, you are ready to use that number in
+the source code.  For a Sun Sparcstation 1000 running Solaris 2.3, the
+magical number is about .00053.  If you have a choice, you are better
+off with a smaller constant, and your results will "less often" show
+up as negative in profile statistics.
+
+The following shows how the trace_dispatch() method in the Profile
+class should be modified to install the calibration constant on a Sun
+Sparcstation 1000:
+
+	def trace_dispatch(self, frame, event, arg):
+		t = self.timer()
+		t = t[0] + t[1] - self.t - .00053 # Calibration constant
+
+		if self.dispatch[event](frame,t):
+			t = self.timer()
+			self.t = t[0] + t[1]
+		else:
+			r = self.timer()
+			self.t = r[0] + r[1] - t # put back unrecorded delta
+		return
+
+Note that if there is no calibration constant, then the line
+containing the callibration constant should simply say:
+
+		t = t[0] + t[1] - self.t  # no calibration constant
+
+You can also achieve the same results using a derived class (and the
+profiler will actually run equally fast!!), but the above method is
+the simplest to use.  I could have made the profiler "self
+calibrating", but it would have made the initialization of the
+profiler class slower, and would have required some *very* fancy
+coding, or else the use of a variable where the constant .00053 was
+placed in the code shown.  This is a ****VERY**** critical performance
+section, and there is no reason to use a variable lookup at this
+point, when a constant can be used.
+
+
+EXTENSIONS: Deriving Better Profilers
+
+The Profile class of profile was written so that derived classes
+could be developed to extend the profiler.  Rather than describing all
+the details of such an effort, I'll just present the following two
+examples of derived classes that can be used to do profiling.  If the
+reader is an avid Python programmer, then it should be possible to use
+these as a model and create similar (and perchance better) profile
+classes. 
+
+If all you want to do is change how the timer is called, or which
+timer function is used, then the basic class has an option for that in
+the constructor for the class.  Consider passing the name of a
+function to call into the constructor:
+
+	pr = profile.Profile(your_time_func)
+
+The resulting profiler will call your time function instead of
+os.times().  The function should return either a single number, or a
+list of numbers (like what os.times() returns).  If the function
+returns a single time number, or the list of returned numbers has
+length 2, then you will get an especially fast version of the dispatch
+routine.  
+
+Be warned that you *should* calibrate the profiler class for the
+timer function that you choose.  For most machines, a timer that
+returns a lone integer value will provide the best results in terms of
+low overhead during profiling.  (os.times is *pretty* bad, 'cause it
+returns a tuple of floating point values, so all arithmetic is
+floating point in the profiler!).  If you want to be substitute a
+better timer in the cleanest fashion, you should derive a class, and
+simply put in the replacement dispatch method that better handles your timer
+call, along with the appropriate calibration constant :-).
+
+
+cut here------------------------------------------------------------------
+#****************************************************************************
+# OldProfile class documentation
+#****************************************************************************
+#
+# The following derived profiler simulates the old style profile, providing
+# errant results on recursive functions. The reason for the usefulness of this
+# profiler is that it runs faster (i.e., less overhead) than the old
+# profiler.  It still creates all the caller stats, and is quite
+# useful when there is *no* recursion in the user's code.  It is also
+# a lot more accurate than the old profiler, as it does not charge all
+# its overhead time to the user's code. 
+#****************************************************************************
+class OldProfile(Profile):
+	def trace_dispatch_exception(self, frame, t):
+		rt, rtt, rct, rfn, rframe, rcur = self.cur
+		if rcur and not rframe is frame:
+			return self.trace_dispatch_return(rframe, t)
+		return 0
+
+	def trace_dispatch_call(self, frame, t):
+		fn = `frame.f_code`
+		
+		self.cur = (t, 0, 0, fn, frame, self.cur)
+		if self.timings.has_key(fn):
+			tt, ct, callers = self.timings[fn]
+			self.timings[fn] = tt, ct, callers
+		else:
+			self.timings[fn] = 0, 0, {}
+		return 1
+
+	def trace_dispatch_return(self, frame, t):
+		rt, rtt, rct, rfn, frame, rcur = self.cur
+		rtt = rtt + t
+		sft = rtt + rct
+
+		pt, ptt, pct, pfn, pframe, pcur = rcur
+		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+
+		tt, ct, callers = self.timings[rfn]
+		if callers.has_key(pfn):
+			callers[pfn] = callers[pfn] + 1
+		else:
+			callers[pfn] = 1
+		self.timings[rfn] = tt+rtt, ct + sft, callers
+
+		return 1
+
+
+	def snapshot_stats(self):
+		self.stats = {}
+		for func in self.timings.keys():
+			tt, ct, callers = self.timings[func]
+			nor_func = self.func_normalize(func)
+			nor_callers = {}
+			nc = 0
+			for func_caller in callers.keys():
+				nor_callers[self.func_normalize(func_caller)]=\
+					  callers[func_caller]
+				nc = nc + callers[func_caller]
+			self.stats[nor_func] = nc, nc, tt, ct, nor_callers
+
+		
+
+#****************************************************************************
+# HotProfile class documentation
+#****************************************************************************
+#
+# This profiler is the fastest derived profile example.  It does not
+# calculate caller-callee relationships, and does not calculate cumulative
+# time under a function.  It only calculates time spent in a function, so
+# it runs very quickly (re: very low overhead).  In truth, the basic
+# profiler is so fast, that is probably not worth the savings to give
+# up the data, but this class still provides a nice example.
+#****************************************************************************
+class HotProfile(Profile):
+	def trace_dispatch_exception(self, frame, t):
+		rt, rtt, rfn, rframe, rcur = self.cur
+		if rcur and not rframe is frame:
+			return self.trace_dispatch_return(rframe, t)
+		return 0
+
+	def trace_dispatch_call(self, frame, t):
+		self.cur = (t, 0, frame, self.cur)
+		return 1
+
+	def trace_dispatch_return(self, frame, t):
+		rt, rtt, frame, rcur = self.cur
+
+		rfn = `frame.f_code`
+
+		pt, ptt, pframe, pcur = rcur
+		self.cur = pt, ptt+rt, pframe, pcur
+
+		if self.timings.has_key(rfn):
+			nc, tt = self.timings[rfn]
+			self.timings[rfn] = nc + 1, rt + rtt + tt
+		else:
+			self.timings[rfn] =      1, rt + rtt
+
+		return 1
+
+
+	def snapshot_stats(self):
+		self.stats = {}
+		for func in self.timings.keys():
+			nc, tt = self.timings[func]
+			nor_func = self.func_normalize(func)
+			self.stats[nor_func] = nc, nc, tt, 0, {}
+
+		
+
+cut here------------------------------------------------------------------
diff --git a/Lib/profile.py b/Lib/profile.py
index 502a4db..35ed63e 100755
--- a/Lib/profile.py
+++ b/Lib/profile.py
@@ -1,380 +1,80 @@
 #
-# Class for profiling python code.
-# Author: Sjoerd Mullender
-# Hacked somewhat by: Guido van Rossum
+# Class for profiling python code. rev 1.0  6/2/94
 #
-# See the accompanying document profile.doc for more information.
+# Based on prior profile module by Sjoerd Mullender...
+#   which was hacked somewhat by: Guido van Rossum
+#
+# See profile.doc for more information
+
+
+# Copyright 1994, by InfoSeek Corporation, all rights reserved.
+# Written by James Roskind
+# 
+# Permission to use, copy, modify, and distribute this Python software
+# and its associated documentation for any purpose (subject to the
+# restriction in the following sentence) without fee is hereby granted,
+# provided that the above copyright notice appears in all copies, and
+# that both that copyright notice and this permission notice appear in
+# supporting documentation, and that the name of InfoSeek not be used in
+# advertising or publicity pertaining to distribution of the software
+# without specific, written prior permission.  This permission is
+# explicitly restricted to the copying and modification of the software
+# to remain in Python, compiled Python, or other languages (such as C)
+# wherein the modified or derived code is exclusively imported into a
+# Python module.
+# 
+# INFOSEEK CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS. IN NO EVENT SHALL INFOSEEK CORPORATION BE LIABLE FOR ANY
+# SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+# RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF
+# CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
 
 import sys
-import codehack
 import os
+import time
 import string
-import fpformat
 import marshal
 
-class Profile:
 
-	def __init__(self):
-		self.timings = {}
-		self.debug = None
-		self.call_level = 0
-		self.profile_func = None
-		self.profiling = 0
-
-	def profile(self, funcname):
-		if not self.profile_func:
-			self.profile_func = {}
-		self.profile_func[funcname] = 1
-
-	def trace_dispatch(self, frame, event, arg):
-		if event == 'call':
-			funcname = codehack.getcodename(frame.f_code)
-			if self.profile_func and not self.profiling:
-				if self.profile_func.has_key(funcname):
-					return
-				self.profiling = 1
-			t = os.times()
-			t = t[0] + t[1]
-			if frame.f_locals.has_key('__key'):
-				key = frame.f_locals['__key']
-			else:
-				lineno = codehack.getlineno(frame.f_code)
-				filename = frame.f_code.co_filename
-				key = filename + ':' + `lineno` + '(' + funcname + ')'
-				frame.f_locals['__key'] = key
-			self.call_level = depth(frame)
-			self.cur_frame = frame
-			pframe = frame.f_back
-			if self.debug:
-				s0 = 'call: ' + key + ' depth: ' + `self.call_level` + ' time: ' + `t`
-			if pframe:
-				if pframe.f_locals.has_key('__key'):
-					pkey = pframe.f_locals['__key']
-				else:
-					pkey = pframe.f_code.co_filename + \
-						  ':' + \
-						  `codehack.getlineno(pframe.f_code)` \
-						  + '(' + \
-						  codehack.getcodename(pframe.f_code) \
-						  + ')'
-					pframe.f_locals['__key'] = pkey
-				if self.debug:
-					s1 = 'parent: ' + pkey
-				if pframe.f_locals.has_key('__start_time'):
-					st = pframe.f_locals['__start_time']
-					nc, tt, ct, callers, callees = \
-						self.timings[pkey]
-					if self.debug:
-						s1 = s1+' before: st='+`st`+' nc='+`nc`+' tt='+`tt`+' ct='+`ct`
-					if callers.has_key(key):
-						callers[key] = callers[key] + 1
-					else:
-						callers[key] = 1
-					if self.debug:
-						s1 = s1+' after: st='+`st`+' nc='+`nc`+' tt='+`tt+(t-st)`+' ct='+`ct`
-					self.timings[pkey] = nc, tt + (t - st), ct, callers, callees
-			if self.timings.has_key(key):
-				nc, tt, ct, callers, callees = self.timings[key]
-			else:
-				nc, tt, ct, callers, callees = 0, 0, 0, {}, {}
-			if self.debug:
-				s0 = s0+' before: nc='+`nc`+' tt='+`tt`+' ct='+`ct`
-				s0 = s0+' after: nc='+`nc+1`+' tt='+`tt`+' ct='+`ct`
-			if pframe:
-				if callees.has_key(pkey):
-					callees[pkey] = callees[pkey] + 1
-				else:
-					callees[pkey] = 1
-			self.timings[key] = nc + 1, tt, ct, callers, callees
-			frame.f_locals['__start_time'] = t
-			if self.debug:
-				print s0
-				print s1
-			return
-		if event == 'return':
-			if self.profile_func:
-				if not self.profiling:
-					return
-				if self.profile_func.has_key( \
-					codehack.getcodename(frame.f_code)):
-					self.profiling = 0
-			self.call_level = depth(frame)
-			self.cur_frame = frame
-			pframe = frame.f_back
-			if self.debug:
-				s0 = 'return: '
-			else:
-				s0 = None
-			self.handle_return(pframe, frame, s0)
-			return
-		if event == 'exception':
-			if self.profile_func and not self.profiling:
-				return
-			call_level = depth(frame)
-			if call_level < self.call_level:
-				if call_level <> self.call_level - 1:
-					print 'heh!',call_level,self.call_level
-				if self.debug:
-					s0 = 'exception: '
-				else:
-					s0 = None
-				self.handle_return(self.cur_frame, frame, s0)
-			self.call_level = call_level
-			self.cur_frame = frame
-			return
-		print 'profile.Profile.dispatch: unknown debugging event:',
-		print `event`
-		return
-
-	def handle_return(self, pframe, frame, s0):
-		t = os.times()
-		t = t[0] + t[1]
-		if frame.f_locals.has_key('__key'):
-			key = frame.f_locals['__key']
-		else:
-			funcname = codehack.getcodename(frame.f_code)
-			lineno = codehack.getlineno(frame.f_code)
-			filename = frame.f_code.co_filename
-			key = filename + ':' + `lineno` + '(' + funcname + ')'
-			frame.f_locals['__key'] = key
-		if self.debug:
-			s0 = s0 + key + ' depth: ' + `self.call_level` + ' time: ' + `t`
-		if pframe:
-			if pframe.f_locals.has_key('__key'):
-				pkey = pframe.f_locals['__key']
-			else:
-				funcname = codehack.getcodename(frame.f_code)
-				lineno = codehack.getlineno(frame.f_code)
-				filename = frame.f_code.co_filename
-				pkey = filename + ':' + `lineno` + '(' + funcname + ')'
-				pframe.f_locals['__key'] = pkey
-			if self.debug:
-				s1 = 'parent: '+pkey
-			if pframe.f_locals.has_key('__start_time') and \
-				  self.timings.has_key(pkey):
-				st = pframe.f_locals['__start_time']
-				nc, tt, ct, callers, callees = \
-					self.timings[pkey]
-				if self.debug:
-					s1 = s1+' before: st='+`st`+' nc='+`nc`+' tt='+`tt`+' ct='+`ct`
-					s1 = s1+' after: st='+`t`+' nc='+`nc`+' tt='+`tt`+' ct='+`ct+(t-st)`
-				self.timings[pkey] = \
-					nc, tt, ct + (t - st), callers, callees
-				pframe.f_locals['__start_time'] = t
-		if self.timings.has_key(key):
-			nc, tt, ct, callers, callees = self.timings[key]
-		else:
-			nc, tt, ct, callers, callees = 0, 0, 0, {}, {}
-		if frame.f_locals.has_key('__start_time'):
-			st = frame.f_locals['__start_time']
-		else:
-			st = t
-		if self.debug:
-			s0 = s0+' before: st='+`st`+' nc='+`nc`+' tt='+`tt`+' ct='+`ct`
-			s0 = s0+' after: nc='+`nc`+' tt='+`tt+(t-st)`+' ct='+`ct+(t-st)`
-			print s0
-			print s1
-		self.timings[key] = \
-			nc, tt + (t - st), ct + (t - st), callers, callees
-
-	def print_stats(self):
-		# Print in reverse order by ct
-		print_title()
-		list = []
-		for key in self.timings.keys():
-			nc, tt, ct, callers, callees = self.timings[key]
-			if nc == 0:
-				continue
-			list.append(ct, tt, nc, key)
-		list.sort()
-		list.reverse()
-		for ct, tt, nc, key in list:
-			print_line(nc, tt, ct, os.path.basename(key))
-
-	def dump_stats(self, file):
-		f = open(file, 'w')
-		marshal.dump(self.timings, f)
-		f.close()
-
-	# The following two methods can be called by clients to use
-	# a profiler to profile a statement, given as a string.
-	
-	def run(self, cmd):
-		import __main__
-		dict = __main__.__dict__
-		self.runctx(cmd, dict, dict)
-	
-	def runctx(self, cmd, globals, locals):
-		sys.setprofile(self.trace_dispatch)
-		try:
-			exec(cmd + '\n', globals, locals)
-		finally:
-			sys.setprofile(None)
-
-	# This method is more useful to profile a single function call.
-
-	def runcall(self, func, *args):
-		sys.setprofile(self.trace_dispatch)
-		try:
-			apply(func, args)
-		finally:
-			sys.setprofile(None)
+# Global variables
+func_norm_dict = {}
+func_norm_counter = 0
+pid_string = `os.getpid()`
 
 
-def depth(frame):
-	d = 0
-	while frame:
-		d = d + 1
-		frame = frame.f_back
-	return d
+# Optimized intermodule references
+ostimes = os.times
 
-class Stats:
-	def __init__(self, file):
-		f = open(file, 'r')
-		self.stats = marshal.load(f)
-		f.close()
-		self.stats_list = None
 
-	def print_stats(self):
-		print_title()
-		if self.stats_list:
-			for i in range(len(self.stats_list)):
-				nc, tt, ct, callers, callees, key = \
-					self.stats_list[i]
-				print_line(nc, tt, ct, key)
-		else:
-			for key in self.stats.keys():
-				nc, tt, ct, callers, callees = self.stats[key]
-				print_line(nc, tt, ct, key)
+# Sample timer for use with 
+#i_count = 0
+#def integer_timer():
+#	global i_count
+#	i_count = i_count + 1
+#	return i_count
+#itimes = integer_timer # replace with C coded timer returning integers
 
-	def print_callers(self):
-		if self.stats_list:
-			for i in range(len(self.stats_list)):
-				nc, tt, ct, callers, callees, key = \
-					self.stats_list[i]
-				print key,
-				for func in callers.keys():
-					print func+'('+`callers[func]`+')',
-				print
-		else:
-			for key in self.stats.keys():
-				nc, tt, ct, callers, callees = self.stats[key]
-				print key,
-				for func in callers.keys():
-					print func+'('+`callers[func]`+')',
-				print
+#**************************************************************************
+# The following are the static member functions for the profiler class
+# Note that an instance of Profile() is *not* needed to call them.
+#**************************************************************************
 
-	def print_callees(self):
-		if self.stats_list:
-			for i in range(len(self.stats_list)):
-				nc, tt, ct, callers, callees, key = \
-					self.stats_list[i]
-				print key,
-				for func in callees.keys():
-					print func+'('+`callees[func]`+')',
-				print
-		else:
-			for key in self.stats.keys():
-				nc, tt, ct, callers, callees = self.stats[key]
-				print key,
-				for func in callees.keys():
-					print func+'('+`callees[func]`+')',
-				print
-
-	def sort_stats(self, field):
-		stats_list = []
-		for key in self.stats.keys():
-			t = self.stats[key]
-			nt = ()
-			for i in range(len(t)):
-				if i == field:
-					nt = (t[i],) + nt[:]
-				else:
-					nt = nt[:] + (t[i],)
-			if field == -1:
-				nt = (key,) + nt
-			else:
-				nt = nt + (key,)
-			stats_list.append(nt)
-		stats_list.sort()
-		self.stats_list = []
-		for i in range(len(stats_list)):
-			t = stats_list[i]
-			if field == -1:
-				nt = t[1:] + t[0:1]
-			else:
-				nt = t[1:]
-				nt = nt[:field] + t[0:1] + nt[field:]
-			self.stats_list.append(nt)
-
-	def reverse_order(self):
-		self.stats_list.reverse()
-
-	def strip_dirs(self):
-		newstats = {}
-		for key in self.stats.keys():
-			nc, tt, ct, callers, callees = self.stats[key]
-			newkey = os.path.basename(key)
-			newcallers = {}
-			for c in callers.keys():
-				newcallers[os.path.basename(c)] = callers[c]
-			newcallees = {}
-			for c in callees.keys():
-				newcallees[os.path.basename(c)] = callees[c]
-			newstats[newkey] = nc, tt, ct, newcallers, newcallees
-		self.stats = newstats
-		self.stats_list = None
-
-def print_title():
-	print string.rjust('ncalls', 8),
-	print string.rjust('tottime', 8),
-	print string.rjust('percall', 8),
-	print string.rjust('cumtime', 8),
-	print string.rjust('percall', 8),
-	print 'filename:lineno(function)'
-
-def print_line(nc, tt, ct, key):
-	print string.rjust(`nc`, 8),
-	print f8(tt),
-	if nc == 0:
-		print ' '*8,
-	else:
-		print f8(tt/nc),
-	print f8(ct),
-	if nc == 0:
-		print ' '*8,
-	else:
-		print f8(ct/nc),
-	print key
-
-def f8(x):
-	return string.rjust(fpformat.fix(x, 3), 8)
 
 # simplified user interface
 def run(statement, *args):
 	prof = Profile()
 	try:
-		prof.run(statement)
+		prof = prof.run(statement)
 	except SystemExit:
 		pass
-	if len(args) == 0:
-		prof.print_stats()
-	else:
+	if args:
 		prof.dump_stats(args[0])
-
-# test command with debugging
-def debug():
-	prof = Profile()
-	prof.debug = 1
-	try:
-		prof.run('import x; x.main()')
-	except SystemExit:
-		pass
-	prof.print_stats()
-
-# test command
-def test():
-	run('import x; x.main()')
+	else:
+		return prof.print_stats()
 
 # print help
 def help():
@@ -387,3 +87,526 @@
 	else:
 		print 'Sorry, can\'t find the help file "profile.doc"',
 		print 'along the Python search path'
+
+
+#**************************************************************************
+# class Profile documentation:
+#**************************************************************************
+# self.cur is always a tuple.  Each such tuple corresponds to a stack
+# frame that is currently active (self.cur[-2]).  The following are the
+# definitions of its members.  We use this external "parallel stack" to
+# avoid contaminating the program that we are profiling. (old profiler
+# used to write into the frames local dictionary!!) Derived classes
+# can change the definition of some entries, as long as they leave
+# [-2:] intact.
+#
+# [ 0] = Time that needs to be charged to the parent frame's function.  It is
+#        used so that a function call will not have to access the timing data
+#        for the parents frame.
+# [ 1] = Total time spent in this frame's function, excluding time in
+#        subfunctions
+# [ 2] = Cumulative time spent in this frame's function, including time in
+#        all subfunctions to this frame.
+# [-3] = Name of the function that corresonds to this frame.  
+# [-2] = Actual frame that we correspond to (used to sync exception handling)
+# [-1] = Our parent 6-tuple (corresonds to frame.f_back)
+#**************************************************************************
+# Timing data for each function is stored as a 5-tuple in the dictionary
+# self.timings[].  The index is always the name stored in self.cur[4].
+# The following are the definitions of the members:
+#
+# [0] = The number of times this function was called, not counting direct
+#       or indirect recursion,
+# [1] = Number of times this function appears on the stack, minus one
+# [2] = Total time spent internal to this function
+# [3] = Cumulative time that this function was present on the stack.  In
+#       non-recursive functions, this is the total execution time from start
+#       to finish of each invocation of a function, including time spent in
+#       all subfunctions.
+# [5] = A dictionary indicating for each function name, the number of times
+#       it was called by us.
+#**************************************************************************
+# We produce function names via a repr() call on the f_code object during
+# profiling. This save a *lot* of CPU time.  This results in a string that
+# always looks like:
+#   <code object main at 87090, file "/a/lib/python-local/myfib.py", line 76>
+# After we "normalize it, it is a tuple of filename, line, function-name.
+# We wait till we are done profiling to do the normalization.
+# *IF* this repr format changes, then only the normalization routine should
+# need to be fixed.
+#**************************************************************************
+class Profile:
+
+	def __init__(self, *arg):
+		self.timings = {}
+		self.cur = None
+		self.cmd = ""
+
+		self.dispatch = {  \
+			  'call'     : self.trace_dispatch_call, \
+			  'return'   : self.trace_dispatch_return, \
+			  'exception': self.trace_dispatch_exception, \
+			  }
+
+		if not arg:
+			self.timer = os.times
+			self.dispatcher = self.trace_dispatch
+		else:
+			self.timer = arg[0]
+			t = self.timer() # test out timer function
+			try:
+				if len(t) == 2:
+					self.dispatcher = self.trace_dispatch
+				else:
+					self.dispatcher = self.trace_dispatch_r
+			except:
+				self.dispatcher = self.trace_dispatch_i
+		self.t = self.get_time()
+		self.simulate_call('profiler')
+
+
+	def get_time(self): # slow simulation of method to acquire time
+		t = self.timer()
+		if type(t) == type(()) or type(t) == type([]):
+			t = reduce(lambda x,y: x+y, t, 0)
+		return t
+		
+
+	# Heavily optimized dispatch routine for os.times() timer
+
+	def trace_dispatch(self, frame, event, arg):
+		t = self.timer()
+		t = t[0] + t[1] - self.t        # No Calibration constant
+		# t = t[0] + t[1] - self.t - .00053 # Calibration constant
+
+		if self.dispatch[event](frame,t):
+			t = self.timer()
+			self.t = t[0] + t[1]
+		else:
+			r = self.timer()
+			self.t = r[0] + r[1] - t # put back unrecorded delta
+		return
+
+
+
+	# Dispatch routine for best timer program (return = scalar integer)
+
+	def trace_dispatch_i(self, frame, event, arg):
+		t = self.timer() - self.t # - 1 # Integer calibration constant
+		if self.dispatch[event](frame,t):
+			self.t = self.timer()
+		else:
+			self.t = self.timer() - t  # put back unrecorded delta
+		return
+
+
+	# SLOW generic dispatch rountine for timer returning lists of numbers
+
+	def trace_dispatch_l(self, frame, event, arg):
+		t = self.get_time() - self.t
+
+		if self.dispatch[event](frame,t):
+			self.t = self.get_time()
+		else:
+			self.t = self.get_time()-t # put back unrecorded delta
+		return
+
+
+	def trace_dispatch_exception(self, frame, t):
+		rt, rtt, rct, rfn, rframe, rcur = self.cur
+		if (not rframe is frame) and rcur:
+			return self.trace_dispatch_return(rframe, t)
+		return 0
+
+
+	def trace_dispatch_call(self, frame, t):
+		fn = `frame.f_code` 
+
+		# The following should be about the best approach, but
+		# we would need a function that maps from id() back to
+		# the actual code object.  
+		#     fn = id(frame.f_code)
+		# Note we would really use our own function, which would
+		# return the code address, *and* bump the ref count.  We
+		# would then fix up the normalize function to do the
+		# actualy repr(fn) call.
+
+		# The following is an interesting alternative
+		# It doesn't do as good a job, and it doesn't run as
+		# fast 'cause repr() is written in C, and this is Python.
+		#fcode = frame.f_code
+		#code = fcode.co_code
+		#if ord(code[0]) == 127: #  == SET_LINENO
+		#	# see "opcode.h" in the Python source
+		#	fn = (fcode.co_filename, ord(code[1]) | \
+		#		  ord(code[2]) << 8, fcode.co_name)
+		#else:
+		#	fn = (fcode.co_filename, 0, fcode.co_name)
+
+		self.cur = (t, 0, 0, fn, frame, self.cur)
+		if self.timings.has_key(fn):
+			cc, ns, tt, ct, callers = self.timings[fn]
+			self.timings[fn] = cc, ns + 1, tt, ct, callers
+		else:
+			self.timings[fn] = 0, 0, 0, 0, {}
+		return 1
+
+	def trace_dispatch_return(self, frame, t):
+		# if not frame is self.cur[-2]: raise "Bad return", self.cur[3]
+
+		# Prefix "r" means part of the Returning or exiting frame
+		# Prefix "p" means part of the Previous or older frame
+
+		rt, rtt, rct, rfn, frame, rcur = self.cur
+		rtt = rtt + t
+		sft = rtt + rct
+
+		pt, ptt, pct, pfn, pframe, pcur = rcur
+		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+
+		cc, ns, tt, ct, callers = self.timings[rfn]
+		if not ns:
+			ct = ct + sft
+			cc = cc + 1
+		if callers.has_key(pfn):
+			callers[pfn] = callers[pfn] + 1  # hack: gather more
+			# stats such as the amount of time added to ct courtesy
+			# of this specific call, and the contribution to cc
+			# courtesy of this call.
+		else:
+			callers[pfn] = 1
+		self.timings[rfn] = cc, ns - 1, tt+rtt, ct, callers
+
+		return 1
+
+	# The next few function play with self.cmd. By carefully preloading
+	# our paralell stack, we can force the profiled result to include
+	# an arbitrary string as the name of the calling function.
+	# We use self.cmd as that string, and the resulting stats look
+	# very nice :-).
+
+	def set_cmd(self, cmd):
+		if self.cur[-1]: return   # already set
+		self.cmd = cmd
+		self.simulate_call(cmd)
+
+	class fake_code:
+		def __init__(self, filename, line, name):
+			self.co_filename = filename
+			self.co_line = line
+			self.co_name = name
+			self.co_code = '\0'  # anything but 127
+
+		def __repr__(self):
+			return (self.co_filename, self.co_line, self.co_name)
+
+	class fake_frame:
+		def __init__(self, code, prior):
+			self.f_code = code
+			self.f_back = prior
+			
+	def simulate_call(self, name):
+		code = self.fake_code('profile', 0, name)
+		if self.cur:
+			pframe = self.cur[-2]
+		else:
+			pframe = None
+		frame = self.fake_frame(code, pframe)
+		a = self.dispatch['call'](frame, 0)
+		return
+
+	# collect stats from pending stack, including getting final
+	# timings for self.cmd frame.
+	
+	def simulate_cmd_complete(self):   
+		t = self.get_time() - self.t
+		while self.cur[-1]:
+			# We *can* cause assertion errors here if
+			# dispatch_trace_return checks for a frame match!
+			a = self.dispatch['return'](self.cur[-2], t)
+			t = 0
+		self.t = self.get_time() - t
+
+	
+	def print_stats(self):
+		import pstats
+		pstats.Stats(self).strip_dirs().sort_stats(-1). \
+			  print_stats()
+
+	def dump_stats(self, file):
+		f = open(file, 'w')
+		self.create_stats()
+		marshal.dump(self.stats, f)
+		f.close()
+
+	def create_stats(self):
+		self.simulate_cmd_complete()
+		self.snapshot_stats()
+
+	def snapshot_stats(self):
+		self.stats = {}
+		for func in self.timings.keys():
+			cc, ns, tt, ct, callers = self.timings[func]
+			nor_func = self.func_normalize(func)
+			nor_callers = {}
+			nc = 0
+			for func_caller in callers.keys():
+				nor_callers[self.func_normalize(func_caller)]=\
+					  callers[func_caller]
+				nc = nc + callers[func_caller]
+			self.stats[nor_func] = cc, nc, tt, ct, nor_callers
+
+
+	# Override the following function if you can figure out
+	# a better name for the binary f_code entries.  I just normalize
+	# them sequentially in a dictionary.  It would be nice if we could
+	# *really* see the name of the underlying C code :-).  Sometimes
+	#  you can figure out what-is-what by looking at caller and callee
+	# lists (and knowing what your python code does).
+	
+	def func_normalize(self, func_name):
+		global func_norm_dict
+		global func_norm_counter
+		global func_sequence_num
+
+		if func_norm_dict.has_key(func_name):
+			return func_norm_dict[func_name]
+		if type(func_name) == type(""):
+			long_name = string.split(func_name)
+			file_name = long_name[6][1:-2]
+			func = long_name[2]
+			lineno = long_name[8][:-1]
+			if '?' == func:   # Until I find out how to may 'em...
+				file_name = 'python'
+				func_norm_counter = func_norm_counter + 1
+				func = pid_string + ".C." + `func_norm_counter`
+			result =  file_name ,  string.atoi(lineno) , func
+		else:
+			result = func_name
+		func_norm_dict[func_name] = result
+		return result
+
+
+	# The following two methods can be called by clients to use
+	# a profiler to profile a statement, given as a string.
+	
+	def run(self, cmd):
+		import __main__
+		dict = __main__.__dict__
+		self.runctx(cmd, dict, dict)
+		return self
+	
+	def runctx(self, cmd, globals, locals):
+		self.set_cmd(cmd)
+		sys.setprofile(self.trace_dispatch)
+		try:
+			exec(cmd, globals, locals)
+		finally:
+			sys.setprofile(None)
+
+	# This method is more useful to profile a single function call.
+	def runcall(self, func, *args):
+		self.set_cmd(func.__name__)
+		sys.setprofile(self.trace_dispatch)
+		try:
+			apply(func, args)
+		finally:
+			sys.setprofile(None)
+		return self
+
+
+        #******************************************************************
+	# The following calculates the overhead for using a profiler.  The
+	# problem is that it takes a fair amount of time for the profiler
+	# to stop the stopwatch (from the time it recieves an event).
+	# Similarly, there is a delay from the time that the profiler
+	# re-starts the stopwatch before the user's code really gets to
+	# continue.  The following code tries to measure the difference on
+	# a per-event basis. The result can the be placed in the
+	# Profile.dispatch_event() routine for the given platform.  Note
+	# that this difference is only significant if there are a lot of
+	# events, and relatively little user code per event.  For example,
+	# code with small functions will typically benefit from having the
+	# profiler calibrated for the current platform.  This *could* be
+	# done on the fly during init() time, but it is not worth the
+	# effort.  Also note that if too large a value specified, then
+	# execution time on some functions will actually appear as a
+	# negative number.  It is *normal* for some functions (with very
+	# low call counts) to have such negative stats, even if the
+	# calibration figure is "correct." 
+	#
+	# One alternative to profile-time calibration adjustments (i.e.,
+	# adding in the magic little delta during each event) is to track
+	# more carefully the number of events (and cumulatively, the number
+	# of events during sub functions) that are seen.  If this were
+	# done, then the arithmetic could be done after the fact (i.e., at
+	# display time).  Currintly, we track only call/return events.
+	# These values can be deduced by examining the callees and callers
+	# vectors for each functions.  Hence we *can* almost correct the
+	# internal time figure at print time (note that we currently don't
+	# track exception event processing counts).  Unfortunately, there
+	# is currently no similar information for cumulative sub-function
+	# time.  It would not be hard to "get all this info" at profiler
+	# time.  Specifically, we would have to extend the tuples to keep
+	# counts of this in each frame, and then extend the defs of timing
+	# tuples to include the significant two figures. I'm a bit fearful
+	# that this additional feature will slow the heavily optimized
+	# event/time ratio (i.e., the profiler would run slower, fur a very
+	# low "value added" feature.) 
+	#
+	# Plugging in the calibration constant doesn't slow down the
+	# profiler very much, and the accuracy goes way up.
+	#**************************************************************
+	
+        def calibrate(self, m):
+		n = m
+		s = self.timer()
+		while n:
+			self.simple()
+			n = n - 1
+		f = self.timer()
+		my_simple = f[0]+f[1]-s[0]-s[1]
+		#print "Simple =", my_simple,
+
+		n = m
+		s = self.timer()
+		while n:
+			self.instrumented()
+			n = n - 1
+		f = self.timer()
+		my_inst = f[0]+f[1]-s[0]-s[1]
+		# print "Instrumented =", my_inst
+		avg_cost = (my_inst - my_simple)/m
+		#print "Delta/call =", avg_cost, "(profiler fixup constant)"
+		return avg_cost
+
+	# simulate a program with no profiler activity
+        def simple(self):      
+		a = 1
+		pass
+
+	# simulate a program with call/return event processing
+        def instrumented(self):
+		a = 1
+		self.profiler_simulation(a, a, a)
+
+	# simulate an event processing activity (from user's perspective)
+	def profiler_simulation(self, x, y, z):  
+		t = self.timer()
+		t = t[0] + t[1]
+		self.ut = t
+
+
+
+#****************************************************************************
+# OldProfile class documentation
+#****************************************************************************
+#
+# The following derived profiler simulates the old style profile, providing
+# errant results on recursive functions. The reason for the usefulnes of this
+# profiler is that it runs faster (i.e., less overhead).  It still creates
+# all the caller stats, and is quite useful when there is *no* recursion
+# in the user's code.
+#
+# This code also shows how easy it is to create a modified profiler.
+#****************************************************************************
+class OldProfile(Profile):
+	def trace_dispatch_exception(self, frame, t):
+		rt, rtt, rct, rfn, rframe, rcur = self.cur
+		if rcur and not rframe is frame:
+			return self.trace_dispatch_return(rframe, t)
+		return 0
+
+	def trace_dispatch_call(self, frame, t):
+		fn = `frame.f_code`
+		
+		self.cur = (t, 0, 0, fn, frame, self.cur)
+		if self.timings.has_key(fn):
+			tt, ct, callers = self.timings[fn]
+			self.timings[fn] = tt, ct, callers
+		else:
+			self.timings[fn] = 0, 0, {}
+		return 1
+
+	def trace_dispatch_return(self, frame, t):
+		rt, rtt, rct, rfn, frame, rcur = self.cur
+		rtt = rtt + t
+		sft = rtt + rct
+
+		pt, ptt, pct, pfn, pframe, pcur = rcur
+		self.cur = pt, ptt+rt, pct+sft, pfn, pframe, pcur
+
+		tt, ct, callers = self.timings[rfn]
+		if callers.has_key(pfn):
+			callers[pfn] = callers[pfn] + 1
+		else:
+			callers[pfn] = 1
+		self.timings[rfn] = tt+rtt, ct + sft, callers
+
+		return 1
+
+
+	def snapshot_stats(self):
+		self.stats = {}
+		for func in self.timings.keys():
+			tt, ct, callers = self.timings[func]
+			nor_func = self.func_normalize(func)
+			nor_callers = {}
+			nc = 0
+			for func_caller in callers.keys():
+				nor_callers[self.func_normalize(func_caller)]=\
+					  callers[func_caller]
+				nc = nc + callers[func_caller]
+			self.stats[nor_func] = nc, nc, tt, ct, nor_callers
+
+		
+
+#****************************************************************************
+# HotProfile class documentation
+#****************************************************************************
+#
+# This profiler is the fastest derived profile example.  It does not
+# calculate caller-callee relationships, and does not calculate cumulative
+# time under a function.  It only calculates time spent in a function, so
+# it runs very quickly (re: very low overhead)
+#****************************************************************************
+class HotProfile(Profile):
+	def trace_dispatch_exception(self, frame, t):
+		rt, rtt, rfn, rframe, rcur = self.cur
+		if rcur and not rframe is frame:
+			return self.trace_dispatch_return(rframe, t)
+		return 0
+
+	def trace_dispatch_call(self, frame, t):
+		self.cur = (t, 0, frame, self.cur)
+		return 1
+
+	def trace_dispatch_return(self, frame, t):
+		rt, rtt, frame, rcur = self.cur
+
+		rfn = `frame.f_code`
+
+		pt, ptt, pframe, pcur = rcur
+		self.cur = pt, ptt+rt, pframe, pcur
+
+		if self.timings.has_key(rfn):
+			nc, tt = self.timings[rfn]
+			self.timings[rfn] = nc + 1, rt + rtt + tt
+		else:
+			self.timings[rfn] =      1, rt + rtt
+
+		return 1
+
+
+	def snapshot_stats(self):
+		self.stats = {}
+		for func in self.timings.keys():
+			nc, tt = self.timings[func]
+			nor_func = self.func_normalize(func)
+			self.stats[nor_func] = nc, nc, tt, 0, {}
+
+		
+
+#****************************************************************************
+def Stats(*args):
+	print 'Report generating functions are in the "pstats" module\a'
diff --git a/Lib/regexp.py b/Lib/regexp.py
index 6136814..4b5db73 100644
--- a/Lib/regexp.py
+++ b/Lib/regexp.py
@@ -10,13 +10,7 @@
 			self.prog = regex.compile(pat)
 		finally:
 			xxx = regex.set_syntax(save_syntax)
-	def match(self, *args):
-		if len(args) == 2:
-			str, offset = args
-		elif len(args) == 1:
-			str, offset = args[0], 0
-		else:
-			raise TypeError, 'wrong argument count'
+	def match(self, str, offset = 0):
 		if self.prog.search(str, offset) < 0:
 			return ()
 		regs = self.prog.regs
diff --git a/Lib/repr.py b/Lib/repr.py
index 50ee6c9..2f4a0bf 100644
--- a/Lib/repr.py
+++ b/Lib/repr.py
@@ -77,6 +77,19 @@
 			j = max(0, self.maxlong-3-i)
 			s = s[:i] + '...' + s[len(s)-j:]
 		return s
+	def repr_instance(self, x, level):
+		try:
+			s = `x`
+			# Bugs in x.__repr__() can cause arbitrary
+			# exceptions -- then make up something
+		except:
+			return '<' + x.__class__.__name__ + ' instance at ' + \
+				  hex(id(x))[2:] + '>'
+		if len(s) > self.maxstring:
+			i = max(0, (self.maxstring-3)/2)
+			j = max(0, self.maxstring-3-i)
+			s = s[:i] + '...' + s[len(s)-j:]
+		return s
 
 aRepr = Repr()
 repr = aRepr.repr
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 39ab6a6..580102c 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -1,8 +1,8 @@
 # RFC-822 message manipulation class.
 #
 # XXX This is only a very rough sketch of a full RFC-822 parser;
-# additional methods are needed to parse addresses and dates, and to
-# tokenize lines according to various other syntax rules.
+# in particular the tokenizing of addresses does not adhere to all the
+# quoting rules.
 #
 # Directions for use:
 #
@@ -22,6 +22,17 @@
 # embedded whitespace (including newlines) exactly as they are
 # specified in the header, and leave the case of the text unchanged.
 #
+# For addresses and address lists there are functions
+#   realname, mailaddress = m.getaddr(name) and
+#   list = m.getaddrlist(name)
+# where the latter returns a list of (realname, mailaddr) tuples.
+#
+# There is also a method
+#   time = m.getdate(name)
+# which parses a Date-like field and returns a time-compatible tuple,
+# i.e. a tuple such as returned by time.localtime() or accepted by
+# time.mktime().
+#
 # See the class definition for lower level access methods.
 #
 # There are also some utility functions here.
@@ -29,6 +40,7 @@
 
 import regex
 import string
+import time
 
 
 class Message:
@@ -105,12 +117,13 @@
 
 	# Method to determine whether a line is a legal end of
 	# RFC-822 headers.  You may override this method if your
-	# application wants to bend the rules, e.g. to accept lines
-	# ending in '\r\n', to strip trailing whitespace, or to
-	# recognise MH template separators ('--------'). 
+	# application wants to bend the rules, e.g. to strip trailing
+	# whitespace, or to recognise MH template separators
+	# ('--------').  For convenience (e.g. for code reading from
+	# sockets) a line consisting of \r\n also matches.
 
 	def islast(self, line):
-		return line == '\n'
+		return line == '\n' or line == '\r\n'
 
 
 	# Look through the list of headers and find all lines matching
@@ -178,27 +191,94 @@
 		return string.strip(text)
 
 
-	# XXX The next step would be to define self.getaddr(name)
-	# and self.getaddrlist(name) which would parse a header
-	# consisting of a single mail address and a number of mail
-	# addresses, respectively.  Lower level functions would be
-	# parseaddr(string) and parseaddrlist(string).
+	# Retrieve a single address from a header as a tuple, e.g.
+	# ('Guido van Rossum', 'guido@cwi.nl').
 
-	# XXX Similar, there would be a function self.getdate(name) to
-	# return a date in canonical form (perhaps a number compatible
-	# to time.time()) and a function parsedate(string).
+	def getaddr(self, name):
+		data = self.getheader(name)
+		if not data:
+			return None, None
+		return parseaddr(data)
 
-	# XXX The inverses of the parse functions may also be useful.
+	# Retrieve a list of addresses from a header, where each
+	# address is a tuple as returned by getaddr().
 
+	def getaddrlist(self, name):
+		# XXX This function is not really correct.  The split
+		# on ',' might fail in the case of commas within
+		# quoted strings.
+		data = self.getheader(name)
+		if not data:
+			return []
+		data = string.splitfields(data, ',')
+		for i in range(len(data)):
+			data[i] = parseaddr(data[i])
+		return data
+
+	# Retrieve a date field from a header as a tuple compatible
+	# with time.mktime().
+
+	def getdate(self, name):
+		data = self.getheader(name)
+		if not data:
+			return None
+		return parsedate(data)
+
+
+	# Access as a dictionary (only finds first header of each type):
+
+	def __len__(self):
+		types = {}
+		for line in self.headers:
+			if line[0] in string.whitespace: continue
+			i = string.find(line, ':')
+			if i > 0:
+				name = string.lower(line[:i])
+				types[name] = None
+		return len(types)
+
+	def __getitem__(self, name):
+		value = self.getheader(name)
+		if value is None: raise KeyError, name
+		return value
+
+	def has_key(self, name):
+		value = self.getheader(name)
+		return value is not None
+
+	def keys(self):
+		types = {}
+		for line in self.headers:
+			if line[0] in string.whitespace: continue
+			i = string.find(line, ':')
+			if i > 0:
+				name = line[:i]
+				key = string.lower(name)
+				types[key] = name
+		return types.values()
+
+	def values(self):
+		values = []
+		for name in self.keys():
+			values.append(self[name])
+		return values
+
+	def items(self):
+		items = []
+		for name in self.keys():
+			items.append(name, self[name])
+		return items
 
 
 
 # Utility functions
 # -----------------
 
+# XXX Should fix these to be really conformant.
+# XXX The inverses of the parse functions may also be useful.
+
 
 # Remove quotes from a string.
-# XXX Should fix this to be really conformant.
 
 def unquote(str):
 	if len(str) > 1:
@@ -207,3 +287,107 @@
 		if str[0] == '<' and str[-1:] == '>':
 			return str[1:-1]
 	return str
+
+
+# Parse an address into (name, address) tuple
+
+def parseaddr(address):
+	# This is probably not perfect
+	address = string.strip(address)
+	# Case 1: part of the address is in <xx@xx> form.
+	pos = regex.search('<.*>', address)
+	if pos >= 0:
+		name = address[:pos]
+		address = address[pos:]
+		length = regex.match('<.*>', address)
+		name = name + address[length:]
+		address = address[:length]
+	else:
+		# Case 2: part of the address is in (comment) form
+		pos = regex.search('(.*)', address)
+		if pos >= 0:
+			name = address[pos:]
+			address = address[:pos]
+			length = regex.match('(.*)', name)
+			address = address + name[length:]
+			name = name[:length]
+		else:
+			# Case 3: neither. Only an address
+			name = ''
+	name = string.strip(name)
+	address = string.strip(address)
+	if address and address[0] == '<' and address[-1] == '>':
+		address = address[1:-1]
+	if name and name[0] == '(' and name[-1] == ')':
+		name = name[1:-1]
+	return name, address
+
+
+# Parse a date field
+
+_monthnames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
+	  'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
+
+def parsedate(data):
+	# XXX This completely ignores timezone matters at the moment...
+	data = string.split(data)
+	if data[0][-1] == ',':
+		# There's a dayname here. Skip it
+		del data[0]
+	if len(data) < 5:
+		return None
+	data = data[:5]
+	[dd, mm, yy, tm, tz] = data
+	if not mm in _monthnames:
+		return None
+	mm = _monthnames.index(mm)+1
+	tm = string.splitfields(tm, ':')
+	if len(tm) == 2:
+		[thh, tmm] = tm
+		tss = '0'
+	else:
+		[thh, tmm, tss] = tm
+	try:
+		yy = string.atoi(yy)
+		dd = string.atoi(dd)
+		thh = string.atoi(thh)
+		tmm = string.atoi(tmm)
+		tss = string.atoi(tss)
+	except string.atoi_error:
+		return None
+	tuple = (yy, mm, dd, thh, tmm, tss, 0, 0, 0)
+	return tuple
+
+
+# When used as script, run a small test program.
+# The first command line argument must be a filename containing one
+# message in RFC-822 format.
+
+if __name__ == '__main__':
+	import sys
+	file = '/ufs/guido/Mail/drafts/,1'
+	if sys.argv[1:]: file = sys.argv[1]
+	f = open(file, 'r')
+	m = Message(f)
+	print 'From:', m.getaddr('from')
+	print 'To:', m.getaddrlist('to')
+	print 'Subject:', m.getheader('subject')
+	print 'Date:', m.getheader('date')
+	date = m.getdate('date')
+	if date:
+		print 'ParsedDate:', time.asctime(date)
+	else:
+		print 'ParsedDate:', None
+	m.rewindbody()
+	n = 0
+	while f.readline():
+		n = n + 1
+	print 'Lines:', n
+	print '-'*70
+	print 'len =', len(m)
+	if m.has_key('Date'): print 'Date =', m['Date']
+	if m.has_key('X-Nonsense'): pass
+	print 'keys =', m.keys()
+	print 'values =', m.values()
+	print 'items =', m.items()
+	
diff --git a/Lib/sched.py b/Lib/sched.py
index c838bad..60b0a1b 100644
--- a/Lib/sched.py
+++ b/Lib/sched.py
@@ -6,12 +6,11 @@
 #
 # Each instance is parametrized with two functions, one that is
 # supposed to return the current time, one that is supposed to
-# implement a delay.  You can implement fine- or course-grained
-# real-time scheduling by substituting time and sleep or millitimer
-# and millisleep from the built-in module time, or you can implement
-# simulated time by writing your own functions.  This can also be
-# used to integrate scheduling with STDWIN events; the delay function
-# is allowed to modify the queue.  Time can be expressed as
+# implement a delay.  You can implement real-time scheduling by
+# substituting time and sleep from built-in module time, or you can
+# implement simulated time by writing your own functions.  This can
+# also be used to integrate scheduling with STDWIN events; the delay
+# function is allowed to modify the queue.  Time can be expressed as
 # integers or floating point numbers, as long as it is consistent.
 
 # Events are specified by tuples (time, priority, action, argument).
diff --git a/Lib/stdwin/WindowSched.py b/Lib/stdwin/WindowSched.py
index 56ca6f8..b2fbe76 100755
--- a/Lib/stdwin/WindowSched.py
+++ b/Lib/stdwin/WindowSched.py
@@ -1,5 +1,5 @@
 # Combine a real-time scheduling queue and stdwin event handling.
-# Uses the millisecond timer.
+# Keeps times in milliseconds.
 
 import stdwin, stdwinq
 from stdwinevents import WE_TIMER
@@ -19,11 +19,11 @@
 		mainloop.dispatch(event)
 		return
 	#
-	# Use millisleep for very short delays or if there are no windows
+	# Use sleep for very short delays or if there are no windows
 	#
 	if msecs < 100 or mainloop.countwindows() == 0:
 		if msecs > 0:
-			time.millisleep(msecs)
+			time.sleep(msecs * 0.001)
 		return
 	#
 	# Post a timer event on an arbitrary window and wait for it
@@ -35,7 +35,10 @@
 	if event[0] <> WE_TIMER:
 		mainloop.dispatch(event)
 
-q = sched.scheduler(time.millitimer, delayfunc)
+def millitimer():
+	return int(1000 * time.time())
+
+q = sched.scheduler(millitimer, delayfunc)
 
 # Export functions enter, enterabs and cancel just like a scheduler
 #
diff --git a/Lib/stdwin/filewin.py b/Lib/stdwin/filewin.py
index a03c3f7..df6aa7d 100755
--- a/Lib/stdwin/filewin.py
+++ b/Lib/stdwin/filewin.py
@@ -2,19 +2,19 @@
 # File windows, a subclass of textwin (which is a subclass of gwin)
 
 import textwin
-import builtin
+import __builtin__
 
 
 # FILE WINDOW
 
 def open_readonly(fn): # Open a file window
-	fp = builtin.open(fn, 'r')
+	fp = __builtin__.open(fn, 'r')
 	w = textwin.open_readonly(fn, fp.read())
 	w.fn = fn
 	return w
 
 def open(fn): # Open a file window
-	fp = builtin.open(fn, 'r')
+	fp = __builtin__.open(fn, 'r')
 	w = textwin.open(fn, fp.read())
 	w.fn = fn
 	return w
diff --git a/Lib/stdwin/wdb.py b/Lib/stdwin/wdb.py
index d5c28bb..4018ab1 100755
--- a/Lib/stdwin/wdb.py
+++ b/Lib/stdwin/wdb.py
@@ -241,7 +241,7 @@
 			stdwin.fleep()
 	
 	def draw(self, detail):
-		import linecache, codehack, string
+		import linecache, string
 		d = self.win.begindrawing()
 		try:
 			h, v = 0, 0
@@ -252,7 +252,7 @@
 				else:
 					s = '  '
 				s = s + fn + '(' + `lineno` + ')'
-				s = s + codehack.getcodename(f.f_code)
+				s = s + f.f_code.co_name
 				if f.f_locals.has_key('__args__'):
 					args = f.f_locals['__args__']
 					if args is not None:
@@ -286,6 +286,8 @@
 	try: apply(x.runcall, args)
 	finally: x.close()
 
+def set_trace():
+	Wdb().set_trace()
 
 # Post-Mortem interface
 
@@ -304,6 +306,4 @@
 TESTCMD = 'import x; x.main()'
 
 def test():
-	import linecache
-	linecache.checkcache()
 	run(TESTCMD)
diff --git a/Lib/string.py b/Lib/string.py
index afe5bec..a37cbf0 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -95,30 +95,18 @@
 
 # Find substring, raise exception if not found
 index_error = 'substring not found in string.index'
-def index(s, sub, *args):
-	if args:
-		if len(args) > 1:
-			raise TypeError, 'string.index(): too many args'
-		i = args[0]
-		if i < 0: i = i + len(s)
-	else:
-		i = 0
+def index(s, sub, i = 0):
+	if i < 0: i = i + len(s)
 	n = len(sub)
 	m = len(s) + 1 - n
 	while i < m:
 		if sub == s[i:i+n]: return i
 		i = i+1
-	raise index_error, (s, sub) + args
+	raise index_error, (s, sub, i)
 
 # Find last substring, raise exception if not found
-def rindex(s, sub, *args):
-	if args:
-		if len(args) > 1:
-			raise TypeError, 'string.rindex(): too many args'
-		i = args[0]
-		if i < 0: i = i + len(s)
-	else:
-		i = 0
+def rindex(s, sub, i = 0):
+	if i < 0: i = i + len(s)
 	n = len(sub)
 	m = len(s) + 1 - n
 	r = None
@@ -126,20 +114,35 @@
 		if sub == s[i:i+n]: r = i
 		i = i+1
 	if r is None:
-		raise index_error, (s, sub) + args
+		raise index_error, (s, sub, i)
+	return r
+
+# Count non-overlapping occurrences of substring
+def count(s, sub, i = 0):
+	if i < 0: i = i + len(s)
+	n = len(sub)
+	m = len(s) + 1 - n
+	if n == 0: return m-i
+	r = 0
+	while i < m:
+		if sub == s[i:i+n]:
+			r = r+1
+			i = i+n
+		else:
+			i = i+1
 	return r
 
 # Find substring, return -1 if not found
-def find(*args):
+def find(s, sub, i = 0):
 	try:
-		return apply(index, args)
+		return index(s, sub, i)
 	except index_error:
 		return -1
 
 # Find last substring, return -1 if not found
-def rfind(*args):
+def rfind(s, sub, i = 0):
 	try:
-		return apply(rindex, args)
+		return rindex(s, sub, i)
 	except index_error:
 		return -1
 
@@ -157,7 +160,7 @@
 	if regex.match('[0-9]*\(\.[0-9]*\)?\([eE][-+]?[0-9]+\)?', s) != len(s):
 		raise atof_error, str
 	try:
-		return eval(sign + s)
+		return float(eval(sign + s))
 	except SyntaxError:
 		raise atof_error, str
 
@@ -242,12 +245,36 @@
 # it redefines some string operations that are 100-1000 times faster.
 # It also defines values for whitespace, lowercase and uppercase
 # that match <ctype.h>'s definitions.
-# The manipulation with index_error is needed for compatibility.
 
 try:
 	from strop import *
 	letters = lowercase + uppercase
+except ImportError:
+	pass # Use the original, slow versions
+
+# If certain functions are found, redefine the corresponding exceptions
+# as ValueError
+
+try:
 	from strop import index
 	index_error = ValueError
 except ImportError:
 	pass # Use the original, slow versions
+
+try:
+	from strop import atoi
+	atoi_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
+
+try:
+	from strop import atof
+	atof_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
+
+try:
+	from strop import atol
+	atol_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
diff --git a/Lib/stringold.py b/Lib/stringold.py
index afe5bec..a37cbf0 100644
--- a/Lib/stringold.py
+++ b/Lib/stringold.py
@@ -95,30 +95,18 @@
 
 # Find substring, raise exception if not found
 index_error = 'substring not found in string.index'
-def index(s, sub, *args):
-	if args:
-		if len(args) > 1:
-			raise TypeError, 'string.index(): too many args'
-		i = args[0]
-		if i < 0: i = i + len(s)
-	else:
-		i = 0
+def index(s, sub, i = 0):
+	if i < 0: i = i + len(s)
 	n = len(sub)
 	m = len(s) + 1 - n
 	while i < m:
 		if sub == s[i:i+n]: return i
 		i = i+1
-	raise index_error, (s, sub) + args
+	raise index_error, (s, sub, i)
 
 # Find last substring, raise exception if not found
-def rindex(s, sub, *args):
-	if args:
-		if len(args) > 1:
-			raise TypeError, 'string.rindex(): too many args'
-		i = args[0]
-		if i < 0: i = i + len(s)
-	else:
-		i = 0
+def rindex(s, sub, i = 0):
+	if i < 0: i = i + len(s)
 	n = len(sub)
 	m = len(s) + 1 - n
 	r = None
@@ -126,20 +114,35 @@
 		if sub == s[i:i+n]: r = i
 		i = i+1
 	if r is None:
-		raise index_error, (s, sub) + args
+		raise index_error, (s, sub, i)
+	return r
+
+# Count non-overlapping occurrences of substring
+def count(s, sub, i = 0):
+	if i < 0: i = i + len(s)
+	n = len(sub)
+	m = len(s) + 1 - n
+	if n == 0: return m-i
+	r = 0
+	while i < m:
+		if sub == s[i:i+n]:
+			r = r+1
+			i = i+n
+		else:
+			i = i+1
 	return r
 
 # Find substring, return -1 if not found
-def find(*args):
+def find(s, sub, i = 0):
 	try:
-		return apply(index, args)
+		return index(s, sub, i)
 	except index_error:
 		return -1
 
 # Find last substring, return -1 if not found
-def rfind(*args):
+def rfind(s, sub, i = 0):
 	try:
-		return apply(rindex, args)
+		return rindex(s, sub, i)
 	except index_error:
 		return -1
 
@@ -157,7 +160,7 @@
 	if regex.match('[0-9]*\(\.[0-9]*\)?\([eE][-+]?[0-9]+\)?', s) != len(s):
 		raise atof_error, str
 	try:
-		return eval(sign + s)
+		return float(eval(sign + s))
 	except SyntaxError:
 		raise atof_error, str
 
@@ -242,12 +245,36 @@
 # it redefines some string operations that are 100-1000 times faster.
 # It also defines values for whitespace, lowercase and uppercase
 # that match <ctype.h>'s definitions.
-# The manipulation with index_error is needed for compatibility.
 
 try:
 	from strop import *
 	letters = lowercase + uppercase
+except ImportError:
+	pass # Use the original, slow versions
+
+# If certain functions are found, redefine the corresponding exceptions
+# as ValueError
+
+try:
 	from strop import index
 	index_error = ValueError
 except ImportError:
 	pass # Use the original, slow versions
+
+try:
+	from strop import atoi
+	atoi_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
+
+try:
+	from strop import atof
+	atof_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
+
+try:
+	from strop import atol
+	atol_error = ValueError
+except ImportError:
+	pass # Use the original, slow versions
diff --git a/Lib/sunos4/FCNTL.py b/Lib/sunos4/FCNTL.py
index 0ba5e67..1256d81 100755
--- a/Lib/sunos4/FCNTL.py
+++ b/Lib/sunos4/FCNTL.py
@@ -1,10 +1,10 @@
+# Generated by h2py from stdin
 _FOPEN = (-1)
 _FREAD = 0x0001
 _FWRITE = 0x0002
 _FNDELAY = 0x0004
 _FAPPEND = 0x0008
-_FMARK = 0x0010
-_FDEFER = 0x0020
+_FSETBLK = 0x0010
 _FASYNC = 0x0040
 _FSHLOCK = 0x0080
 _FEXLOCK = 0x0100
@@ -15,6 +15,8 @@
 _FSYNC = 0x2000
 _FNONBLOCK = 0x4000
 _FNOCTTY = 0x8000
+_FMARK = 0x10000
+_FDEFER = 0x20000
 O_RDONLY = 0
 O_WRONLY = 1
 O_RDWR = 2
@@ -25,7 +27,6 @@
 O_NONBLOCK = _FNONBLOCK
 O_NOCTTY = _FNOCTTY
 O_SYNC = _FSYNC
-O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)
 FAPPEND = _FAPPEND
 FSYNC = _FSYNC
 FASYNC = _FASYNC
@@ -36,6 +37,7 @@
 FWRITE = _FWRITE
 FMARK = _FMARK
 FDEFER = _FDEFER
+FSETBLK = _FSETBLK
 FSHLOCK = _FSHLOCK
 FEXLOCK = _FEXLOCK
 FOPEN = _FOPEN
@@ -62,3 +64,4 @@
 F_WRLCK = 2
 F_UNLCK = 3
 F_UNLKSYS = 4
+O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)
diff --git a/Lib/sunos4/IN.py b/Lib/sunos4/IN.py
index 05188af..a05a944 100755
--- a/Lib/sunos4/IN.py
+++ b/Lib/sunos4/IN.py
@@ -1,8 +1,4 @@
-# Symbolic constants from <netinet/in.h>.
-# These constants are SunOS specific!  (Possibly even SunOS 4.1.1)
-# See demo/scripts/h2py.py for a tool to help generate a version for
-# your system.
-
+# Generated by h2py from /usr/include/netinet/in.h
 IPPROTO_IP = 0
 IPPROTO_ICMP = 1
 IPPROTO_IGMP = 2
diff --git a/Lib/sunos4/SOCKET.py b/Lib/sunos4/SOCKET.py
index c1b8542..65ce4bc 100755
--- a/Lib/sunos4/SOCKET.py
+++ b/Lib/sunos4/SOCKET.py
@@ -1,3 +1,4 @@
+# Generated by h2py from /usr/include/sys/socket.h
 SOCK_STREAM = 1
 SOCK_DGRAM = 2
 SOCK_RAW = 3
diff --git a/Lib/sunos4/WAIT.py b/Lib/sunos4/WAIT.py
new file mode 100755
index 0000000..43612f0
--- /dev/null
+++ b/Lib/sunos4/WAIT.py
@@ -0,0 +1,13 @@
+# Generated by h2py from /usr/include/sys/wait.h
+WUNTRACED = 0004
+WNOHANG = 0100
+WEXITED = 0001
+WTRAPPED = 0002
+WSTOPPED = WUNTRACED
+WCONTINUED = 0010
+WNOWAIT = 0200
+WOPTMASK = (WEXITED|WTRAPPED|WSTOPPED|WCONTINUED|WNOHANG|WNOWAIT)
+WSTOPFLG = 0177
+WCONTFLG = 0177777
+WCOREFLG = 0200
+WSIGMASK = 0177
diff --git a/Lib/sunos4/regen b/Lib/sunos4/regen
index f1482db..8b52d74 100755
--- a/Lib/sunos4/regen
+++ b/Lib/sunos4/regen
@@ -8,4 +8,5 @@
 h2py </usr/include/sys/fcntlcom.h >FCNTL.py
 echo "O_ACCMODE = (O_RDONLY|O_WRONLY|O_RDWR)" >>FCNTL.py
 h2py /usr/include/sys/socket.h
+h2py /usr/include/sys/wait.h
 h2py -i '(u_long)' /usr/include/netinet/in.h
diff --git a/Lib/symbol.py b/Lib/symbol.py
index 1422f12..f3ec122 100755
--- a/Lib/symbol.py
+++ b/Lib/symbol.py
@@ -3,49 +3,49 @@
 single_input = 256
 file_input = 257
 eval_input = 258
-lambda_input = 259
-funcdef = 260
-parameters = 261
-varargslist = 262
-fpdef = 263
-fplist = 264
-stmt = 265
-simple_stmt = 266
-small_stmt = 267
-expr_stmt = 268
-print_stmt = 269
-del_stmt = 270
-pass_stmt = 271
-flow_stmt = 272
-break_stmt = 273
-continue_stmt = 274
-return_stmt = 275
-raise_stmt = 276
-import_stmt = 277
-global_stmt = 278
-access_stmt = 279
-accesstype = 280
-exec_stmt = 281
-compound_stmt = 282
-if_stmt = 283
-while_stmt = 284
-for_stmt = 285
-try_stmt = 286
-except_clause = 287
-suite = 288
-test = 289
-and_test = 290
-not_test = 291
-comparison = 292
-comp_op = 293
-expr = 294
-xor_expr = 295
-and_expr = 296
-shift_expr = 297
-arith_expr = 298
-term = 299
-factor = 300
-atom = 301
+funcdef = 259
+parameters = 260
+varargslist = 261
+fpdef = 262
+fplist = 263
+stmt = 264
+simple_stmt = 265
+small_stmt = 266
+expr_stmt = 267
+print_stmt = 268
+del_stmt = 269
+pass_stmt = 270
+flow_stmt = 271
+break_stmt = 272
+continue_stmt = 273
+return_stmt = 274
+raise_stmt = 275
+import_stmt = 276
+global_stmt = 277
+access_stmt = 278
+accesstype = 279
+exec_stmt = 280
+compound_stmt = 281
+if_stmt = 282
+while_stmt = 283
+for_stmt = 284
+try_stmt = 285
+except_clause = 286
+suite = 287
+test = 288
+and_test = 289
+not_test = 290
+comparison = 291
+comp_op = 292
+expr = 293
+xor_expr = 294
+and_expr = 295
+shift_expr = 296
+arith_expr = 297
+term = 298
+factor = 299
+atom = 300
+lambdef = 301
 trailer = 302
 subscript = 303
 exprlist = 304
diff --git a/Lib/test/test_b1.py b/Lib/test/test_b1.py
index 434b379..5eb4f09 100644
--- a/Lib/test/test_b1.py
+++ b/Lib/test/test_b1.py
@@ -97,6 +97,22 @@
 	raise TestFailed, 'filter (remove false values)'
 if filter(lambda x: x > 0, [1, -3, 9, 0, 2]) <> [1, 9, 2]:
 	raise TestFailed, 'filter (keep positives)'
+class Squares:
+	def __init__(self, max):
+		self.max = max
+		self.sofar = []
+	def __len__(self): return len(self.sofar)
+	def __getitem__(self, i):
+		if not 0 <= i < self.max: raise IndexError
+		n = len(self.sofar)
+		while n <= i:
+			self.sofar.append(n*n)
+			n = n+1
+		return self.sofar[i]
+if filter(None, Squares(10)) != [1, 4, 9, 16, 25, 36, 49, 64, 81]:
+	raise TestFailed, 'filter(None, Squares(10))'
+if filter(lambda x: x%2, Squares(10)) != [1, 9, 25, 49, 81]:
+	raise TestFailed, 'filter(oddp, Squares(10))'
 
 print 'float'
 if float(3.14) <> 3.14: raise TestFailed, 'float(3.14)'
@@ -158,6 +174,14 @@
 	raise TestFailed, 'map(plus, [1, 3, 7], [4, 9, 2])'
 if map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0]) <> [1+4+1, 3+9+1, 7+2+0]:
 	raise TestFailed, 'map(plus, [1, 3, 7], [4, 9, 2], [1, 1, 0])'
+if map(None, Squares(10)) != [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]:
+	raise TestFailed, 'map(None, Squares(10))'
+if map(int, Squares(10)) != [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]:
+	raise TestFailed, 'map(int, Squares(10))'
+if map(None, Squares(3), Squares(2)) != [(0,0), (1,1), (4,None)]:
+	raise TestFailed, 'map(None: x, Squares(3), Squares(2))'
+if map(max, Squares(3), Squares(2)) != [0, 1, 4]:
+	raise TestFailed, 'map(None: x, Squares(3), Squares(2))'
 
 print 'max'
 if max('123123') <> '3': raise TestFailed, 'max(\'123123\')'
diff --git a/Lib/test/test_b2.py b/Lib/test/test_b2.py
index 7118b08..10c0bfb 100644
--- a/Lib/test/test_b2.py
+++ b/Lib/test/test_b2.py
@@ -121,6 +121,25 @@
 	raise TestFailed, 'reduce(): compute 7!'
 if reduce(lambda x, y: x*y, range(2,21), 1L) <> 2432902008176640000L:
 	raise TestFailed, 'reduce(): compute 20!, use long'
+class Squares:
+	def __init__(self, max):
+		self.max = max
+		self.sofar = []
+	def __len__(self): return len(self.sofar)
+	def __getitem__(self, i):
+		if not 0 <= i < self.max: raise IndexError
+		n = len(self.sofar)
+		while n <= i:
+			self.sofar.append(n*n)
+			n = n+1
+		return self.sofar[i]
+if reduce(lambda x, y: x+y, Squares(10)) != 285:
+	raise TestFailed, 'reduce(<+>, Squares(10))'
+if reduce(lambda x, y: x+y, Squares(10), 0) != 285:
+	raise TestFailed, 'reduce(<+>, Squares(10), 0)'
+if reduce(lambda x, y: x+y, Squares(0), 0) != 0:
+	raise TestFailed, 'reduce(<+>, Squares(0), 0)'
+
 
 print 'reload'
 import string
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 0988574..67baf09 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -41,7 +41,7 @@
 		raise TestFailed, \
 			  'No OverflowError on huge integer literal ' + `s`
 elif eval('maxint == 9223372036854775807'):
-	if eval('9223372036854775807-1 != -01000000000000000000000'):
+	if eval('-9223372036854775807-1 != 01000000000000000000000'):
 		raise TestFailed, 'max negative int'
 	if eval('01777777777777777777777') != -1: raise TestFailed, 'oct -1'
 	if eval('0xffffffffffffffff') != -1: raise TestFailed, 'hex -1'
@@ -91,9 +91,35 @@
 x = "doesn't \"shrink\" does it"
 y = 'doesn\'t "shrink" does it'
 assert(len(x) == 24 and x == y)
-x = "doesn \"shrink\" doesn't it"
-y = 'doesn "shrink" doesn\'t it'
-assert(len(x) == 25 and x == y)
+x = "does \"shrink\" doesn't it"
+y = 'does "shrink" doesn\'t it'
+assert(len(x) == 24 and x == y)
+x = """
+The "quick"
+brown fox
+jumps over
+the 'lazy' dog.
+"""
+y = '\nThe "quick"\nbrown fox\njumps over\nthe \'lazy\' dog.\n'
+assert(x == y)
+y = '''
+The "quick"
+brown fox
+jumps over
+the 'lazy' dog.
+'''; assert(x == y)
+y = "\n\
+The \"quick\"\n\
+brown fox\n\
+jumps over\n\
+the 'lazy' dog.\n\
+"; assert(x == y)
+y = '\n\
+The \"quick\"\n\
+brown fox\n\
+jumps over\n\
+the \'lazy\' dog.\n\
+'; assert(x == y)
 
 
 print '1.2 Grammar'
@@ -113,7 +139,8 @@
 print 'funcdef'
 ### 'def' NAME parameters ':' suite
 ### parameters: '(' [varargslist] ')'
-### varargslist: (fpdef ',')* '*' NAME | fpdef (',' fpdef)* [',']
+### varargslist: (fpdef ['=' test] ',')* '*' NAME
+###            | fpdef ['=' test] (',' fpdef ['=' test])* [',']
 ### fpdef: NAME | '(' fplist ')'
 ### fplist: fpdef (',' fpdef)* [',']
 def f1(): pass
@@ -126,6 +153,54 @@
 def v1(a, *rest): pass
 def v2(a, b, *rest): pass
 def v3(a, (b, c), *rest): pass
+def d01(a=1): pass
+d01()
+d01(1)
+def d11(a, b=1): pass
+d11(1)
+d11(1, 2)
+def d21(a, b, c=1): pass
+d21(1, 2)
+d21(1, 2, 3)
+def d02(a=1, b=2): pass
+d02()
+d02(1)
+d02(1, 2)
+def d12(a, b=1, c=2): pass
+d12(1)
+d12(1, 2)
+d12(1, 2, 3)
+def d22(a, b, c=1, d=2): pass
+d22(1, 2)
+d22(1, 2, 3)
+d22(1, 2, 3, 4)
+def d01v(a=1, *rest): pass
+d01v()
+d01v(1)
+d01v(1, 2)
+def d11v(a, b=1, *rest): pass
+d11v(1)
+d11v(1, 2)
+d11v(1, 2, 3)
+def d21v(a, b, c=1, *rest): pass
+d21v(1, 2)
+d21v(1, 2, 3)
+d21v(1, 2, 3, 4)
+def d02v(a=1, b=2, *rest): pass
+d02v()
+d02v(1)
+d02v(1, 2)
+d02v(1, 2, 3)
+def d12v(a, b=1, c=2, *rest): pass
+d12v(1)
+d12v(1, 2)
+d12v(1, 2, 3)
+d12v(1, 2, 3, 4)
+def d22v(a, b, c=1, d=2, *rest): pass
+d22v(1, 2)
+d22v(1, 2, 3)
+d22v(1, 2, 3, 4)
+d22v(1, 2, 3, 4, 5)
 
 ### stmt: simple_stmt | compound_stmt
 # Tested below
@@ -184,17 +259,11 @@
 except KeyboardInterrupt: pass
 
 print 'import_stmt' # 'import' NAME (',' NAME)* | 'from' NAME 'import' ('*' | NAME (',' NAME)*)
-[1]
 import sys
-[2]
 import time, math
-[3]
-from time import sleep
-[4]
+from time import time
 from sys import *
-[5]
 from math import sin, cos
-[6]
 
 print 'global_stmt' # 'global' NAME (',' NAME)*
 def f():
@@ -242,24 +311,41 @@
 else: pass
 
 print 'for_stmt' # 'for' exprlist 'in' exprlist ':' suite ['else' ':' suite]
-[1]
 for i in 1, 2, 3: pass
-[2]
 for i, j, k in (): pass
 else: pass
-[3]
+class Squares:
+	def __init__(self, max):
+		self.max = max
+		self.sofar = []
+	def __len__(self): return len(self.sofar)
+	def __getitem__(self, i):
+		if not 0 <= i < self.max: raise IndexError
+		n = len(self.sofar)
+		while n <= i:
+			self.sofar.append(n*n)
+			n = n+1
+		return self.sofar[i]
+n = 0
+for x in Squares(10): n = n+x
+if n != 285: raise TestFailed, 'for over growing sequence'
 
-print 'try_stmt' # 'try' ':' suite (except_clause ':' suite)+ | 'try' ':' suite 'finally' ':' suite
+print 'try_stmt'
+### try_stmt: 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
+###         | 'try' ':' suite 'finally' ':' suite
 ### except_clause: 'except' [expr [',' expr]]
 try:
 	1/0
 except ZeroDivisionError:
 	pass
+else:
+	pass
 try: 1/0
 except EOFError: pass
 except TypeError, msg: pass
 except RuntimeError, msg: pass
 except: pass
+else: pass
 try: 1/0
 except (EOFError, TypeError, ZeroDivisionError): pass
 try: 1/0
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 0a43de3..6a3f772 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -67,6 +67,10 @@
 if (-12) + (-24) <> -36: raise TestFailed, 'int op'
 if not 12 < 24: raise TestFailed, 'int op'
 if not -24 < -12: raise TestFailed, 'int op'
+# Test for a particular bug in integer multiply
+xsize, ysize, zsize = 238, 356, 4
+if not (xsize*ysize*zsize == zsize*xsize*ysize == 338912):
+	raise TestFailed, 'int mul commutativity'
 print '6.4.2 Long integers'
 if 12L + 24L <> 36L: raise TestFailed, 'long op'
 if 12L + (-24L) <> -12L: raise TestFailed, 'long op'
@@ -94,6 +98,8 @@
 if min('abc') <> 'a' or max('abc') <> 'c': raise TestFailed, 'min/max string'
 if 'a' in 'abc' and 'b' in 'abc' and 'c' in 'abc' and 'd' not in 'abc': pass
 else: raise TestFailed, 'in/not in string'
+x = 'x'*103
+if '%s!'%x != x+'!': raise TestFailed, 'nasty string formatting bug'
 
 print '6.5.2 Tuples'
 if len(()) <> 0: raise TestFailed, 'len(())'
diff --git a/Lib/test/testall.out b/Lib/test/testall.out
index 46a728e..b921512 100644
--- a/Lib/test/testall.out
+++ b/Lib/test/testall.out
@@ -15,8 +15,6 @@
 funcdef
 simple_stmt
 expr_stmt
-1
-(1, 2, 3)
 print_stmt
 1 2 3
 1 2 3
@@ -29,20 +27,11 @@
 return_stmt
 raise_stmt
 import_stmt
-[1]
-[2]
-[3]
-[4]
-[5]
-[6]
 global_stmt
 exec_stmt
 if_stmt
 while_stmt
 for_stmt
-[1]
-[2]
-[3]
 try_stmt
 suite
 test
diff --git a/Lib/tzparse.py b/Lib/tzparse.py
index 26824ab..ef325e9 100644
--- a/Lib/tzparse.py
+++ b/Lib/tzparse.py
@@ -12,7 +12,7 @@
 	if tzprog == None:
 		import regex
 		tzprog = regex.compile(tzpat)
-	if not tzprog.match(tzstr):
+	if tzprog.match(tzstr) < 0:
 		raise ValueError, 'not the TZ syntax I understand'
 	regs = tzprog.regs
 	subs = []
@@ -78,5 +78,3 @@
 		x = localtime(t)
 		tm = x[:-1] + (0,)
 		print 'd =', d, 't =', t, '=', asctime(tm), x[-1]
-
-test()
diff --git a/Lib/whrandom.py b/Lib/whrandom.py
index c7881b5..670ca7a 100644
--- a/Lib/whrandom.py
+++ b/Lib/whrandom.py
@@ -35,31 +35,25 @@
 	# Without arguments, initialize from current time.
 	# With arguments (x, y, z), initialize from them.
 	#
-	def __init__(self, *xyz):
-		if not xyz:
+	def __init__(self, x = None, y = None, z = None):
+		if x is None:
 			# Initialize from current time
 			import time
 			t = int(time.time())
 			t, x = divmod(t, 256)
 			t, y = divmod(t, 256)
 			t, z = divmod(t, 256)
-		else:
-			# Initialize from arguments (x, y, z)
-			x, y, z = xyz
 		self.seed(x, y, z)
 	#
 	# Set the seed from (x, y, z).
 	# These must be integers in the range [0, 256).
 	#
-	def seed(self, *xyz):
-		if type(xyz) <> type(()) or len(xyz) <> 3:
-			raise TypeError, '3 seeds required'
-		x, y, z = xyz
+	def seed(self, x, y, z):
 		if not type(x) == type(y) == type(z) == type(0):
 			raise TypeError, 'seeds must be integers'
 		if not 0 <= x < 256 and 0 <= y < 256 and 0 <= z < 256:
 			raise ValueError, 'seeds must be in range(0, 256)'
-		self._seed = xyz
+		self._seed = (x, y, z)
 	#
 	# Get the next random number in the range [0.0, 1.0).
 	#
diff --git a/Modules/Makefile.pre.in b/Modules/Makefile.pre.in
index e8e4a20..0b4fa5b 100644
--- a/Modules/Makefile.pre.in
+++ b/Modules/Makefile.pre.in
@@ -1,39 +1,46 @@
-# NOTE: Makefile.in.in is converted into Makefile.in by running the
-# makesetup script in the current directory.  Makefile.in is converted
-# into Makefile by the configure script in the toplevel directory.
-# Once Makefile exists, it can be brought up to date by running
-# "make Makefile".
+# META-NOTE: this note is different from the note in the other Makefiles!
+# NOTE: Makefile.pre.in is converted into Makefile.pre by the configure
+# script in the toplevel directory or by ../config.status.
+# Makefile.pre is converted into Makefile by running the makesetup
+# script in the source directory.  Once Makefile exists, it can be
+# brought up to date by running "make Makefile".  (The makesetup also
+# creates config.c from config.c.in in the source directory.)
 
-# === Variables set by ./makesetup ===
+# === Variables set by makesetup ===
 
 MODOBJS=	@MODOBJS@
 MODLIBS=	@MODLIBS@
-MODCPPS=	@MODCPPS@
 
-# === Definitions added by ./makesetup ===
+# === Definitions added by makesetup ===
 
-# === Variables set by $(TOP)/configure ===
+# === Variables set by configure ===
 
 srcdir=		@srcdir@
 VPATH=		@srcdir@
 
 CC=		@CC@
 RANLIB=		@RANLIB@
+AR=		@AR@
+
 DEFS=		@DEFS@
 LIBS=		@LIBS@
+LIBM=		@LIBM@
+LIBC=		@LIBC@
+
+# Install prefix, may be changed by configure
+prefix=		/usr/local
 
 
 # === Variables that are customizable by hand ===
 
-TOP=		..
-INCLDIR=	$(TOP)/Include
-OPT=		-g
-CFLAGS=		$(OPT) -I$(INCLDIR) $(DEFS)
+INCLDIR=	$(srcdir)/../Include
+OPT=		-O
+CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
 
-AR=		ar
 MKDEP=		mkdep
 SHELL=		/bin/sh
 
+MAKESETUP=	$(srcdir)/makesetup
 
 # === Fixed definitions ===
 
@@ -46,46 +53,88 @@
 		../Objects/libObjects.a \
 		../Parser/libParser.a
 
-SYSLIBS=	$(MODLIBS) -lm
+SYSLIBS=	$(LIBM) $(LIBC)
 
 
 # === Rules ===
 
-all:		$(LIB) $(TOP)/python
+all:		$(LIB) ../python
 
 $(LIB):		$(OBJS)
 		$(AR) cr $(LIB) $(OBJS)
 		$(RANLIB) $(LIB)
 
-$(TOP)/python:	config.o $(MYLIBS)
-		$(CC) config.o $(MYLIBS) $(LIBS) $(SYSLIBS) -o python
-		mv python $(TOP)/python
+../python:	config.o $(MYLIBS)
+		$(CC) config.o $(MYLIBS) $(MODLIBS) $(LIBS) $(SYSLIBS) -o python
+		mv python ../python
 
-config.o:	Makefile
+config.o:	config.c Makefile
+		$(CC) $(CFLAGS) -DPYTHONPATH=\"$(PYTHONPATH)\" -c config.c
 
 clean:
 		-rm -f *.o python core *~ [@,#]* *.old *.orig *.rej
 
 clobber:	clean
-		-rm -f *.a tags TAGS
+		-rm -f *.a tags TAGS config.c glmodule.c Makefile.pre
 
-Makefile:	Makefile.in $(TOP)/config.status
-		CONFIG_FILES=Makefile CONFIG_HEADERS= \
-		$(SHELL) $(TOP)/config.status
+config.c Makefile: Makefile.pre config.c.in $(MAKESETUP) Setup
+		$(SHELL) $(MAKESETUP) Setup
 
-config.c Makefile.in:	Makefile.in.in config.c.in Setup makesetup
-		$(SHELL) ./makesetup Setup
+Setup:
+		cp $(srcdir)/Setup.in Setup
+
+Makefile.pre:	Makefile.pre.in ../config.status
+		(cd ..; CONFIG_FILES=Modules/Makefile.pre CONFIG_HEADERS= \
+		$(SHELL) config.status)
 
 depend:
-		$(MKDEP) $(CFLAGS) \
-			`echo $(OBJS) | tr ' ' '\012' | sed 's/\.o/.c/'`
+		$(MKDEP) $(CFLAGS) `echo $(OBJS) | tr ' ' '\012' | \
+					sed 's|\(.*\)\.o|$(srcdir)/\1.c|'`
 
-.PRECIOUS:	Makefile.in Makefile config.c
+.PRECIOUS:	../python
 
-glmodule.c:	cgen.py cstubs
-		python cgen.py <cstubs >glmodule.c
+glmodule.c:	$(srcdir)/cgen.py $(srcdir)/cstubs
+		python $(srcdir)/cgen.py <$(srcdir)/cstubs >glmodule.c
 
-# === Rules added by ./makesetup ===
+almodule.o: almodule.c
+arraymodule.o: arraymodule.c
+audioopmodule.o: audioopmodule.c
+cdmodule.o: cdmodule.c
+clmodule.o: clmodule.c
+dbmmodule.o: dbmmodule.c
+fcntlmodule.o: fcntlmodule.c
+flmodule.o: flmodule.c
+fmmodule.o: fmmodule.c
+glmodule.o: glmodule.c
+imageopmodule.o: imageopmodule.c
+imgfilemodule.o: imgfilemodule.c
+mathmodule.o: mathmodule.c
+md5c.o: md5c.c
+md5module.o: md5module.c
+mpzmodule.o: mpzmodule.c
+nismodule.o: nismodule.c
+parsermodule.o: parsermodule.c
+posixmodule.o: posixmodule.c
+pwdmodule.o: pwdmodule.c
+regexmodule.o: regexmodule.c
+regexpr.o: regexpr.c
+rgbimgmodule.o: rgbimgmodule.c
+rotormodule.o: rotormodule.c
+selectmodule.o: selectmodule.c
+sgimodule.o: sgimodule.c
+socketmodule.o: socketmodule.c
+stdwinmodule.o: stdwinmodule.c
+stropmodule.o: stropmodule.c
+structmodule.o: structmodule.c
+sunaudiodevmodule.o: sunaudiodevmodule.c
+svmodule.o: svmodule.c
+threadmodule.o: threadmodule.c
+timemodule.o: timemodule.c
+timingmodule.o: timingmodule.c
+xxmodule.o: xxmodule.c
+yuvconvert.o: yuvconvert.c
+
+# === Rules added by makesetup ===
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
 # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/Modules/Setup.in b/Modules/Setup.in
index 7dd40fd..f7b5bace 100644
--- a/Modules/Setup.in
+++ b/Modules/Setup.in
@@ -1,7 +1,16 @@
-# This file is used by the makesetup script to construct Makefile.in
-# and config.c, from Makefile.in.in (sic!) and config.c.in,
-# respectively.
-#
+# The file Setup is used by the makesetup script to construct the files
+# Makefile and config.c, from Makefile.pre and config.c.in,
+# respectively.  The file Setup itself is initially copied from
+# Setup.in; once it exists it will not be overwritten, so you can edit
+# Setup to your heart's content.  One possibility is to overwrite it
+# with a copy of Setup.sgi or Setup.sunos[45] before you start editing.
+# Note that Makefile.pre is created from Makefile.pre.in by the toplevel
+# configure script.
+
+# (VPATH notes: Setup and Makefile.pre are in the build directory, as
+# are Makefile and config.c; Setup.in and config.c.in are in the source
+# directory.)
+
 # Each line in this file describes one or more optional modules.
 # Comment out lines to suppress modules.
 # Lines have the following structure:
@@ -19,7 +28,7 @@
 # <name> = <value>
 #
 # which defines a Make variable definition inserted into Makefile.in
-#
+
 # NOTE: As a standard policy, as many modules as can be supported by a
 # platform should be present.  The distribution comes with all modules
 # enabled that are supported by most platforms and don't require you
@@ -28,6 +37,28 @@
 # to use Setup.sgi instead of Setup).
 
 
+# Some special rules to define PYTHONPATH.
+# Edit the definitions below to indicate which options you are using.
+# Don't add any whitespace or comments!
+
+# Don't edit this (usually)
+DESTLIB=$(prefix)/lib/python
+
+# Standard enabled (tests are always available)
+TESTPATH=:$(DESTLIB)/test
+
+# Enable this for SGI systems
+#ARCHPATH=:$(DESTLIB)/sgi
+
+# Enable this for Sun systems
+#ARCHPATH=:$(DESTLIB)/sun4
+
+# Enable this if stdwin installed
+#STDWINPATH=:$(DESTLIB)/stdwin
+
+PYTHONPATH=.:$(DESTLIB)$(TESTPATH)$(ARCHPATH)$(STDWINPATH)
+
+
 # Modules that should always be present (non UNIX dependent)
 
 array arraymodule.o	# array objects
@@ -41,18 +72,25 @@
 
 
 # Modules with some UNIX dependencies -- on by default.
-# Note that some UNIX versions still don't support all of these
-# so you may have to comment them out before the build completes.
+# (If you have a really backward UNIX, select and socket may not be
+# supported...)
 
-dbm dbmmodule.o		# dbm(3) may require -ldbm or similar
 fcntl fcntlmodule.o	# fcntl(2) and ioctl(2)
-nis nismodule.o		# Sun yellow pages -- not everywhere
-pwd grp pwdmodule.o	# pwd(3) and grp(3)
+pwd pwdmodule.o		# pwd(3) 
+grp grpmodule.o		# grp(3)
+crypt cryptmodule.o	# crypt(3)
 select selectmodule.o	# select(2); not on ancient System V
 socket socketmodule.o	# socket(2); not on ancient System V
 
 
-# Multimedia modules -- off by default
+# Some more UNIX dependent modules -- off by default, since these
+# are not supported by all UNIX systems.
+
+#dbm dbmmodule.o 	# dbm(3) may require -lndbm or similar
+#nis nismodule.o 	# Sun yellow pages -- not everywhere
+
+
+# Multimedia modules -- on by default.
 # These represent audio samples or images as strings
 
 audioop audioopmodule.o # Operations on audio samples
@@ -69,7 +107,7 @@
 # "-lX11_s".
 
 #STDWIN=/ufs/guido/src/stdwin
-#ARCH=sgi
+#ARCH=???
 #stdwin stdwinmodule.o -I$(STDWIN)/H $(STDWIN)/Build/$(ARCH)/x11/lib/lib.a -lX11
 
 
@@ -81,10 +119,12 @@
 
 
 # The mpz module interfaces to the GNU Multiple Precision library.
-# You need to ftp the GNU MP library.  This was last tested with a
-# somewhat modified (to get around bugs) version of GMP 1.2; it will
-# likely need some work for more recent versions.  The GMP variable
-# must point to the GMP source directory.
+# You need to ftp the GNU MP library.  
+# The GMP variable must point to the GMP source directory.
+# This was originally written and tested against GMP 1.2.  I have
+# compiled it against GMP 1.3.2 (the latest I believe) and it seems to
+# work OK, but I haven't tested it thoroughly (lacking knowledge about
+# it).
 
 #GMP=/ufs/guido/src/gmp
 #mpz mpzmodule.o -I$(GMP) $(GMP)/libgmp.a
@@ -102,12 +142,13 @@
 # installed; you may be better off switching on only 'fm' and 'gl'
 # (Font Manager and Graphics Library).
 
-#al almodule.o -laudio		# audio
-#cd cdmodule.o -lcdaudio -lds	#
-#cl clmodule.o -lcl
+#                               # ADD THESE FOR IRIX5:
+#al almodule.o -laudio
+#cd cdmodule.o -lcdaudio -lds	# -lmediad
+#cl clmodule.o -lcl		# -lawareaudio
 #fm fmmodule.o -lfm_s -lgl_s
-#gl glmodule.o -lgl_s
-#imgfile imgfilemodule.o -limage -lgutil -lm
+#gl glmodule.o -lgl_s -lX11_s
+#imgfile imgfilemodule.o -limage -lgutil
 #sgi sgimodule.o
 #sv svmodule.o yuvconvert.o -lsvideo -lXext -lX11_s
 
@@ -134,6 +175,34 @@
 # thread threadmodule.o
 
 
+# GNN's timing module
+# timing timingmodule.o
+
+
+# Lance Ellinghouse's signal module
+# signal signalmodule.o
+
+
+# Tommy Burnette's 'new' module (creates new empty objects of certain kinds)
+# new newmodule.o
+
+
+# John Redford's sybase module
+# sybase sybasemodule.o
+
+
+# Generic (SunOS / SVR4) dynamic loading module
+# dl dlmodule.o
+
+
+# Jack Jansen's imgformat module
+# imgformat imgformatmodule.o
+
+
+# Lance Ellinghouse's syslog module
+# syslog syslogmodule.o
+
+
 # Example -- included for reference only
 
 # xx xxmodule.o
diff --git a/Modules/almodule.c b/Modules/almodule.c
index d731eff..2ab60d4 100644
--- a/Modules/almodule.c
+++ b/Modules/almodule.c
@@ -1,5 +1,5 @@
 /**********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -24,7 +24,7 @@
 
 /* AL module -- interface to Mark Callow's Audio Library (AL). */
 
-#include "audio.h"
+#include <audio.h>
 
 /* Check which version audio library we have: */
 #ifdef AL_ERROR_NUMBER
@@ -50,7 +50,7 @@
 	ALconfig ob_config;
 } configobject;
 
-extern typeobject Configtype; /* Forward */
+staticforward typeobject Configtype;
 
 #define is_configobject(v) ((v)->ob_type == &Configtype)
 
@@ -184,17 +184,17 @@
 #endif /* AL_405 */
 	
 static struct methodlist config_methods[] = {
-	{"getqueuesize",	al_getqueuesize},
-	{"setqueuesize",	al_setqueuesize},
-	{"getwidth",		al_getwidth},
-	{"setwidth",		al_setwidth},
-	{"getchannels",		al_getchannels},
-	{"setchannels",		al_setchannels},
+	{"getqueuesize",	(method)al_getqueuesize},
+	{"setqueuesize",	(method)al_setqueuesize},
+	{"getwidth",		(method)al_getwidth},
+	{"setwidth",		(method)al_setwidth},
+	{"getchannels",		(method)al_getchannels},
+	{"setchannels",		(method)al_setchannels},
 #ifdef AL_405
-	{"getsampfmt",		al_getsampfmt},
-	{"setsampfmt",		al_setsampfmt},
-	{"getfloatmax",		al_getfloatmax},
-	{"setfloatmax",		al_setfloatmax},
+	{"getsampfmt",		(method)al_getsampfmt},
+	{"setsampfmt",		(method)al_setsampfmt},
+	{"getfloatmax",		(method)al_getfloatmax},
+	{"setfloatmax",		(method)al_setfloatmax},
 #endif /* AL_405 */
 	{NULL,			NULL}		/* sentinel */
 };
@@ -215,16 +215,16 @@
 	return findmethod(config_methods, (object *)self, name);
 }
 
-typeobject Configtype = {
+static typeobject Configtype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"config",		/*tp_name*/
 	sizeof(configobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	config_dealloc,		/*tp_dealloc*/
+	(destructor)config_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	config_getattr,		/*tp_getattr*/
+	(getattrfunc)config_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -250,7 +250,7 @@
 	ALport ob_port;
 } portobject;
 
-extern typeobject Porttype; /* Forward */
+staticforward typeobject Porttype;
 
 #define is_portobject(v) ((v)->ob_type == &Porttype)
 
@@ -489,20 +489,19 @@
 #endif /* AL_405 */
 
 static struct methodlist port_methods[] = {
-	{"closeport",		al_closeport},
-	{"close",		al_closeport},
-	{"getfd",		al_getfd},
-        {"fileno",		al_getfd},
-	{"getfilled",		al_getfilled},
-	{"getfillable",		al_getfillable},
-	{"readsamps",		al_readsamps},
-	{"writesamps",		al_writesamps},
-	{"setfillpoint",	al_setfillpoint},
-	{"getfillpoint",	al_getfillpoint},
-	{"setconfig",		al_setconfig},
-	{"getconfig",		al_getconfig},
+	{"closeport",		(method)al_closeport},
+	{"getfd",		(method)al_getfd},
+        {"fileno",		(method)al_getfd},
+	{"getfilled",		(method)al_getfilled},
+	{"getfillable",		(method)al_getfillable},
+	{"readsamps",		(method)al_readsamps},
+	{"writesamps",		(method)al_writesamps},
+	{"setfillpoint",	(method)al_setfillpoint},
+	{"getfillpoint",	(method)al_getfillpoint},
+	{"setconfig",		(method)al_setconfig},
+	{"getconfig",		(method)al_getconfig},
 #ifdef AL_405
-	{"getstatus",		al_getstatus},
+	{"getstatus",		(method)al_getstatus},
 #endif /* AL_405 */	    
 	{NULL,			NULL}		/* sentinel */
 };
@@ -524,16 +523,16 @@
 	return findmethod(port_methods, (object *)p, name);
 }
 
-typeobject Porttype = {
+static typeobject Porttype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"port",			/*tp_name*/
 	sizeof(portobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	port_dealloc,		/*tp_dealloc*/
+	(destructor)port_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	port_getattr,		/*tp_getattr*/
+	(getattrfunc)port_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -736,14 +735,14 @@
 }
 
 static struct methodlist al_methods[] = {
-	{"openport",		al_openport},
-	{"newconfig",		al_newconfig},
-	{"queryparams",		al_queryparams},
-	{"getparams",		al_getparams},
-	{"setparams",		al_setparams},
-	{"getname",		al_getname},
-	{"getdefault",		al_getdefault},
-	{"getminmax",		al_getminmax},
+	{"openport",		(method)al_openport},
+	{"newconfig",		(method)al_newconfig},
+	{"queryparams",		(method)al_queryparams},
+	{"getparams",		(method)al_getparams},
+	{"setparams",		(method)al_setparams},
+	{"getname",		(method)al_getname},
+	{"getdefault",		(method)al_getdefault},
+	{"getminmax",		(method)al_getminmax},
 	{NULL,			NULL}		/* sentinel */
 };
 
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 925a52d..4b89ad9 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -30,22 +30,7 @@
 #include "allobjects.h"
 #include "modsupport.h"
 #include "ceval.h"
-
-#ifdef i860
-/* Cray APP doesn't have memmove */
-#define NEED_MEMMOVE
-extern char *memcpy();
-#endif
-
-#if defined(sun) && !defined(__STDC__)
-/* SunOS doesn't have memmove */
-#define NEED_MEMMOVE
-extern char *memcpy();
-#endif
-
-#ifdef NEED_MEMMOVE
-extern char *memmove();
-#endif
+#include <sys/types.h>		/* For size_t */
 
 struct arrayobject; /* Forward */
 
@@ -62,7 +47,7 @@
 	struct arraydescr *ob_descr;
 } arrayobject;
 
-extern typeobject Arraytype;
+staticforward typeobject Arraytype;
 
 #define is_arrayobject(op) ((op)->ob_type == &Arraytype)
 
@@ -252,7 +237,7 @@
 {
 	int i;
 	arrayobject *op;
-	MALLARG nbytes;
+	size_t nbytes;
 	int itemsize;
 	if (size < 0) {
 		err_badcall();
@@ -962,22 +947,22 @@
 }
 
 static struct methodlist array_methods[] = {
-	{"append",	array_append},
-	{"byteswap",	array_byteswap},
-/*	{"count",	array_count},*/
-	{"fromfile",	array_fromfile},
-	{"fromlist",	array_fromlist},
-	{"fromstring",	array_fromstring},
-/*	{"index",	array_index},*/
-	{"insert",	array_insert},
-	{"read",	array_fromfile},
-/*	{"remove",	array_remove},*/
-	{"reverse",	array_reverse},
-/*	{"sort",	array_sort},*/
-	{"tofile",	array_tofile},
-	{"tolist",	array_tolist},
-	{"tostring",	array_tostring},
-	{"write",	array_tofile},
+	{"append",	(method)array_append},
+	{"byteswap",	(method)array_byteswap},
+/*	{"count",	(method)array_count},*/
+	{"fromfile",	(method)array_fromfile},
+	{"fromlist",	(method)array_fromlist},
+	{"fromstring",	(method)array_fromstring},
+/*	{"index",	(method)array_index},*/
+	{"insert",	(method)array_insert},
+	{"read",	(method)array_fromfile},
+/*	{"remove",	(method)array_remove},*/
+	{"reverse",	(method)array_reverse},
+/*	{"sort",	(method)array_sort},*/
+	{"tofile",	(method)array_tofile},
+	{"tolist",	(method)array_tolist},
+	{"tostring",	(method)array_tostring},
+	{"write",	(method)array_tofile},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -1060,65 +1045,51 @@
 		v = array_tostring(a, (object *)NULL);
 		t = reprobject(v);
 		XDECREF(v);
-		joinstring(&s, t);
-		XDECREF(t);
-		t = newstringobject(")");
-		joinstring(&s, t);
-		XDECREF(t);
-		if (err_occurred()) {
-			XDECREF(s);
-			s = NULL;
-		}
+		joinstring_decref(&s, t);
+		joinstring_decref(&s, newstringobject(")"));
 		return s;
 	}
 	sprintf(buf, "array('%c', [", a->ob_descr->typecode);
 	s = newstringobject(buf);
 	comma = newstringobject(", ");
 	for (i = 0; i < len && !err_occurred(); i++) {
+		if (i > 0)
+			joinstring(&s, comma);
 		v = (a->ob_descr->getitem)(a, i);
 		t = reprobject(v);
 		XDECREF(v);
-		if (i > 0)
-			joinstring(&s, comma);
-		joinstring(&s, t);
-		XDECREF(t);
+		joinstring_decref(&s, t);
 	}
 	XDECREF(comma);
-	t = newstringobject("])");
-	joinstring(&s, t);
-	XDECREF(t);
-	if (err_occurred()) {
-		XDECREF(s);
-		s = NULL;
-	}
+	joinstring_decref(&s, newstringobject("])"));
 	return s;
 }
 
 static sequence_methods array_as_sequence = {
-	array_length,	/*sq_length*/
-	array_concat,	/*sq_concat*/
-	array_repeat,	/*sq_repeat*/
-	array_item,	/*sq_item*/
-	array_slice,	/*sq_slice*/
-	array_ass_item,	/*sq_ass_item*/
-	array_ass_slice, /*sq_ass_slice*/
+	(inquiry)array_length,			/*sq_length*/
+	(binaryfunc)array_concat,		/*sq_concat*/
+	(intargfunc)array_repeat,		/*sq_repeat*/
+	(intargfunc)array_item,			/*sq_item*/
+	(intintargfunc)array_slice,		/*sq_slice*/
+	(intobjargproc)array_ass_item,		/*sq_ass_item*/
+	(intintobjargproc)array_ass_slice,	/*sq_ass_slice*/
 };
 
-typeobject Arraytype = {
+static typeobject Arraytype = {
 	OB_HEAD_INIT(&Typetype)
 	0,
 	"array",
 	sizeof(arrayobject),
 	0,
-	array_dealloc,	/*tp_dealloc*/
-	array_print,	/*tp_print*/
-	array_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	array_compare,	/*tp_compare*/
-	array_repr,	/*tp_repr*/
-	0,		/*tp_as_number*/
-	&array_as_sequence,	/*tp_as_sequence*/
-	0,		/*tp_as_mapping*/
+	(destructor)array_dealloc,	/*tp_dealloc*/
+	(printfunc)array_print,		/*tp_print*/
+	(getattrfunc)array_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	(cmpfunc)array_compare,		/*tp_compare*/
+	(reprfunc)array_repr,		/*tp_repr*/
+	0,				/*tp_as_number*/
+	&array_as_sequence,		/*tp_as_sequence*/
+	0,				/*tp_as_mapping*/
 };
 
 
@@ -1187,33 +1158,3 @@
 {
 	initmodule("array", a_methods);
 }
-
-
-#ifdef NEED_MEMMOVE
-
-/* A perhaps slow but I hope correct implementation of memmove */
-
-char *memmove(dst, src, n)
-	char *dst;
-	char *src;
-	int n;
-{
-	char *realdst = dst;
-	if (n <= 0)
-		return dst;
-	if (src >= dst+n || dst >= src+n)
-		return memcpy(dst, src, n);
-	if (src > dst) {
-		while (--n >= 0)
-			*dst++ = *src++;
-	}
-	else if (src < dst) {
-		src += n;
-		dst += n;
-		while (--n >= 0)
-			*--dst = *--src;
-	}
-	return realdst;
-}
-
-#endif
diff --git a/Modules/audioop.c b/Modules/audioop.c
index 8bd833a..cfb97f2 100644
--- a/Modules/audioop.c
+++ b/Modules/audioop.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -22,17 +22,19 @@
 
 ******************************************************************/
 
-/* audioopmodele - Module to detect peak values in arrays */
-
-#ifdef sun
-#define signed
-#endif
-
-#include <math.h>
+/* audioopmodule - Module to detect peak values in arrays */
 
 #include "allobjects.h"
 #include "modsupport.h"
 
+#if defined(__CHAR_UNSIGNED__) && defined(signed)
+!ERROR!; READ THE SOURCE FILE!;
+/* This module currently does not work on systems where only unsigned
+   characters are available.  Take it out of Setup.  Sorry. */
+#endif
+
+#include <math.h>
+
 /* Code shamelessly stolen from sox,
 ** (c) Craig Reese, Joe Campbell and Jeff Poskanzer 1989 */
 
@@ -213,32 +215,6 @@
 }
 
 static object *
-audioop_minmax(self, args)
-	object *self;
-	object *args;
-{
-	signed char *cp;
-	int len, size, val;
-	int i;
-	int min = 0x7fffffff, max = -0x7fffffff;
-
-	if (!getargs(args, "(s#i)", &cp, &len, &size))
-		return NULL;
-	if (size != 1 && size != 2 && size != 4) {
-		err_setstr(AudioopError, "Size should be 1, 2 or 4");
-		return NULL;
-	}
-	for (i = 0; i < len; i += size) {
-		if (size == 1) val = (int) *CHARP(cp, i);
-		else if (size == 2) val = (int) *SHORTP(cp, i);
-		else if (size == 4) val = (int) *LONGP(cp, i);
-		if (val > max) max = val;
-		if (val < min) min = val;
-	}
-	return mkvalue("(ii)", min, max);
-}
-
-static object *
 audioop_avg(self, args)
     object *self;
     object *args;
@@ -997,136 +973,6 @@
 }
 
 static object *
-audioop_lin2adpcm3(self, args)
-    object *self;
-    object *args;
-{
-    signed char *cp;
-    signed char *ncp;
-    int len, size, val, step, valprev, delta;
-    object *rv, *state, *str;
-    int i;
-
-    if ( !getargs(args, "(s#iO)",
-		  &cp, &len, &size, &state) )
-      return 0;
-    
-
-    if ( size != 1 && size != 2 && size != 4) {
-	err_setstr(AudioopError, "Size should be 1, 2 or 4");
-	return 0;
-    }
-    
-    str = newsizedstringobject(NULL, len/size);
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-
-    /* Decode state, should have (value, step) */
-    if ( state == None ) {
-	/* First time, it seems. Set defaults */
-	valprev = 0;
-	step = 4;	/* The '4' is magic. Dunno it's significance */
-    } else if ( !getargs(state, "(ii)", &valprev, &step) )
-      return 0;
-
-    for ( i=0; i < len; i += size ) {
-	if ( size == 1 )      val = ((int)*CHARP(cp, i)) << 8;
-	else if ( size == 2 ) val = (int)*SHORTP(cp, i);
-	else if ( size == 4 ) val = ((int)*LONGP(cp, i)) >> 16;
-
-	/* Step 1 - compute difference with previous value */
-	delta = (val - valprev)/step;
-
-	/* Step 2 - Clamp */
-	if ( delta < -4 )
-	  delta = -4;
-	else if ( delta > 3 )
-	  delta = 3;
-
-	/* Step 3 - Update previous value */
-	valprev += delta*step;
-
-	/* Step 4 - Clamp previous value to 16 bits */
-	if ( valprev > 32767 )
-	  valprev = 32767;
-	else if ( valprev < -32768 )
-	  valprev = -32768;
-
-	/* Step 5 - Update step value */
-	step = step * newstep[abs(delta)];
-	step++;		/* Don't understand this. */
-
-	/* Step 6 - Output value (as a whole byte, currently) */
-	*ncp++ = delta;
-    }
-    rv = mkvalue("(O(ii))", str, valprev, step);
-    DECREF(str);
-    return rv;
-}
-
-static object *
-audioop_adpcm32lin(self, args)
-    object *self;
-    object *args;
-{
-    signed char *cp;
-    signed char *ncp;
-    int len, size, val, valprev, step, delta;
-    object *rv, *str, *state;
-    int i;
-
-    if ( !getargs(args, "(s#iO)",
-		  &cp, &len, &size, &state) )
-      return 0;
-
-    if ( size != 1 && size != 2 && size != 4) {
-	err_setstr(AudioopError, "Size should be 1, 2 or 4");
-	return 0;
-    }
-    
-    /* Decode state, should have (value, step) */
-    if ( state == None ) {
-	/* First time, it seems. Set defaults */
-	valprev = 0;
-	step = 4;	/* The '4' is magic. Dunno it's significance */
-    } else if ( !getargs(state, "(ii)", &valprev, &step) )
-      return 0;
-    
-    str = newsizedstringobject(NULL, len*size);
-    if ( str == 0 )
-      return 0;
-    ncp = (signed char *)getstringvalue(str);
-    
-    for ( i=0; i < len*size; i += size ) {
-	/* Step 1 - get the delta value */
-	delta = *cp++;
-
-	/* Step 2 - update output value */
-	valprev = valprev + delta*step;
-
-	/* Step 3 - clamp output value */
-	if ( valprev > 32767 )
-	  valprev = 32767;
-	else if ( valprev < -32768 )
-	  valprev = -32768;
-
-	/* Step 4 - Update step value */
-	step = step * newstep[abs(delta)];
-	step++;
-
-	/* Step 5 - Output value */
-	if ( size == 1 )      *CHARP(ncp, i) = (signed char)(valprev >> 8);
-	else if ( size == 2 ) *SHORTP(ncp, i) = (short)(valprev);
-	else if ( size == 4 ) *LONGP(ncp, i) = (long)(valprev<<16);
-    }
-
-    rv = mkvalue("(O(ii))", str, valprev, step);
-    DECREF(str);
-    return rv;
-}
-
-static object *
 audioop_lin2adpcm(self, args)
     object *self;
     object *args;
@@ -1330,7 +1176,6 @@
 
 static struct methodlist audioop_methods[] = {
     { "max", audioop_max },
-    { "minmax", audioop_minmax },
     { "avg", audioop_avg },
     { "maxpp", audioop_maxpp },
     { "avgpp", audioop_avgpp },
@@ -1347,8 +1192,6 @@
     { "lin2lin", audioop_lin2lin },
     { "adpcm2lin", audioop_adpcm2lin },
     { "lin2adpcm", audioop_lin2adpcm },
-    { "adpcm32lin", audioop_adpcm32lin },
-    { "lin2adpcm3", audioop_lin2adpcm3 },
     { "tomono", audioop_tomono },
     { "tostereo", audioop_tostereo },
     { "getsample", audioop_getsample },
diff --git a/Modules/cdmodule.c b/Modules/cdmodule.c
index b5d0def..0630ebc 100644
--- a/Modules/cdmodule.c
+++ b/Modules/cdmodule.c
@@ -1,5 +1,5 @@
 /**********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -440,23 +440,23 @@
 }
 	
 static struct methodlist cdplayer_methods[] = {
-	{"allowremoval",	CD_allowremoval},
-	{"bestreadsize",	CD_bestreadsize},
-	{"close",		CD_close},
-	{"eject",		CD_eject},
-	{"getstatus",		CD_getstatus},
-	{"gettrackinfo",	CD_gettrackinfo},
-	{"msftoblock",		CD_msftoblock},
-	{"play",		CD_play},
-	{"playabs",		CD_playabs},
-	{"playtrack",		CD_playtrack},
-	{"playtrackabs",	CD_playtrackabs},
-	{"preventremoval",	CD_preventremoval},
-	{"readda",		CD_readda},
-	{"seek",		CD_seek},
-	{"seektrack",		CD_seektrack},
-	{"stop",		CD_stop},
-	{"togglepause",		CD_togglepause},
+	{"allowremoval",	(method)CD_allowremoval},
+	{"bestreadsize",	(method)CD_bestreadsize},
+	{"close",		(method)CD_close},
+	{"eject",		(method)CD_eject},
+	{"getstatus",		(method)CD_getstatus},
+	{"gettrackinfo",	(method)CD_gettrackinfo},
+	{"msftoblock",		(method)CD_msftoblock},
+	{"play",		(method)CD_play},
+	{"playabs",		(method)CD_playabs},
+	{"playtrack",		(method)CD_playtrack},
+	{"playtrackabs",	(method)CD_playtrackabs},
+	{"preventremoval",	(method)CD_preventremoval},
+	{"readda",		(method)CD_readda},
+	{"seek",		(method)CD_seek},
+	{"seektrack",		(method)CD_seektrack},
+	{"stop",		(method)CD_stop},
+	{"togglepause",		(method)CD_togglepause},
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -484,9 +484,9 @@
 	sizeof(cdplayerobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	cdplayer_dealloc,	/*tp_dealloc*/
+	(destructor)cdplayer_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	cdplayer_getattr,	/*tp_getattr*/
+	(getattrfunc)cdplayer_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -755,12 +755,12 @@
 }
 
 static struct methodlist cdparser_methods[] = {
-	{"addcallback",		CD_addcallback},
-	{"deleteparser",	CD_deleteparser},
-	{"parseframe",		CD_parseframe},
-	{"removecallback",	CD_removecallback},
-	{"resetparser",		CD_resetparser},
-	{"setcallback",		CD_addcallback}, /* backward compatibility */
+	{"addcallback",		(method)CD_addcallback},
+	{"deleteparser",	(method)CD_deleteparser},
+	{"parseframe",		(method)CD_parseframe},
+	{"removecallback",	(method)CD_removecallback},
+	{"resetparser",		(method)CD_resetparser},
+	{"setcallback",		(method)CD_addcallback}, /* backward compatibility */
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -795,9 +795,9 @@
 	sizeof(cdparserobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	cdparser_dealloc,	/*tp_dealloc*/
+	(destructor)cdparser_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	cdparser_getattr,	/*tp_getattr*/
+	(getattrfunc)cdparser_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -877,10 +877,10 @@
 }
 
 static struct methodlist CD_methods[] = {
-	{"sbtoa",	CD_sbtoa},
-	{"open",	CD_open},
-	{"createparser",CD_createparser},
-	{"timetoa",	CD_timetoa},
+	{"sbtoa",	(method)CD_sbtoa},
+	{"open",	(method)CD_open},
+	{"createparser",(method)CD_createparser},
+	{"timetoa",	(method)CD_timetoa},
 	{NULL,		NULL}	/* Sentinel */
 };
 
diff --git a/Modules/cgen.py b/Modules/cgen.py
index 434765b..c133b2c 100644
--- a/Modules/cgen.py
+++ b/Modules/cgen.py
@@ -1,3 +1,26 @@
+########################################################################
+# Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+# Amsterdam, The Netherlands.
+# 
+#                         All Rights Reserved
+# 
+# Permission to use, copy, modify, and distribute this software and its 
+# documentation for any purpose and without fee is hereby granted, 
+# provided that the above copyright notice appear in all copies and that
+# both that copyright notice and this permission notice appear in 
+# supporting documentation, and that the names of Stichting Mathematisch
+# Centrum or CWI not be used in advertising or publicity pertaining to
+# distribution of the software without specific, written prior permission.
+# 
+# STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+# FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+########################################################################
+
 # Python script to parse cstubs file for gl and generate C stubs.
 # usage: python cgen.py <cstubs >glmodule.c
 #
diff --git a/Modules/cgensupport.h b/Modules/cgensupport.h
index 8472b03..4b295b3 100644
--- a/Modules/cgensupport.h
+++ b/Modules/cgensupport.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,7 +35,7 @@
 #define mknewlongobject(x) newintobject(x)
 #define mknewshortobject(x) newintobject((long)x)
 #define mknewfloatobject(x) newfloatobject(x)
-#define mknewcharobject(c) mkvalue("c", c)
+#define mknewcharobject(ch) mkvalue("c", ch)
 
 extern int getiobjectarg PROTO((object *args, int nargs, int i, object **p_a));
 extern int getilongarg PROTO((object *args, int nargs, int i, long *p_a));
diff --git a/Modules/clmodule.c b/Modules/clmodule.c
index 63e81db..75542d1 100644
--- a/Modules/clmodule.c
+++ b/Modules/clmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -675,9 +675,9 @@
 	sizeof(clobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	cl_dealloc,		/*tp_dealloc*/
+	(destructor)cl_dealloc,	/*tp_dealloc*/
 	0,			/*tp_print*/
-	cl_getattr,		/*tp_getattr*/
+	(getattrfunc)cl_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -711,7 +711,7 @@
 			err_setstr(ClError, "Open(De)Compressor failed");
 		return NULL;
 	}
-	return new;
+	return (object *)new;
 }
 
 static object *
diff --git a/Modules/config.c.in b/Modules/config.c.in
index b4f7d3d..cc2371a 100644
--- a/Modules/config.c.in
+++ b/Modules/config.c.in
@@ -1,5 +1,5 @@
-/***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+/* -*- C -*- ***********************************************
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -22,115 +22,73 @@
 
 ******************************************************************/
 
-/* Configurable Python configuration file */
+/* Universal Python configuration file */
 
-/* These modules are normally always included, but *may* be taken out */
-#define USE_MARSHAL	1	/* This is linked anyway */
-#define USE_MATH	1
-#define USE_STRUCT	1
-#define USE_TIME	1
-
-#ifdef macintosh
-#define USE_AUDIOOP	1
-#define USE_IMAGEOP	1
-#define USE_MAC		1
-#define USE_REGEX	1
-#define USE_STDWIN	1	/* You may turn this off */
-#define USE_STROP
-#endif
-
-#ifdef unix
-#define USE_GRP		1	/* Use together with pwd */
-#define USE_POSIX	1
-#define USE_PWD		1	/* Use together with grp */
-#define USE_SELECT	1
-#define USE_SOCKET	1
-#endif
-
-#ifdef MSDOS
-#define USE_POSIX	1	/* Subset defined in posixmodule.c */
-#define USE_REGEX	1
-#define USE_STROP	1
-#define USE_PC		1
+#ifdef HAVE_CONFIG_H
+#include "config.h"
 #endif
 
 #include <stdio.h>
+#include <string.h>
 
-#include "PROTO.h"
+#include "myproto.h"
 #include "mymalloc.h"
 #include "osdefs.h"
+#include "intrcheck.h"
 
-#include "patchlevel.h"
 
-#define VERSION "0.9.%d++ (%s)"
+#ifndef NO_MAIN
 
-#ifdef __DATE__
-#define DATE __DATE__
-#else
-#define DATE ">= 3 Nov 1993"
-#endif
+/* Normally, the main program is called from here (so everything else
+   can be in libPython.a).  We save a pointer to argv[0] because it
+   may be needed for dynamic loading of modules in import.c.  If you
+   have your own main program and want to use non-SunOS dynamic
+   loading, you will have to provide your own version of
+   getprogramname(). */
 
-char version[80];
+static char *argv0;
 
-char *argv0; /* For dynamic loading in import.c */
-
-extern char verbose;
-
-/*ARGSUSED*/
-void
-initargs(p_argc, p_argv)
-	int *p_argc;
-	char ***p_argv;
+main(argc, argv)
+	int argc;
+	char **argv;
 {
-	sprintf(version, VERSION, PATCHLEVEL, DATE);
-
-	argv0 = **p_argv;
-
-#ifdef USE_FROZEN
-	if (verbose)
-#else
-	if (verbose || *p_argc < 2 && isatty(0) && isatty(1))
-#endif
-	{
-		printf("Python %s.\n", version);
-		printf(
-"Copyright 1990, 1991, 1992, 1993 Stichting Mathematisch Centrum, Amsterdam\n");
-	}
-}
-
-void
-initcalls()
-{
-}
-
-void
-donecalls()
-{
-#ifdef USE_AUDIO
-	asa_done();
-#endif
-}
-
-#ifndef PYTHONPATH
-
 #ifdef macintosh
-/* On the Mac, the search path is a space-separated list of directories */
-#define PYTHONPATH ": :lib :demo"
-#endif /* macintosh */
+	wargs(&argc, &argv);
+#endif
+	argv0 = argv[0];
+	realmain(argc, argv);
+}
 
-#ifdef unix
-#define PYTHONPATH ".:/usr/local/lib/python"
-#endif /* unix */
+char *
+getprogramname()
+{
+	return argv0;
+}
 
-#ifdef MSDOS
-/* In MS-DOS, the delimiter is a semicolon */
-#define PYTHONPATH ".;..\\lib;\\python\\lib"
-#endif /* MSDOS */
-
-#ifndef PYTHONPATH
-ERROR; ERROR; On what kind of system are you?;
 #endif
 
+
+/* 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
+   appended.  (The Mac has no environment variables, so there the
+   default path is always returned.)  The default path may be passed
+   to the preprocessor; if not, a system-dependent default is used. */
+
+#ifndef PYTHONPATH
+#ifdef macintosh
+#define PYTHONPATH ": :Lib :Lib:stdwin :Demo"
+#endif /* macintosh */
+#endif /* !PYTHONPATH */
+
+#ifndef PYTHONPATH
+#if defined(MSDOS) || defined(NT)
+#define PYTHONPATH ".;..\\lib;\\python\\lib"
+#endif /* MSDOS || NT */
+#endif /* !PYTHONPATH */
+
+#ifndef PYTHONPATH
+#define PYTHONPATH ".:/usr/local/lib/python"
 #endif /* !PYTHONPATH */
 
 extern char *getenv();
@@ -163,335 +121,31 @@
 
 
 /* Table of built-in modules.
-   These are initialized when first imported. */
+   These are initialized when first imported.
+   Note: selection of optional extensions is now generally done by the
+   makesetup script. */
 
-/* Standard modules */
-
-#ifdef USE_AL
-extern void inital();
-#endif
-#ifdef USE_AMOEBA
-extern void initamoeba();
-#endif
-#ifdef USE_AUDIO
-extern void initaudio();
-#endif
-#ifdef USE_AUDIOOP
-extern void initaudioop();
-#endif
-#ifdef USE_CD
-extern void initcd();
-#endif
-#ifdef USE_CL
-extern void initcl();
-#endif
-#ifdef USE_DBM
-extern void initdbm();
-#endif
-#ifdef USE_FCNTL
-extern void initfcntl();
-#endif
-#ifdef USE_FL
-extern void initfl();
-#endif
-#ifdef USE_FM
-extern void initfm();
-#endif
-#ifdef USE_GL
-extern void initgl();
-#endif
-#ifdef USE_GRP
-extern void initgrp();
-#endif
-#ifdef USE_IMGFILE
-extern void initimgfile();
-#endif
-#ifdef USE_JPEG
-extern void initjpeg();
-#endif
-#ifdef USE_MAC
-extern void initmac();
-#endif
-#ifdef USE_MARSHAL
-extern void initmarshal();
-#endif
-#ifdef USE_MATH
-extern void initmath();
-#endif
-#ifdef USE_NIS
-extern void initnis();
-#endif
-#ifdef USE_PANEL
-extern void initpanel();
-#endif
-#ifdef USE_POSIX
-extern void initposix();
-#endif
-#ifdef USE_PWD
-extern void initpwd();
-#endif
-#ifdef USE_REGEX
-extern void initregex();
-#endif
-#ifdef USE_ROTOR
-extern void initrotor();
-#endif
-#ifdef USE_SELECT
-extern void initselect();
-#endif
-#ifdef USE_SGI
-extern void initsgi();
-#endif
-#ifdef USE_SOCKET
-extern void initsocket();
-#endif
-#ifdef USE_STDWIN
-extern void initstdwin();
-#endif
-#ifdef USE_STROP
-extern void initstrop();
-#endif
-#ifdef USE_STRUCT
-extern void initstruct();
-#endif
-#ifdef USE_SUNAUDIODEV
-extern void initsunaudiodev();
-#endif
-#ifdef USE_THREAD
-extern void initthread();
-#endif
-#ifdef USE_SV
-extern void initsv();
-#endif
-#ifdef USE_TIME
-extern void inittime();
-#endif
-#ifdef USE_IMAGEOP
-extern void initimageop();
-#endif
-#ifdef USE_MPZ
-extern void initmpz();
-#endif
-#ifdef USE_MD5
-extern void initmd5();
-#endif
-#ifdef USE_ARRAY
-extern void initarray();
-#endif
-#ifdef USE_XT
-extern void initXt();
-#endif
-#ifdef USE_XAW
-extern void initXaw();
-#endif
-#ifdef USE_XM
-extern void initXm();
-#endif
-#ifdef USE_GLX
-extern void initGlx();
-#endif
-#ifdef USE_HTML
-extern void initHTML();
-#endif
-#ifdef USE_XLIB
-extern void initXlib();
-#endif
-#ifdef USE_PARSER
-extern void initparser();
-#endif
-#ifdef USE_RGBIMG
-extern void initrgbimg();
-#endif
 /* -- ADDMODULE MARKER 1 -- */
 
+extern void initmarshal();
+
 struct {
 	char *name;
 	void (*initfunc)();
 } inittab[] = {
 
-#ifdef USE_AL
-	{"al",		inital},
-#endif
-
-#ifdef USE_AMOEBA
-	{"amoeba",	initamoeba},
-#endif
-
-#ifdef USE_AUDIO
-	{"audio",	initaudio},
-#endif
-
-#ifdef USE_AUDIOOP
-	{"audioop",	initaudioop},
-#endif
-
-#ifdef USE_CD
-	{"cd",		initcd},
-#endif
-
-#ifdef USE_CL
-	{"cl",		initcl},
-#endif
-
-#ifdef USE_DBM
-	{"dbm",		initdbm},
-#endif
-
-#ifdef USE_FCNTL
-	{"fcntl",	initfcntl},
-#endif
-
-#ifdef USE_FL
-	{"fl",		initfl},
-#endif
-
-#ifdef USE_FM
-	{"fm",		initfm},
-#endif
-
-#ifdef USE_GL
-	{"gl",		initgl},
-#endif
-
-#ifdef USE_GRP
-	{"grp",		initgrp},
-#endif
-
-#ifdef USE_IMGFILE
-	{"imgfile",	initimgfile},
-#endif
-
-#ifdef USE_JPEG
-	{"jpeg",	initjpeg},
-#endif
-
-#ifdef USE_MAC
-	{"mac",	initmac},
-#endif
-
-#ifdef USE_MARSHAL
-	{"marshal",	initmarshal},
-#endif
-
-#ifdef USE_MATH
-	{"math",	initmath},
-#endif
-
-#ifdef USE_NIS
-	{"nis",		initnis},
-#endif
-
-#ifdef USE_PANEL
-	{"pnl",		initpanel},
-#endif
-
-#ifdef USE_POSIX
-	{"posix",	initposix},
-#endif
-
-#ifdef USE_PWD
-	{"pwd",		initpwd},
-#endif
-
-#ifdef USE_REGEX
-	{"regex",	initregex},
-#endif
-
-#ifdef USE_ROTOR
-	{"rotor",	initrotor},
-#endif
-
-#ifdef USE_SELECT
-	{"select",	initselect},
-#endif
-
-#ifdef USE_SGI
-	{"sgi",		initsgi},
-#endif
-
-#ifdef USE_SOCKET
-	{"socket",	initsocket},
-#endif
-
-#ifdef USE_STDWIN
-	{"stdwin",	initstdwin},
-#endif
-
-#ifdef USE_STROP
-	{"strop",	initstrop},
-#endif
-
-#ifdef USE_STRUCT
-	{"struct",	initstruct},
-#endif
-
-#ifdef USE_SUNAUDIODEV
-	{"sunaudiodev",	initsunaudiodev},
-#endif
-
-#ifdef USE_SV
-	{"sv",		initsv},
-#endif
-
-#ifdef USE_THREAD
-	{"thread",	initthread},
-#endif
-
-#ifdef USE_TIME
-	{"time",	inittime},
-#endif
-
-#ifdef USE_IMAGEOP
-       {"imageop", initimageop},
-#endif
-
-#ifdef USE_MPZ
-       {"mpz", initmpz},
-#endif
-
-#ifdef USE_MD5
-       {"md5", initmd5},
-#endif
-
-#ifdef USE_ARRAY
-       {"array", initarray},
-#endif
-
-#ifdef USE_XT
-	{"Xt", initXt},
-#endif
-
-#ifdef USE_XAW
-	{"Xaw", initXaw},
-#endif
-
-#ifdef USE_XM
-	{"Xm", initXm},
-#endif
-
-#ifdef USE_GLX
-	{"Glx", initGlx},
-#endif
-
-#ifdef USE_HTML
-	{"HTML", initHTML},
-#endif
-
-#ifdef USE_XLIB
-       {"Xlib", initXlib},
-#endif
-
-#ifdef USE_PARSER
-       {"parser", initparser},
-#endif
-
-#ifdef USE_RGBIMG
-       {"rgbimg", initrgbimg},
-#endif
-
 /* -- ADDMODULE MARKER 2 -- */
 
-	{0,		0}		/* Sentinel */
+	/* This module "lives in" with marshal.c */
+	{"marshal", initmarshal},
+
+	/* These entries are here for sys.builtin_module_names */
+	{"__main__", NULL},
+	{"__builtin__", NULL},
+	{"sys", NULL},
+
+	/* Sentinel */
+	{0, 0}
 };
 
 #ifdef USE_FROZEN
diff --git a/Modules/cstubs b/Modules/cstubs
index b365f33..8481024 100644
--- a/Modules/cstubs
+++ b/Modules/cstubs
@@ -1,3 +1,27 @@
+/***********************************************************
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
 /*
 Input used to generate the Python module "glmodule.c".
 The stub generator is a Python script called "cgen.py".
diff --git a/Modules/dbmmodule.c b/Modules/dbmmodule.c
index 0f368d2..b484917 100644
--- a/Modules/dbmmodule.c
+++ b/Modules/dbmmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -39,7 +39,7 @@
 	DBM *di_dbm;
 } dbmobject;
 
-extern typeobject Dbmtype;	/* Really forward */
+staticforward typeobject Dbmtype;
 
 #define is_dbmobject(v) ((v)->ob_type == &Dbmtype)
 
@@ -131,6 +131,7 @@
 	dp->di_size = -1;
 	if (w == NULL) {
 	    if ( dbm_delete(dp->di_dbm, krec) < 0 ) {
+		dbm_clearerr(dp->di_dbm);
 		err_setstr(KeyError, GETSTRINGVALUE((stringobject *)v));
 		return -1;
 	    }
@@ -141,6 +142,7 @@
 		return -1;
 	    }
 	    if ( dbm_store(dp->di_dbm, krec, drec, DBM_REPLACE) < 0 ) {
+		dbm_clearerr(dp->di_dbm);
 		err_setstr(DbmError, "Cannot add item to database");
 		return -1;
 	    }
@@ -154,9 +156,9 @@
 }
 
 static mapping_methods dbm_as_mapping = {
-	dbm_length,	/*mp_length*/
-	dbm_subscript,	/*mp_subscript*/
-	dbm_ass_sub,	/*mp_ass_subscript*/
+	(inquiry)dbm_length,		/*mp_length*/
+	(binaryfunc)dbm_subscript,	/*mp_subscript*/
+	(objobjargproc)dbm_ass_sub,	/*mp_ass_subscript*/
 };
 
 static object *
@@ -201,8 +203,8 @@
 }
 
 static struct methodlist dbm_methods[] = {
-	{"keys",	dbm_keys},
-	{"has_key",	dbm_has_key},
+	{"keys",	(method)dbm_keys},
+	{"has_key",	(method)dbm_has_key},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -214,20 +216,20 @@
 	return findmethod(dbm_methods, (object *)dp, name);
 }
 
-typeobject Dbmtype = {
+static typeobject Dbmtype = {
 	OB_HEAD_INIT(&Typetype)
 	0,
 	"Dbm_dictionary",
 	sizeof(dbmobject),
 	0,
-	dbm_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	dbm_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
-	0,		/*tp_as_number*/
-	0,		/*tp_as_sequence*/
+	(destructor)dbm_dealloc, /*tp_dealloc*/
+	0,			/*tp_print*/
+	(getattrfunc)dbm_getattr, /*tp_getattr*/
+	0,			/*tp_setattr*/
+	0,			/*tp_compare*/
+	0,			/*tp_repr*/
+	0,			/*tp_as_number*/
+	0,			/*tp_as_sequence*/
 	&dbm_as_mapping,	/*tp_as_mapping*/
 };
 
@@ -258,7 +260,7 @@
 }
 
 static struct methodlist dbmmodule_methods[] = {
-    { "open", dbmopen },
+    { "open", (method)dbmopen },
     { 0, 0 },
 };
 
diff --git a/Modules/fcntlmodule.c b/Modules/fcntlmodule.c
index 7862b06..0c6b4f0 100644
--- a/Modules/fcntlmodule.c
+++ b/Modules/fcntlmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Modules/flmodule.c b/Modules/flmodule.c
index ce22861..ab23b47 100644
--- a/Modules/flmodule.c
+++ b/Modules/flmodule.c
@@ -1,5 +1,5 @@
 /**********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -56,7 +56,7 @@
 	object *ob_callback_arg;
 } genericobject;
 
-extern typeobject GenericObjecttype; /* Forward */
+staticforward typeobject GenericObjecttype;
 
 #define is_genericobject(g) ((g)->ob_type == &GenericObjecttype)
 
@@ -298,16 +298,16 @@
 }
 
 static struct methodlist generic_methods[] = {
-	{"set_call_back",	generic_set_call_back},
-	{"delete_object",	generic_delete_object},
-	{"show_object",		generic_show_object},
-	{"hide_object",		generic_hide_object},
-	{"redraw_object",	generic_redraw_object},
-	{"freeze_object",	generic_freeze_object},
-	{"unfreeze_object",	generic_unfreeze_object},
-	{"activate_object",	generic_activate_object},
-	{"deactivate_object",	generic_deactivate_object},
-	{"set_object_shortcut",	generic_set_object_shortcut},
+	{"set_call_back",	(method)generic_set_call_back},
+	{"delete_object",	(method)generic_delete_object},
+	{"show_object",		(method)generic_show_object},
+	{"hide_object",		(method)generic_hide_object},
+	{"redraw_object",	(method)generic_redraw_object},
+	{"freeze_object",	(method)generic_freeze_object},
+	{"unfreeze_object",	(method)generic_unfreeze_object},
+	{"activate_object",	(method)generic_activate_object},
+	{"deactivate_object",	(method)generic_deactivate_object},
+	{"set_object_shortcut",	(method)generic_set_object_shortcut},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -424,19 +424,19 @@
 	return newstringobject(buf);
 }
 
-typeobject GenericObjecttype = {
+static typeobject GenericObjecttype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"FORMS_object",		/*tp_name*/
-	sizeof(genericobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"FORMS_object",			/*tp_name*/
+	sizeof(genericobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	generic_dealloc,	/*tp_dealloc*/
-	0,			/*tp_print*/
-	generic_getattr,	/*tp_getattr*/
-	generic_setattr,	/*tp_setattr*/
-	0,			/*tp_compare*/
-	generic_repr,		/*tp_repr*/
+	(destructor)generic_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)generic_getattr,	/*tp_getattr*/
+	(setattrfunc)generic_setattr,	/*tp_setattr*/
+	0,				/*tp_compare*/
+	(reprfunc)generic_repr,		/*tp_repr*/
 };
 
 static object *
@@ -837,24 +837,24 @@
 }
 
 static struct methodlist browser_methods[] = {
-	{"set_browser_topline",		set_browser_topline},
-	{"clear_browser",		clear_browser},
-	{"add_browser_line",		add_browser_line},
-	{"addto_browser",		addto_browser},
-	{"insert_browser_line",		insert_browser_line},
-	{"delete_browser_line",		delete_browser_line},
-	{"replace_browser_line",	replace_browser_line},
-	{"get_browser_line",		get_browser_line},
-	{"load_browser",		load_browser},
-	{"get_browser_maxline",		get_browser_maxline},
-	{"select_browser_line",		select_browser_line},
-	{"deselect_browser_line",	deselect_browser_line},
-	{"deselect_browser",		deselect_browser},
-	{"isselected_browser_line",	isselected_browser_line},
-	{"get_browser",			get_browser},
-	{"set_browser_fontsize",	set_browser_fontsize},
-	{"set_browser_fontstyle",	set_browser_fontstyle},
-	{"set_browser_specialkey",	set_browser_specialkey},
+	{"set_browser_topline",		(method)set_browser_topline},
+	{"clear_browser",		(method)clear_browser},
+	{"add_browser_line",		(method)add_browser_line},
+	{"addto_browser",		(method)addto_browser},
+	{"insert_browser_line",		(method)insert_browser_line},
+	{"delete_browser_line",		(method)delete_browser_line},
+	{"replace_browser_line",	(method)replace_browser_line},
+	{"get_browser_line",		(method)get_browser_line},
+	{"load_browser",		(method)load_browser},
+	{"get_browser_maxline",		(method)get_browser_maxline},
+	{"select_browser_line",		(method)select_browser_line},
+	{"deselect_browser_line",	(method)deselect_browser_line},
+	{"deselect_browser",		(method)deselect_browser},
+	{"isselected_browser_line",	(method)isselected_browser_line},
+	{"get_browser",			(method)get_browser},
+	{"set_browser_fontsize",	(method)set_browser_fontsize},
+	{"set_browser_fontstyle",	(method)set_browser_fontstyle},
+	{"set_browser_specialkey",	(method)set_browser_specialkey},
 	{NULL,				NULL}		/* sentinel */
 };
 
@@ -893,10 +893,10 @@
 }
 
 static struct methodlist button_methods[] = {
-	{"set_button",		set_button},
-	{"get_button",		get_button},
-	{"get_button_numb",	get_button_numb},
-	{"set_button_shortcut",	set_button_shortcut},
+	{"set_button",		(method)set_button},
+	{"get_button",		(method)get_button},
+	{"get_button_numb",	(method)get_button_numb},
+	{"set_button_shortcut",	(method)set_button_shortcut},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -975,15 +975,15 @@
 }
 
 static struct methodlist choice_methods[] = {
-	{"set_choice",		set_choice},
-	{"get_choice",		get_choice},
-	{"clear_choice",	clear_choice},
-	{"addto_choice",	addto_choice},
-	{"replace_choice",	replace_choice},
-	{"delete_choice",	delete_choice},
-	{"get_choice_text",	get_choice_text},
-	{"set_choice_fontsize", set_choice_fontsize},
-	{"set_choice_fontstyle",set_choice_fontstyle},
+	{"set_choice",		(method)set_choice},
+	{"get_choice",		(method)get_choice},
+	{"clear_choice",	(method)clear_choice},
+	{"addto_choice",	(method)addto_choice},
+	{"replace_choice",	(method)replace_choice},
+	{"delete_choice",	(method)delete_choice},
+	{"get_choice_text",	(method)get_choice_text},
+	{"set_choice_fontsize", (method)set_choice_fontsize},
+	{"set_choice_fontstyle",(method)set_choice_fontstyle},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1005,7 +1005,7 @@
 }
 
 static struct methodlist clock_methods[] = {
-	{"get_clock",		get_clock},
+	{"get_clock",		(method)get_clock},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1060,12 +1060,12 @@
 }
 
 static struct methodlist counter_methods[] = {
-	{"set_counter_value",		set_counter_value},
-	{"get_counter_value",		get_counter_value},
-	{"set_counter_bounds",		set_counter_bounds},
-	{"set_counter_step",		set_counter_step},
-	{"set_counter_precision",	set_counter_precision},
-	{"set_counter_return",		set_counter_return},
+	{"set_counter_value",		(method)set_counter_value},
+	{"get_counter_value",		(method)get_counter_value},
+	{"set_counter_bounds",		(method)set_counter_bounds},
+	{"set_counter_step",		(method)set_counter_step},
+	{"set_counter_precision",	(method)set_counter_precision},
+	{"set_counter_return",		(method)set_counter_return},
 	{NULL,				NULL}		/* sentinel */
 };
 
@@ -1113,11 +1113,11 @@
 }
 
 static struct methodlist dial_methods[] = {
-	{"set_dial_value",	set_dial_value},
-	{"get_dial_value",	get_dial_value},
-	{"set_dial_bounds",	set_dial_bounds},
-	{"get_dial_bounds",	get_dial_bounds},
-	{"set_dial_step",	set_dial_step},
+	{"set_dial_value",	(method)set_dial_value},
+	{"get_dial_value",	(method)get_dial_value},
+	{"set_dial_bounds",	(method)set_dial_bounds},
+	{"get_dial_bounds",	(method)get_dial_bounds},
+	{"set_dial_step",	(method)set_dial_step},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1156,10 +1156,10 @@
 }
 
 static struct methodlist input_methods[] = {
-	{"set_input",		set_input},
-	{"get_input",		get_input},
-	{"set_input_color",	set_input_color},
-	{"set_input_return",	set_input_return},
+	{"set_input",		(method)set_input},
+	{"get_input",		(method)get_input},
+	{"set_input_color",	(method)set_input_color},
+	{"set_input_return",	(method)set_input_return},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1201,10 +1201,10 @@
 }
 
 static struct methodlist menu_methods[] = {
-	{"set_menu",		set_menu},
-	{"get_menu",		get_menu},
-	{"get_menu_text",	get_menu_text},
-	{"addto_menu",		addto_menu},
+	{"set_menu",		(method)set_menu},
+	{"get_menu",		(method)get_menu},
+	{"get_menu_text",	(method)get_menu_text},
+	{"addto_menu",		(method)addto_menu},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1277,14 +1277,14 @@
 
 
 static struct methodlist slider_methods[] = {
-	{"set_slider_value",	set_slider_value},
-	{"get_slider_value",	get_slider_value},
-	{"set_slider_bounds",	set_slider_bounds},
-	{"get_slider_bounds",	get_slider_bounds},
-	{"set_slider_return",	set_slider_return},
-	{"set_slider_size",	set_slider_size},
-	{"set_slider_precision",set_slider_precision},
-	{"set_slider_step",	set_slider_step},
+	{"set_slider_value",	(method)set_slider_value},
+	{"get_slider_value",	(method)get_slider_value},
+	{"set_slider_bounds",	(method)set_slider_bounds},
+	{"get_slider_bounds",	(method)get_slider_bounds},
+	{"set_slider_return",	(method)set_slider_return},
+	{"set_slider_size",	(method)set_slider_size},
+	{"set_slider_precision",(method)set_slider_precision},
+	{"set_slider_step",	(method)set_slider_step},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1357,14 +1357,14 @@
 }
 
 static struct methodlist positioner_methods[] = {
-	{"set_positioner_xvalue",		set_positioner_xvalue},
-	{"set_positioner_yvalue",		set_positioner_yvalue},
-	{"set_positioner_xbounds",		set_positioner_xbounds},
-	{"set_positioner_ybounds",		set_positioner_ybounds},
-	{"get_positioner_xvalue",		get_positioner_xvalue},
-	{"get_positioner_yvalue",		get_positioner_yvalue},
-	{"get_positioner_xbounds",		get_positioner_xbounds},
-	{"get_positioner_ybounds",		get_positioner_ybounds},
+	{"set_positioner_xvalue",	(method)set_positioner_xvalue},
+	{"set_positioner_yvalue",	(method)set_positioner_yvalue},
+	{"set_positioner_xbounds",	(method)set_positioner_xbounds},
+	{"set_positioner_ybounds",	(method)set_positioner_ybounds},
+	{"get_positioner_xvalue",	(method)get_positioner_xvalue},
+	{"get_positioner_yvalue",	(method)get_positioner_yvalue},
+	{"get_positioner_xbounds",	(method)get_positioner_xbounds},
+	{"get_positioner_ybounds",	(method)get_positioner_ybounds},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1387,8 +1387,8 @@
 }
 
 static struct methodlist timer_methods[] = {
-	{"set_timer",		set_timer},
-	{"get_timer",		get_timer},
+	{"set_timer",		(method)set_timer},
+	{"get_timer",		(method)get_timer},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1399,7 +1399,7 @@
 	FL_FORM *ob_form;
 } formobject;
 
-extern typeobject Formtype; /* Forward */
+staticforward typeobject Formtype;
 
 #define is_formobject(v) ((v)->ob_type == &Formtype)
 
@@ -1813,40 +1813,40 @@
 
 static struct methodlist form_methods[] = {
 /* adm */
-	{"show_form",		form_show_form},
-	{"hide_form",		form_hide_form},
-	{"redraw_form",		form_redraw_form},
-	{"set_form_position",	form_set_form_position},
-	{"set_form_size",	form_set_form_size},
-	{"scale_form",		form_scale_form},
-	{"freeze_form",		form_freeze_form},
-	{"unfreeze_form",	form_unfreeze_form},
-	{"activate_form",	form_activate_form},
-	{"deactivate_form",	form_deactivate_form},
-	{"bgn_group",		form_bgn_group},
-	{"end_group",		form_end_group},
-	{"find_first",		form_find_first},
-	{"find_last",		form_find_last},
-	{"set_object_focus",	form_set_object_focus},
+	{"show_form",		(method)form_show_form},
+	{"hide_form",		(method)form_hide_form},
+	{"redraw_form",		(method)form_redraw_form},
+	{"set_form_position",	(method)form_set_form_position},
+	{"set_form_size",	(method)form_set_form_size},
+	{"scale_form",		(method)form_scale_form},
+	{"freeze_form",		(method)form_freeze_form},
+	{"unfreeze_form",	(method)form_unfreeze_form},
+	{"activate_form",	(method)form_activate_form},
+	{"deactivate_form",	(method)form_deactivate_form},
+	{"bgn_group",		(method)form_bgn_group},
+	{"end_group",		(method)form_end_group},
+	{"find_first",		(method)form_find_first},
+	{"find_last",		(method)form_find_last},
+	{"set_object_focus",	(method)form_set_object_focus},
 
 /* basic objects */
-	{"add_button",		form_add_button},
-/*	{"add_bitmap",		form_add_bitmap}, */
-	{"add_lightbutton",	form_add_lightbutton},
-	{"add_roundbutton",	form_add_roundbutton},
-	{"add_menu",		form_add_menu},
-	{"add_slider",		form_add_slider},
-	{"add_positioner",	form_add_positioner},
-	{"add_valslider",	form_add_valslider},
-	{"add_dial",		form_add_dial},
-	{"add_counter",		form_add_counter},
-	{"add_box",		form_add_box},
-	{"add_clock",		form_add_clock},
-	{"add_choice",		form_add_choice},
-	{"add_browser",		form_add_browser},
-	{"add_input",		form_add_input},
-	{"add_timer",		form_add_timer},
-	{"add_text",		form_add_text},
+	{"add_button",		(method)form_add_button},
+/*	{"add_bitmap",		(method)form_add_bitmap}, */
+	{"add_lightbutton",	(method)form_add_lightbutton},
+	{"add_roundbutton",	(method)form_add_roundbutton},
+	{"add_menu",		(method)form_add_menu},
+	{"add_slider",		(method)form_add_slider},
+	{"add_positioner",	(method)form_add_positioner},
+	{"add_valslider",	(method)form_add_valslider},
+	{"add_dial",		(method)form_add_dial},
+	{"add_counter",		(method)form_add_counter},
+	{"add_box",		(method)form_add_box},
+	{"add_clock",		(method)form_add_clock},
+	{"add_choice",		(method)form_add_choice},
+	{"add_browser",		(method)form_add_browser},
+	{"add_input",		(method)form_add_input},
+	{"add_timer",		(method)form_add_timer},
+	{"add_text",		(method)form_add_text},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1918,19 +1918,19 @@
 	return newstringobject(buf);
 }
 
-typeobject Formtype = {
+static typeobject Formtype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"FORMS_form",		/*tp_name*/
-	sizeof(formobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"FORMS_form",			/*tp_name*/
+	sizeof(formobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	form_dealloc,		/*tp_dealloc*/
-	0,			/*tp_print*/
-	form_getattr,		/*tp_getattr*/
-	form_setattr,		/*tp_setattr*/
-	0,			/*tp_compare*/
-	form_repr,		/*tp_repr*/
+	(destructor)form_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)form_getattr,	/*tp_getattr*/
+	(setattrfunc)form_setattr,	/*tp_setattr*/
+	0,				/*tp_compare*/
+	(reprfunc)form_repr,		/*tp_repr*/
 };
 
 static object *
diff --git a/Modules/fmmodule.c b/Modules/fmmodule.c
index aa49be3..4875d9a 100644
--- a/Modules/fmmodule.c
+++ b/Modules/fmmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -40,7 +40,7 @@
 	fmfonthandle fh_fh;
 } fhobject;
 
-extern typeobject Fhtype;	/* Really static, forward */
+staticforward typeobject Fhtype;
 
 #define is_fhobject(v)		((v)->ob_type == &Fhtype)
 
@@ -166,15 +166,15 @@
 }
 
 static struct methodlist fh_methods[] = {
-	{"scalefont",	fh_scalefont},
-	{"setfont",	fh_setfont},
-	{"getfontname",	fh_getfontname},
-	{"getcomment",	fh_getcomment},
-	{"getfontinfo",	fh_getfontinfo},
+	{"scalefont",	(method)fh_scalefont},
+	{"setfont",	(method)fh_setfont},
+	{"getfontname",	(method)fh_getfontname},
+	{"getcomment",	(method)fh_getcomment},
+	{"getfontinfo",	(method)fh_getfontinfo},
 #if 0
-	{"getwholemetrics",	fh_getwholemetrics},
+	{"getwholemetrics",	(method)fh_getwholemetrics},
 #endif
-	{"getstrwidth",	fh_getstrwidth},
+	{"getstrwidth",	(method)fh_getstrwidth},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -196,17 +196,17 @@
 
 static typeobject Fhtype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"font handle",		/*tp_name*/
-	sizeof(fhobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"font handle",			/*tp_name*/
+	sizeof(fhobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	fh_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	fh_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
+	(destructor)fh_dealloc,		/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)fh_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 
 
diff --git a/Modules/imageop.c b/Modules/imageop.c
index 841ec1b..57cb90b 100644
--- a/Modules/imageop.c
+++ b/Modules/imageop.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -161,7 +161,7 @@
 	for (y=1; y<maxy; y++) {	/* Interpolate other lines */
 	    for(x=0; x<maxx; x++) {
 		i = y*maxx + x;
-		*ncp++ = (cp[i] + cp[i-maxx]) >> 1;
+		*ncp++ = ((int)cp[i] + (int)cp[i-maxx]) >> 1;
 	    }
 	}
     } else {
@@ -171,11 +171,11 @@
 	    for(x=0; x<maxx; x++) {
 		i = (y*maxx + x)*4 + 1;
 		*ncp++ = 0;	/* Skip alfa comp */
-		*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
+		*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
 		i++;
-		*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
+		*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
 		i++;
-		*ncp++ = (cp[i] + cp[i-4*maxx]) >> 1;
+		*ncp++ = ((int)cp[i] + (int)cp[i-4*maxx]) >> 1;
 	    }
 	}
     }
@@ -210,7 +210,7 @@
     bit = 0x80;
     ovalue = 0;
     for ( i=0; i < len; i++ ) {
-	if ( cp[i] > tres )
+	if ( (int)cp[i] > tres )
 	  ovalue |= bit;
 	bit >>= 1;
 	if ( bit == 0 ) {
@@ -252,7 +252,7 @@
     pos = 0;
     ovalue = 0;
     for ( i=0; i < len; i++ ) {
-	ovalue |= (cp[i] & 0xf0) >> pos;
+	ovalue |= ((int)cp[i] & 0xf0) >> pos;
 	pos += 4;
 	if ( pos == 8 ) {
 	    *ncp++ = ovalue;
@@ -293,7 +293,7 @@
     pos = 0;
     ovalue = 0;
     for ( i=0; i < len; i++ ) {
-	ovalue |= (cp[i] & 0xc0) >> pos;
+	ovalue |= ((int)cp[i] & 0xc0) >> pos;
 	pos += 2;
 	if ( pos == 8 ) {
 	    *ncp++ = ovalue;
diff --git a/Modules/imgfile.c b/Modules/imgfile.c
index e57d6c4..7163d72 100644
--- a/Modules/imgfile.c
+++ b/Modules/imgfile.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Modules/makesetup b/Modules/makesetup
index b5cc57b..69159f7 100755
--- a/Modules/makesetup
+++ b/Modules/makesetup
@@ -1,24 +1,103 @@
 #! /bin/sh
 
-# This script converts Makefile.in.in and config.c.in into Makefile.in
-# and config.c, based on the module definitions found in the file
-# Setup.
+# Convert templates into Makefile and config.c, based on the module
+# definitions found in the file Setup.
+#
+# Usage: makesetup [-s dir] [-c file] [-m file] [Setup] ... [-n [Setup] ...]
+#
+# Options:
+# -s directory: alternative source directory (default derived from $0)
+# -c file:      alternative config.c template (default $srcdir/config.c.in)
+# -c -:         don't write config.c
+# -m file:      alternative Makefile template (default ./Makefile.pre)
+# -m -:         don't write Makefile
+#
+# Remaining arguments are one or more Setup files (default ./Setup).
+# Setup files after a -n option are used for their variables, modules
+# and libraries but not for their .o files.
+#
+# See Setup.in for a description of the format of the Setup file.
+#
+# The following edits are made:
+#
+# Copying config.c.in to config.c:
+# - insert an identifying comment at the start
+# - for each <module> mentioned in Setup:
+#   + insert 'extern void init<module>();' before MARKER 1
+#   + insert '{"<module>", initmodule},' before MARKER 2
+#
+# Copying Makefile.pre to Makefile:
+# - insert an identifying comment at the start
+# - replace @MODOBJS@ by the list of objects from Setup (except for
+#   Setup files after a -n option)
+# - replace @MODLIBS@ by the list of libraries from Setup
+# - for each object file mentioned in Setup, insert a rule
+#   '<file>.o: <file>.c; <build commands>' before the comment
+#   'Rules added by makesetup'
+# - for each variable definition found in Setup, insert the definition
+#   before the comment 'Definitions added by makesetup'
 
+# Loop over command line options
+usage='
+usage: makesetup [-s srcdir] [-c config.c.in] [-m Makefile.pre]
+                 [Setup] ... [-n [Setup] ...]'
+srcdir=''
+config=''
+makepre=''
+noobjects=''
+while :
+do
+	case $1 in
+	-s)	shift; srcdir=$1; shift;;
+	-c)	shift; config=$1; shift;;
+	-m)	shift; makepre=$1; shift;;
+	--)	shift; break;;
+	-n)	noobjects=yes;;
+	-*)	echo "$usage" 1>&2; exit 2;;
+	*)	break;;
+	esac
+done
+
+# Set default srcdir and config if not set by command line
+# (Not all systems have dirname)
+case $srcdir in
+'')	case $0 in
+	*/*)	srcdir=`echo $0 | sed 's,/[^/]*$,,'`;;
+	*)	srcdir=.;;
+	esac;;
+esac
+case $config in
+'')	config=$srcdir/config.c.in;;
+esac
+case $makepre in
+'')	makepre=Makefile.pre;;
+esac
+
+# Newline for sed i and a commands
 NL="\\
 "
 
-sed -e 's/#.*//' -e '/^[ 	]*$/d' ${1-Setup} |
+# Main loop
+for i in ${*-Setup}
+do
+	case $i in
+	-n)	echo '<noobjects>';;
+	*)	cat "$i";;
+	esac
+done |
+sed -e 's/[ 	]*#.*//' -e '/^[ 	]*$/d' |
 (
 	DEFS=
 	MODS=
 	OBJS=
 	LIBS=
 	RULES=
-
 	while read line
 	do
+		# Output DEFS in reverse order so first definition overrides
 		case $line in
-		*=*)	DEFS="$DEFS$line$NL"; continue;;
+		*=*)	DEFS="$line$NL$DEFS"; continue;;
+		'<noobjects>')	noobjects=yes; continue;; 
 		esac
 		objs=
 		cpps=
@@ -27,7 +106,7 @@
 		do
 			case $arg in
 			-[IDUC]*)	cpps="$cpps $arg";;
-			-[Ll]*)		LIBS="$LIBS $arg";;
+			-[A-Zl]*)	LIBS="$LIBS $arg";;
 			*.a)		LIBS="$LIBS $arg";;
 			*.o)		objs="$objs $arg";;
 			*.*)		echo 1>&2 "bad word $arg in $line"
@@ -37,9 +116,16 @@
 					exit 1;;
 			esac
 		done
+		case $noobjects in
+		yes)	continue;;
+		esac
 		for obj in $objs
 		do
 		  src=`basename $obj .o`.c
+		  case $src in
+		  glmodule.c) ;;
+		  *) src='$(srcdir)/'$src;;
+		  esac
 		  RULES="$RULES$obj: $src; \$(CC) \$(CFLAGS) $cpps -c $src$NL"
 		done
 		OBJS="$OBJS $objs"
@@ -52,20 +138,29 @@
 		EXTDECLS="${EXTDECLS}extern void init$mod();$NL"
 		INITBITS="${INITBITS}	{\"$mod\", init$mod},$NL"
 	done
-	sed -e "
-		/MARKER 1/i$NL$EXTDECLS
 
+	case $config in
+	-)  ;;
+	*)  sed -e "
+		1i$NL/* Generated automatically from $config by makesetup. */
+		/MARKER 1/i$NL$EXTDECLS
 		/MARKER 2/i$NL$INITBITS
 
-		" config.c.in >config.c
+		" $config >config.c
+	    ;;
+	esac
 
-	sed -e "
+	case $makepre in
+	-)  ;;
+	*)  sed -e "
+		1i$NL# Generated automatically from $makepre by makesetup.
 		s%@MODOBJS@%$OBJS%
 		s%@MODLIBS@%$LIBS%
-		/Rules added by ..makesetup/a$NL$NL$RULES
-		
-		/Definitions added by ..makesetup/a$NL$NL$DEFS
-		
-		" Makefile.in.in >Makefile.in
+		/Rules added by makesetup/a$NL$NL$RULES
+		/Definitions added by makesetup/a$NL$NL$DEFS
+
+		" $makepre >Makefile
+	    ;;
+	esac
 
 )
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index 67e3cf7..4137e60 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -40,9 +40,11 @@
 #undef HUGE_VAL
 #endif
 
+#ifndef macintosh
 #ifndef __STDC__
 extern double fmod PROTO((double, double));
 #endif
+#endif
 
 #ifdef HUGE_VAL
 #define CHECK(x) if (errno != 0) ; \
@@ -132,10 +134,14 @@
 FUNC1(math_tan, tan)
 FUNC1(math_tanh, tanh)
 
+#ifndef macintosh
+
 double	frexp PROTO((double, int *));
 double	ldexp PROTO((double, int));
 double	modf PROTO((double, double *));
 
+#endif
+
 static object *
 math_frexp(self, args)
 	object *self;
@@ -180,7 +186,15 @@
 	if (!getdoublearg(args, &x))
 		return NULL;
 	errno = 0;
+#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
+{
+	extended e;
+	x = modf(x, &e);
+	y = e;
+}
+#else
 	x = modf(x, &y);
+#endif
 	CHECK(x);
 	if (errno != 0)
 		return math_error();
diff --git a/Modules/md5.h b/Modules/md5.h
index 5c01861..29ac540 100644
--- a/Modules/md5.h
+++ b/Modules/md5.h
@@ -32,6 +32,9 @@
 The following makes PROTOTYPES default to 0 if it has not already
   been defined with C compiler flags.
  */
+#ifdef HAVE_PROTOTYPES
+#define PROTOTYPES 1
+#endif
 #ifndef PROTOTYPES
 #define PROTOTYPES 0
 #endif
diff --git a/Modules/md5c.c b/Modules/md5c.c
index ffa0f0f..d7c7e4f 100644
--- a/Modules/md5c.c
+++ b/Modules/md5c.c
@@ -23,6 +23,9 @@
 documentation and/or software.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 #include "md5.h"
 
 /* Constants for MD5Transform routine.
diff --git a/Modules/md5module.c b/Modules/md5module.c
index 6230cee..68d52f4 100644
--- a/Modules/md5module.c
+++ b/Modules/md5module.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -21,44 +21,43 @@
 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 ******************************************************************/
+
 /* MD5 module */
 
-/* This module provides an interface to a message digest algorithm,
-   MD5 in this case */
+/* This module provides an interface to the RSA Data Security,
+   Inc. MD5 Message-Digest Algorithm, described in RFC 1321.
+   It requires the files md5c.c and md5.h (which are slightly changed
+   from the versions in the RFC to avoid the "global.h" file.) */
+
 
 /* MD5 objects */
 
 #include "allobjects.h"
-#include "modsupport.h"		/* For getargs() etc. */
+#include "modsupport.h"
 
 #include "md5.h"
+
 typedef struct {
 	OB_HEAD
         MD5_CTX	md5;		/* the context holder */
 } md5object;
 
-extern typeobject MD5type;	/* Really static, forward */
+staticforward typeobject MD5type;
 
 #define is_md5object(v)		((v)->ob_type == &MD5type)
 
-/* #define MD5_DEBUG */
-
 static md5object *
 newmd5object()
 {
 	md5object *md5p;
 
-
-#ifdef MD5_DEBUG
-	fputs( "md5_object() called...\n", stderr );
-#endif /* def MD5_DEBUG */
 	md5p = NEWOBJ(md5object, &MD5type);
 	if (md5p == NULL)
 		return NULL;
 
 	MD5Init(&md5p->md5);	/* actual initialisation */
 	return md5p;
-} /* newmd5object() */
+}
 
 
 /* MD5 methods */
@@ -67,15 +66,99 @@
 md5_dealloc(md5p)
 	md5object *md5p;
 {
-#ifdef MD5_DEBUG
-	fputs( "md5_dealloc() called...\n", stderr );
-#endif /* def MD5_DEBUG */
-
 	DEL(md5p);
-} /* md5_dealloc() */
+}
 
 
-/* MD5 initialisation */
+/* MD5 methods-as-attributes */
+
+static object *
+md5_update(self, args)
+	md5object *self;
+	object *args;
+{
+	unsigned char *cp;
+	int len;
+
+	if (!getargs(args, "s#", &cp, &len))
+		return NULL;
+
+	MD5Update(&self->md5, cp, len);
+
+	INCREF(None);
+	return None;
+}
+
+static object *
+md5_digest(self, args)
+	md5object *self;
+	object *args;
+{
+
+	MD5_CTX mdContext;
+	unsigned char aDigest[16];
+
+	if (!getnoarg(args))
+		return NULL;
+
+	/* make a temporary copy, and perform the final */
+	mdContext = self->md5;
+	MD5Final(aDigest, &mdContext);
+
+	return newsizedstringobject((char *)aDigest, 16);
+}
+
+static object *
+md5_copy(self, args)
+	md5object *self;
+	object *args;
+{
+	md5object *md5p;
+
+	if (!getnoarg(args))
+		return NULL;
+
+	if ((md5p = newmd5object()) == NULL)
+		return NULL;
+
+	md5p->md5 = self->md5;
+
+	return (object *)md5p;
+}
+
+static struct methodlist md5_methods[] = {
+	{"update",		(method)md5_update},
+	{"digest",		(method)md5_digest},
+	{"copy",		(method)md5_copy},
+	{NULL,			NULL}		/* sentinel */
+};
+
+static object *
+md5_getattr(self, name)
+	md5object *self;
+	char *name;
+{
+	return findmethod(md5_methods, (object *)self, name);
+}
+
+static typeobject MD5type = {
+	OB_HEAD_INIT(&Typetype)
+	0,			/*ob_size*/
+	"md5",			/*tp_name*/
+	sizeof(md5object),	/*tp_size*/
+	0,			/*tp_itemsize*/
+	/* methods */
+	(destructor)md5_dealloc, /*tp_dealloc*/
+	0,			/*tp_print*/
+	(getattrfunc)md5_getattr, /*tp_getattr*/
+	0,			/*tp_setattr*/
+	0,			/*tp_compare*/
+	0,			/*tp_repr*/
+        0,			/*tp_as_number*/
+};
+
+
+/* MD5 functions */
 
 static object *
 MD5_md5(self, args)
@@ -83,13 +166,8 @@
 	object *args;
 {
 	md5object *md5p;
-	char *cp = (char *)NULL;
+	unsigned char *cp = NULL;
 	int len;
-	
-
-#ifdef MD5_DEBUG
-	fputs("MD5_md5() called...\n", stderr);
-#endif /* def MD5_DEBUG */
 
 	if (!getargs(args, "")) {
 		err_clear();
@@ -104,108 +182,13 @@
 		MD5Update(&md5p->md5, cp, len);
 
 	return (object *)md5p;
-} /* MD5_md5() */
+}
 
 
-/* MD5 methods-as-attributes */
-static object *
-md5_update(self, args)
-	md5object *self;
-	object *args;
-{
-	char *cp;
-	int len;
-
-	
-	if (!getargs(args, "s#", &cp, &len))
-		return NULL;
-
-	MD5Update(&self->md5, cp, len);
-
-	INCREF(None);
-	return None;
-} /* md5_update() */
-
-#define DIGESTLEN	16	/* this is used twice--walrus@umich.edu */
-static object *
-md5_digest(self, args)
-	md5object *self;
-	object *args;
-{
-
-	MD5_CTX mdContext;
-	char aDigest[DIGESTLEN];
-	
-
-	if (!getnoarg(args))
-		return NULL;
-
-	/* make a temporary copy, and perform the final */
-	mdContext = self->md5;
-	MD5Final(aDigest, &mdContext);
-
-	return newsizedstringobject((char *)aDigest, DIGESTLEN);
-} /* md5_digest() */
-#undef DIGESTLEN
-
-static object *
-md5_copy(self, args)
-	md5object *self;
-	object *args;
-{
-	md5object *md5p;
-
-	
-	if (!getnoarg(args))
-		return NULL;
-
-	if ((md5p = newmd5object()) == NULL)
-		return NULL;
-
-	md5p->md5 = self->md5;
-
-	return (object *)md5p;
-} /* md5_copy() */
-
-		
-static struct methodlist md5_methods[] = {
-	{"update",		md5_update},
-	{"digest",		md5_digest},
-	{"copy",		md5_copy},
-	{NULL,			NULL}		/* sentinel */
-};
-
-static object *
-md5_getattr(self, name)
-	md5object *self;
-	char *name;
-{
-	return findmethod(md5_methods, (object *)self, name);
-} /* md5_getattr() */
-
-#ifndef _AIX
-static
-#endif
-typeobject MD5type = {
-	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"md5",			/*tp_name*/
-	sizeof(md5object),	/*tp_size*/
-	0,			/*tp_itemsize*/
-	/* methods */
-	md5_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	md5_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
-        0,		 /*tp_as_number*/
-};
-
 /* List of functions exported by this module */
 
 static struct methodlist md5_functions[] = {
-	{"md5",			MD5_md5},
+	{"md5",			(method)MD5_md5},
 	{NULL,			NULL}		 /* Sentinel */
 };
 
@@ -215,12 +198,5 @@
 void
 initmd5()
 {
-#ifdef MD5_DEBUG
-	fputs( "initmd5() called...\n", stderr );
-#endif /* def MD5_DEBUG */
 	(void)initmodule("md5", md5_functions);
-} /* initmd5() */
-
-#ifdef MAKEDUMMYINT
-int _md5_dummy_int;	/* XXX otherwise, we're .bss-less (DYNLOAD->Jack?) */
-#endif /* def MAKEDUMMYINT */
+}
diff --git a/Modules/mpzmodule.c b/Modules/mpzmodule.c
index d0b9d7f..9d0bdb0 100644
--- a/Modules/mpzmodule.c
+++ b/Modules/mpzmodule.c
@@ -1,6 +1,6 @@
 /***********************************************************
-Copyright 1992 by Stichting Mathematisch Centrum, Amsterdam, The
-Netherlands.
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
 
                         All Rights Reserved
 
@@ -21,6 +21,7 @@
 OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 
 ******************************************************************/
+
 /* MPZ module */
 
 /* This module provides an interface to an alternate Multi-Precision
@@ -35,6 +36,7 @@
 #include "allobjects.h"
 #include "modsupport.h"		/* For getargs() etc. */
 #include <assert.h>
+#include <sys/types.h>		/* For size_t */
 
 /*
 **	These are the cpp-flags used in this file...
@@ -89,7 +91,7 @@
         MP_INT	mpz;		/* the actual number */
 } mpzobject;
 
-extern typeobject MPZtype;	/* Really static, forward */
+staticforward typeobject MPZtype;
 
 #define is_mpzobject(v)		((v)->ob_type == &MPZtype)
 
@@ -993,8 +995,10 @@
 	err_setstr(TypeError, "number coercion (to mpzobject) failed");
 	return NULL;
 } /* mpz_mpzcoerce() */
-
-static void mpz_divm();
+	
+/* Forward */
+static void mpz_divm PROTO((MP_INT *res, const MP_INT *num,
+			    const MP_INT *den, const MP_INT *mod));
 
 static object *
 MPZ_powm(self, args)
@@ -1546,7 +1550,7 @@
 	{"hex",			mpz_hex},
 	{"oct",			mpz_oct},
 #endif /* def MPZ_CONVERSIONS_AS_METHODS */
-	{"binary", (object * (*) (object *, object *)) mpz_binary},
+	{"binary",		(object *(*)(object *, object *))mpz_binary},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -1601,9 +1605,10 @@
 
 
 
-#define UF (object* (*) FPROTO((object *))) /* Unary function */
-#define BF (object* (*) FPROTO((object *, object *))) /* Binary function */
-#define IF (int (*) FPROTO((object *))) /* Int function */
+#define UF (unaryfunc)
+#define BF (binaryfunc)
+#define IF (inquiry)
+#define CF (coercion)
 
 static number_methods mpz_as_number = {
 	BF mpz_addition,	/*nb_add*/
@@ -1623,8 +1628,7 @@
 	BF mpz_andfunc,		/*nb_and*/
 	BF mpz_xorfunc,		/*nb_xor*/
 	BF mpz_orfunc,		/*nb_or*/
-	(int (*) FPROTO((object **, object **)))
-	mpz_coerce,		/*nb_coerce*/
+	CF mpz_coerce,		/*nb_coerce*/
 #ifndef MPZ_CONVERSIONS_AS_METHODS
 	UF mpz_int,		/*nb_int*/
 	UF mpz_long,		/*nb_long*/
@@ -1641,13 +1645,13 @@
 	sizeof(mpzobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	(void (*) (object *)) mpz_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	(object * (*)(object *, char *)) mpz_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	(int (*) (object *, object *))  mpz_compare,	/*tp_compare*/
-	mpz_repr,	/*tp_repr*/
-        &mpz_as_number, /*tp_as_number*/
+	(destructor)mpz_dealloc, /*tp_dealloc*/
+	0,			/*tp_print*/
+	(getattrfunc)mpz_getattr, /*tp_getattr*/
+	0,			/*tp_setattr*/
+	(cmpfunc)mpz_compare,	/*tp_compare*/
+	(reprfunc)mpz_repr,	/*tp_repr*/
+        &mpz_as_number, 	/*tp_as_number*/
 };
 
 /* List of functions exported by this module */
diff --git a/Modules/nismodule.c b/Modules/nismodule.c
index 5db26f4..00c3561 100644
--- a/Modules/nismodule.c
+++ b/Modules/nismodule.c
@@ -57,6 +57,8 @@
 	return map;
 }
 
+typedef int (*foreachfunc) PROTO((int, char *, int, char *, int, char *));
+
 static int
 nis_foreach (instatus, inkey, inkeylen, inval, invallen, indata)
 	int instatus;
@@ -134,7 +136,7 @@
 	cat = newdictobject ();
 	if (cat == NULL)
 		return NULL;
-	cb.foreach = nis_foreach;
+	cb.foreach = (foreachfunc)nis_foreach;
 	cb.data = (char *)cat;
 	BGN_SAVE
 	map = nis_mapname (map);
@@ -147,9 +149,17 @@
 	return cat;
 }
 
-#define YPPROC_MAPLIST ((u_long)11)
-#define YPPROG ((u_long)100004)
-#define YPVERS ((u_long)2)
+/* These should be u_long on Sun h/w but not on 64-bit h/w.
+   This is not portable to machines with 16-bit ints and no prototypes */
+#ifndef YPPROC_MAPLIST
+#define YPPROC_MAPLIST	11
+#endif
+#ifndef YPPROG
+#define YPPROG		100004
+#endif
+#ifndef YPVERS
+#define YPVERS		2
+#endif
 
 typedef char *domainname;
 typedef char *mapname;
@@ -260,8 +270,9 @@
     static nisresp_maplist res;
 
     memset(&res, 0, sizeof(res));
-    if (clnt_call(clnt, YPPROC_MAPLIST, nis_xdr_domainname, argp, nis_xdr_ypresp_maplist
-, &res, TIMEOUT) != RPC_SUCCESS) {
+    if (clnt_call(clnt, YPPROC_MAPLIST, nis_xdr_domainname, (caddr_t)argp,
+		  nis_xdr_ypresp_maplist, (caddr_t)&res, TIMEOUT)
+	!= RPC_SUCCESS) {
         return (NULL);
     }
     return (&res);
diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index 3274c1a..04db26e 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -22,6 +22,8 @@
 
 ******************************************************************/
 
+/* Raw interface to the parser. */
+
 #include "allobjects.h"
 #include "node.h"
 #include "token.h"
@@ -85,12 +87,10 @@
 		err_errno(IOError);
 		return NULL;
 	}
-	err = parse_file(fp, filename, file_input, &n);
+	n = parse_file(fp, filename, file_input);
 	fclose(fp);
-	if (err != E_DONE) {
-		err_input(err);
+	if (n == NULL)
 		return NULL;
-	}
 	res = node2tuple(n);
 	freetree(n);
 	return res;
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 07d12e7..a0f34e5 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -24,78 +24,115 @@
 
 /* POSIX module implementation */
 
-#ifdef AMOEBA
-#define NO_LSTAT
-#define SYSV
-#endif
-
-#ifdef __sgi
-#define DO_PG
-#endif
-
-#ifdef _NEXT_SOURCE
-#define mode_t int
-#define NO_UNAME
-#endif
-
-#include <signal.h>
-#include <string.h>
-#include <setjmp.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#ifdef DO_TIMES
-#include <sys/times.h>
-#include <sys/param.h>
-#include <errno.h>
-#endif
-
-#ifdef SYSV
-
-#define UTIME_STRUCT 1
-#include <dirent.h>
-#define direct dirent
-#ifdef i386
-#define mode_t int
-#endif
-
-#else /* !SYSV */
-
-#include <sys/dir.h>
-
-#endif /* !SYSV */
-
-#ifndef NO_UNISTD
-#include <unistd.h> /* Take this out and hope the best if it doesn't exist */
+#ifdef _M_IX86
+#define NT
+/* NT may be defined externally as well.  If it is defined, the module is
+   actually called 'nt', not 'posix', and some functions don't exist. */
 #endif
 
 #include "allobjects.h"
 #include "modsupport.h"
 #include "ceval.h"
 
-#ifdef _SEQUENT_
+#include <string.h>
+#include <errno.h>
+
+#ifndef macintosh
+#include <sys/types.h>
+#include <sys/stat.h>
+#endif 
+
+#include "mytime.h"		/* For clock_t on some systems */
+
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#else /* _SEQUENT_ */
-/* XXX Aren't these always declared in unistd.h? */
+#else /* !HAVE_UNISTD_H */
+
+#ifdef macintosh
+#include "macdefs.h"
+#else
 extern int mkdir PROTO((const char *, mode_t));
 extern int chdir PROTO((const char *));
 extern int rmdir PROTO((const char *));
 extern int chmod PROTO((const char *, mode_t));
-extern char *getcwd(); /* No PROTO((char *, int)) -- non portable */
+extern int chown PROTO((const char *, uid_t, gid_t));
+extern char *getcwd PROTO((char *, int));
 extern char *strerror PROTO((int));
 extern int link PROTO((const char *, const char *));
 extern int rename PROTO((const char *, const char *));
 extern int stat PROTO((const char *, struct stat *));
 extern int unlink PROTO((const char *));
 extern int pclose PROTO((FILE *));
-#endif /* !_SEQUENT_ */
-#ifdef NO_LSTAT
-#define lstat stat
-#else
-extern int lstat PROTO((const char *, struct stat *));
+#ifdef HAVE_SYMLINK
 extern int symlink PROTO((const char *, const char *));
 #endif
+#ifdef HAVE_LSTAT
+extern int lstat PROTO((const char *, struct stat *));
+#endif
+#endif /* macintosh */
+#endif /* !HAVE_UNISTD_H */
 
+#if 1
+/* XXX These are for SunOS4.1.3 but shouldn't hurt elsewhere */
+extern int rename();
+extern int pclose();
+extern int lstat();
+extern int symlink();
+#endif
+
+#ifdef HAVE_UTIME_H
+#include <utime.h>
+#endif
+
+#ifdef HAVE_SYS_TIMES_H
+#include <sys/times.h>
+#endif
+
+#ifdef HAVE_SYS_PARAM_H
+#include <sys/param.h>
+#endif
+
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#endif
+
+/* unistd.h defines _POSIX_VERSION on POSIX.1 systems.  */
+#if defined(DIRENT) || defined(_POSIX_VERSION)
+#include <dirent.h>
+#define NLENGTH(dirent) (strlen((dirent)->d_name))
+#else /* not (DIRENT or _POSIX_VERSION) */
+#define dirent direct
+#define NLENGTH(dirent) ((dirent)->d_namlen)
+#ifdef SYSNDIR
+#include <sys/ndir.h>
+#endif /* SYSNDIR */
+#ifdef SYSDIR
+#include <sys/dir.h>
+#endif /* SYSDIR */
+#ifdef NDIR
+#include <ndir.h>
+#endif /* NDIR */
+#endif /* not (DIRENT or _POSIX_VERSION) */
+
+#ifdef NT
+#include <direct.h>
+#include <io.h>
+#include <process.h>
+#include <windows.h>
+#define popen   _popen
+#endif /* NT */
+
+#ifdef OS2
+#include <io.h>
+#endif
 
 /* Return a dictionary corresponding to the POSIX environment table */
 
@@ -195,6 +232,25 @@
 }
 
 static object *
+posix_strintint(args, func)
+	object *args;
+	int (*func) FPROTO((const char *, int, int));
+{
+	char *path;
+	int i,i2;
+	int res;
+	if (!getargs(args, "(sii)", &path, &i, &i2))
+		return NULL;
+	BGN_SAVE
+	res = (*func)(path, i, i2);
+	END_SAVE
+	if (res < 0)
+		return posix_error();
+	INCREF(None);
+	return None;
+}
+
+static object *
 posix_do_stat(self, args, statfunc)
 	object *self;
 	object *args;
@@ -242,6 +298,16 @@
 	return posix_strint(args, chmod);
 }
 
+#ifdef HAVE_CHOWN
+static object *
+posix_chown(self, args)
+	object *self;
+	object *args;
+{
+	return posix_strintint(args, chown);
+}
+#endif
+
 static object *
 posix_getcwd(self, args)
 	object *self;
@@ -259,6 +325,7 @@
 	return newstringobject(buf);
 }
 
+#ifdef HAVE_LINK
 static object *
 posix_link(self, args)
 	object *self;
@@ -266,7 +333,64 @@
 {
 	return posix_2str(args, link);
 }
+#endif
 
+#ifdef NT
+static object *
+posix_listdir(self, args)
+	object *self;
+	object *args;
+{
+	char *name;
+	int len;
+	object *d, *v;
+	HANDLE hFindFile;
+	WIN32_FIND_DATA FileData;
+	char namebuf[MAX_PATH+5];
+
+	if (!getargs(args, "s#", &name, &len))
+		return NULL;
+	if (len >= MAX_PATH) {
+		err_setstr(ValueError, "path too long");
+		return NULL;
+	}
+	strcpy(namebuf, name);
+	if (namebuf[len-1] != '/' && namebuf[len-1] != '\\')
+		namebuf[len++] = '/';
+	strcpy(namebuf + len, "*.*");
+
+	if ((d = newlistobject(0)) == NULL)
+		return NULL;
+
+	hFindFile = FindFirstFile(namebuf, &FileData);
+	if (hFindFile == INVALID_HANDLE_VALUE) {
+		errno = GetLastError();
+		return posix_error();
+	}
+	do {
+		v = newstringobject(FileData.cFileName);
+		if (v == NULL) {
+			DECREF(d);
+			d = NULL;
+			break;
+		}
+		if (addlistitem(d, v) != 0) {
+			DECREF(v);
+			DECREF(d);
+			d = NULL;
+			break;
+		}
+		DECREF(v);
+	} while (FindNextFile(hFindFile, &FileData) == TRUE);
+
+	if (FindClose(hFindFile) == FALSE) {
+		errno = GetLastError();
+		return posix_error();
+	}
+
+	return d;
+}
+#else /* ! NT */
 static object *
 posix_listdir(self, args)
 	object *self;
@@ -275,7 +399,7 @@
 	char *name;
 	object *d, *v;
 	DIR *dirp;
-	struct direct *ep;
+	struct dirent *ep;
 	if (!getargs(args, "s", &name))
 		return NULL;
 	BGN_SAVE
@@ -308,6 +432,7 @@
 
 	return d;
 }
+#endif /* ! NT */
 
 static object *
 posix_mkdir(self, args)
@@ -317,6 +442,7 @@
 	return posix_strint(args, mkdir);
 }
 
+#ifdef HAVE_NICE
 static object *
 posix_nice(self, args)
 	object *self;
@@ -331,21 +457,7 @@
 		return posix_error();
 	return newintobject((long) value);
 }
-
-#if i386 && ! _SEQUENT_
-int
-rename(from, to)
-	char *from;
-	char *to;
-{
-	int status;
-	/* XXX Shouldn't this unlink the destination first? */
-	status = link(from, to);
-	if (status != 0)
-		return status;
-	return unlink(from);
-}
-#endif /* i386 && ! _SEQUENT_ */
+#endif /* HAVE_NICE */
 
 static object *
 posix_rename(self, args)
@@ -408,11 +520,7 @@
 	return posix_1str(args, unlink);
 }
 
-#ifndef NO_UNAME
-#include <sys/utsname.h>
-
-extern int uname PROTO((struct utsname *));
-
+#ifdef HAVE_UNAME
 static object *
 posix_uname(self, args)
 	object *self;
@@ -435,11 +543,7 @@
 		       u.version,
 		       u.machine);
 }
-#endif /* NO_UNAME */
-
-#ifdef UTIME_STRUCT
-#include <utime.h>
-#endif
+#endif /* HAVE_UNAME */
 
 static object *
 posix_utime(self, args)
@@ -449,12 +553,11 @@
 	char *path;
 	int res;
 
-#ifdef UTIME_STRUCT
+#ifdef HAVE_UTIME_H
 	struct utimbuf buf;
 #define ATIME buf.actime
 #define MTIME buf.modtime
 #define UTIME_ARG &buf
-
 #else
 	time_t buf[2];
 #define ATIME buf[0]
@@ -532,8 +635,12 @@
 	}
 	argvlist[argc] = NULL;
 
+#ifdef BAD_EXEC_PROTOTYPES
+	execv(path, (const char **) argvlist);
+#else
 	execv(path, argvlist);
-	
+#endif
+
 	/* If we get here it's definitely an error */
 
 	DEL(argvlist);
@@ -614,7 +721,12 @@
 	}
 	envlist[envc] = 0;
 
+
+#ifdef BAD_EXEC_PROTOTYPES
+	execve(path, (const char **)argvlist, envlist);
+#else
 	execve(path, argvlist, envlist);
+#endif
 	
 	/* If we get here it's definitely an error */
 
@@ -684,6 +796,7 @@
 	return newintobject((long)getpid());
 }
 
+#ifdef HAVE_GETPGRP
 static object *
 posix_getpgrp(self, args)
 	object *self;
@@ -691,13 +804,15 @@
 {
 	if (!getnoarg(args))
 		return NULL;
-#ifdef SYSV
-	return newintobject((long)getpgrp());
-#else
+#ifdef GETPGRP_HAVE_ARG
 	return newintobject((long)getpgrp(0));
+#else
+	return newintobject((long)getpgrp());
 #endif
 }
+#endif /* HAVE_GETPGRP */
 
+#ifdef HAVE_SETPGRP
 static object *
 posix_setpgrp(self, args)
 	object *self;
@@ -705,16 +820,18 @@
 {
 	if (!getnoarg(args))
 		return NULL;
-#ifdef SYSV
-	if (setpgrp() < 0)
-#else
+#ifdef GETPGRP_HAVE_ARG
 	if (setpgrp(0, 0) < 0)
+#else
+	if (setpgrp() < 0)
 #endif
 		return posix_error();
 	INCREF(None);
 	return None;
 }
 
+#endif /* HAVE_SETPGRP */
+
 static object *
 posix_getppid(self, args)
 	object *self;
@@ -763,12 +880,10 @@
 	END_SAVE
 	if (fp == NULL)
 		return posix_error();
-	/* From now on, ignore SIGPIPE and let the error checking
-	   do the work. */
-	(void) signal(SIGPIPE, SIG_IGN);
 	return newopenfileobject(fp, name, mode, pclose);
 }
 
+#ifdef HAVE_SETUID
 static object *
 posix_setuid(self, args)
 	object *self;
@@ -782,7 +897,9 @@
 	INCREF(None);
 	return None;
 }
+#endif
 
+#ifdef HAVE_SETGID
 static object *
 posix_setgid(self, args)
 	object *self;
@@ -796,17 +913,14 @@
 	INCREF(None);
 	return None;
 }
+#endif
 
+#ifdef HAVE_WAITPID
 static object *
 posix_waitpid(self, args)
 	object *self;
 	object *args;
 {
-#ifdef NO_WAITPID
-	err_setstr(PosixError,
-		   "posix.waitpid() not supported on this system");
-	return NULL;
-#else
 	int pid, options, sts;
 	if (!getargs(args, "(ii)", &pid, &options))
 		return NULL;
@@ -817,8 +931,8 @@
 		return posix_error();
 	else
 		return mkvalue("ii", pid, sts);
-#endif
 }
+#endif /* HAVE_WAITPID */
 
 static object *
 posix_wait(self, args)
@@ -826,8 +940,6 @@
 	object *args;
 {
 	int pid, sts;
-	if (args != NULL)
-		return posix_waitpid(self, args); /* BW compat */
 	BGN_SAVE
 	pid = wait(&sts);
 	END_SAVE
@@ -842,19 +954,20 @@
 	object *self;
 	object *args;
 {
+#ifdef HAVE_LSTAT
 	return posix_do_stat(self, args, lstat);
+#else /* !HAVE_LSTAT */
+	return posix_do_stat(self, args, stat);
+#endif /* !HAVE_LSTAT */
 }
 
+#ifdef HAVE_READLINK
 static object *
 posix_readlink(self, args)
 	object *self;
 	object *args;
 {
-#ifdef NO_LSTAT
-	err_setstr(PosixError, "readlink not implemented on this system");
-	return NULL;
-#else
-	char buf[1024]; /* XXX Should use MAXPATHLEN */
+	char buf[MAXPATHLEN];
 	char *path;
 	int n;
 	if (!getargs(args, "s", &path))
@@ -865,25 +978,23 @@
 	if (n < 0)
 		return posix_error();
 	return newsizedstringobject(buf, n);
-#endif
 }
+#endif /* HAVE_READLINK */
 
+#ifdef HAVE_SYMLINK
 static object *
 posix_symlink(self, args)
 	object *self;
 	object *args;
 {
-#ifdef NO_LSTAT
-	err_setstr(PosixError, "symlink not implemented on this system");
-	return NULL;
-#else
 	return posix_2str(args, symlink);
-#endif
 }
+#endif /* HAVE_SYMLINK */
 
-
-#ifdef DO_TIMES
-
+#ifdef HAVE_TIMES
+#ifndef HZ
+#define HZ 60 /* Universal constant :-) */
+#endif
 static object *
 posix_times(self, args)
 	object *self;
@@ -903,11 +1014,9 @@
 		       (double)t.tms_cutime / HZ,
 		       (double)t.tms_cstime / HZ);
 }
+#endif /* HAVE_TIMES */
 
-#endif /* DO_TIMES */
-
-#ifdef DO_PG
-
+#ifdef HAVE_SETSID
 static object *
 posix_setsid(self, args)
 	object *self;
@@ -920,7 +1029,9 @@
 	INCREF(None);
 	return None;
 }
+#endif /* HAVE_SETSID */
 
+#ifdef HAVE_SETPGID
 static object *
 posix_setpgid(self, args)
 	object *self;
@@ -934,7 +1045,9 @@
 	INCREF(None);
 	return None;
 }
+#endif /* HAVE_SETPGID */
 
+#ifdef HAVE_TCGETPGRP
 static object *
 posix_tcgetpgrp(self, args)
 	object *self;
@@ -948,7 +1061,9 @@
 		return posix_error();
 	return newintobject((long)pgid);
 }
+#endif /* HAVE_TCGETPGRP */
 
+#ifdef HAVE_TCSETPGRP
 static object *
 posix_tcsetpgrp(self, args)
 	object *self;
@@ -962,8 +1077,7 @@
        INCREF(None);
 	return None;
 }
-
-#endif /* DO_PG */
+#endif /* HAVE_TCSETPGRP */
 
 /* Functions acting on file descriptors */
 
@@ -1150,7 +1264,6 @@
 		return posix_error();
 	/* From now on, ignore SIGPIPE and let the error checking
 	   do the work. */
-	(void) signal(SIGPIPE, SIG_IGN);
 	return newopenfileobject(fp, "(fdopen)", mode, fclose);
 }
 
@@ -1174,49 +1287,84 @@
 static struct methodlist posix_methods[] = {
 	{"chdir",	posix_chdir},
 	{"chmod",	posix_chmod},
+#ifdef HAVE_CHOWN
+	{"chown",	posix_chown},
+#endif
 	{"getcwd",	posix_getcwd},
+#ifdef HAVE_LINK
 	{"link",	posix_link},
+#endif 
 	{"listdir",	posix_listdir},
 	{"lstat",	posix_lstat},
 	{"mkdir",	posix_mkdir},
+#ifdef HAVE_NICE
 	{"nice",	posix_nice},
+#endif
+#ifdef HAVE_READLINK
 	{"readlink",	posix_readlink},
+#endif
 	{"rename",	posix_rename},
 	{"rmdir",	posix_rmdir},
 	{"stat",	posix_stat},
+#ifdef HAVE_SYMLINK
 	{"symlink",	posix_symlink},
+#endif
 	{"system",	posix_system},
 	{"umask",	posix_umask},
-#ifndef NO_UNAME
+#ifdef HAVE_UNAME
 	{"uname",	posix_uname},
 #endif
 	{"unlink",	posix_unlink},
+#ifndef NT
 	{"utime",	posix_utime},
-#ifdef DO_TIMES
+#endif /* ! NT */
+#ifdef HAVE_TIMES
 	{"times",	posix_times},
 #endif
 	{"_exit",	posix__exit},
 	{"execv",	posix_execv},
 	{"execve",	posix_execve},
+#ifndef NT
 	{"fork",	posix_fork},
 	{"getegid",	posix_getegid},
 	{"geteuid",	posix_geteuid},
 	{"getgid",	posix_getgid},
+#endif /* ! NT */
 	{"getpid",	posix_getpid},
+#ifdef HAVE_GETPGRP
 	{"getpgrp",	posix_getpgrp},
+#endif
+#ifndef NT
 	{"getppid",	posix_getppid},
 	{"getuid",	posix_getuid},
 	{"kill",	posix_kill},
+#endif /* ! NT */
 	{"popen",	posix_popen},
+#ifdef HAVE_SETUID
 	{"setuid",	posix_setuid},
+#endif
+#ifdef HAVE_SETGID
 	{"setgid",	posix_setgid},
+#endif
+#ifdef HAVE_SETPGRP
 	{"setpgrp",	posix_setpgrp},
+#endif
+#ifndef NT
 	{"wait",	posix_wait},
+#endif /* ! NT */
+#ifdef HAVE_WAITPID
 	{"waitpid",	posix_waitpid},
-#ifdef DO_PG
+#endif
+#ifdef HAVE_SETSID
 	{"setsid",	posix_setsid},
+#endif
+#ifdef HAVE_SETPGID
 	{"setpgid",	posix_setpgid},
+#endif
+#ifdef HAVE_TCGETPGRP
 	{"tcgetpgrp",	posix_tcgetpgrp},
+#endif
+#ifdef HAVE_TCSETPGRP
 	{"tcsetpgrp",	posix_tcsetpgrp},
 #endif
 	{"open",	posix_open},
@@ -1228,12 +1376,35 @@
 	{"write",	posix_write},
 	{"fstat",	posix_fstat},
 	{"fdopen",	posix_fdopen},
+#ifndef NT
 	{"pipe",	posix_pipe},
+#endif /* ! NT */
 
 	{NULL,		NULL}		 /* Sentinel */
 };
 
 
+#ifdef NT
+void
+initnt()
+{
+	object *m, *d, *v;
+	
+	m = initmodule("nt", posix_methods);
+	d = getmoduledict(m);
+	
+	/* Initialize nt.environ dictionary */
+	v = convertenviron();
+	if (v == NULL || dictinsert(d, "environ", v) != 0)
+		fatal("can't define nt.environ");
+	DECREF(v);
+	
+	/* Initialize nt.error exception */
+	PosixError = newstringobject("nt.error");
+	if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
+		fatal("can't define nt.error");
+}
+#else /* ! NT */
 void
 initposix()
 {
@@ -1253,17 +1424,4 @@
 	if (PosixError == NULL || dictinsert(d, "error", PosixError) != 0)
 		fatal("can't define posix.error");
 }
-
-
-/* Function used elsewhere to get a file's modification time */
-
-long
-getmtime(path)
-	char *path;
-{
-	struct stat st;
-	if (stat(path, &st) != 0)
-		return -1;
-	else
-		return st.st_mtime;
-}
+#endif /* ! NT */
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index 00ea348..5775473 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -22,18 +22,13 @@
 
 ******************************************************************/
 
-/* Passwd/group file access module */
+/* UNIX password file access module */
 
 #include "allobjects.h"
 #include "modsupport.h"
 
 #include <sys/types.h>
 #include <pwd.h>
-#include <grp.h>
-
-
-/* Module pwd */
-
 
 static object *mkpwent(p)
 	struct passwd *p;
@@ -109,94 +104,3 @@
 {
 	initmodule("pwd", pwd_methods);
 }
-
-
-/* Module grp */
-
-
-static object *mkgrent(p)
-	struct group *p;
-{
-	object *v, *w;
-	char **member;
-	if ((w = newlistobject(0)) == NULL) {
-		return NULL;
-	}
-	for (member = p->gr_mem; *member != NULL; member++) {
-		object *x = newstringobject(*member);
-		if (x == NULL || addlistitem(w, x) != 0) {
-			XDECREF(x);
-			DECREF(w);
-			return NULL;
-		}
-	}
-	v = mkvalue("(sslO)",
-		       p->gr_name,
-		       p->gr_passwd,
-		       (long)p->gr_gid,
-		       w);
-	DECREF(w);
-	return v;
-}
-
-static object *grp_getgrgid(self, args)
-	object *self, *args;
-{
-	int gid;
-	struct group *p;
-	if (!getintarg(args, &gid))
-		return NULL;
-	if ((p = getgrgid(gid)) == NULL) {
-		err_setstr(KeyError, "getgrgid(): gid not found");
-		return NULL;
-	}
-	return mkgrent(p);
-}
-
-static object *grp_getgrnam(self, args)
-	object *self, *args;
-{
-	char *name;
-	struct group *p;
-	if (!getstrarg(args, &name))
-		return NULL;
-	if ((p = getgrnam(name)) == NULL) {
-		err_setstr(KeyError, "getgrnam(): name not found");
-		return NULL;
-	}
-	return mkgrent(p);
-}
-
-static object *grp_getgrall(self, args)
-	object *self, *args;
-{
-	object *d;
-	struct group *p;
-	if (!getnoarg(args))
-		return NULL;
-	if ((d = newlistobject(0)) == NULL)
-		return NULL;
-	setgrent();
-	while ((p = getgrent()) != NULL) {
-		object *v = mkgrent(p);
-		if (v == NULL || addlistitem(d, v) != 0) {
-			XDECREF(v);
-			DECREF(d);
-			return NULL;
-		}
-	}
-	return d;
-}
-
-static struct methodlist grp_methods[] = {
-	{"getgrgid",	grp_getgrgid},
-	{"getgrnam",	grp_getgrnam},
-	{"getgrall",	grp_getgrall},
-	{NULL,		NULL}		/* sentinel */
-};
-
-void
-initgrp()
-{
-	initmodule("grp", grp_methods);
-}
diff --git a/Modules/regexmodule.c b/Modules/regexmodule.c
index 13c6cb2..c4b15ff 100644
--- a/Modules/regexmodule.c
+++ b/Modules/regexmodule.c
@@ -4,7 +4,7 @@
 */
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -35,6 +35,7 @@
 #include "modsupport.h"
 
 #include "regexpr.h"
+#include "ctype.h"
 
 static object *RegexError;	/* Exception */	
 
@@ -45,6 +46,9 @@
 	char re_fastmap[256];	/* Storage for fastmap */
 	object *re_translate;	/* String object for translate table */
 	object *re_lastok;	/* String object last matched/searched */
+	object *re_groupindex;	/* Group name to index dictionary */
+	object *re_givenpat;	/* Pattern with symbolic groups */
+	object *re_realpat;	/* Pattern without symbolic groups */
 } regexobject;
 
 /* Regex object methods */
@@ -55,8 +59,9 @@
 {
 	XDECREF(re->re_translate);
 	XDECREF(re->re_lastok);
-	XDEL(re->re_patbuf.buffer);
-	XDEL(re->re_patbuf.translate);
+	XDECREF(re->re_groupindex);
+	XDECREF(re->re_givenpat);
+	XDECREF(re->re_realpat);
 	DEL(re);
 }
 
@@ -188,8 +193,24 @@
 		}
 		return res;
 	}
-	if (!getargs(args, "i", &i))
-		return NULL;
+	if (!getargs(args, "i", &i)) {
+		object *n;
+		err_clear();
+		if (!getargs(args, "S", &n))
+			return NULL;
+		else {
+			object *index;
+			if (re->re_groupindex == NULL)
+				index = NULL;
+			else
+				index = mappinglookup(re->re_groupindex, n);
+			if (index == NULL) {
+				err_setstr(RegexError, "group() group name doesn't exist");
+				return NULL;
+			}
+			i = getintvalue(index);
+		}
+	}
 	if (i < 0 || i >= RE_NREGS) {
 		err_setstr(RegexError, "group() index out of range");
 		return NULL;
@@ -209,9 +230,9 @@
 }
 
 static struct methodlist reg_methods[] = {
-	{"match",	reg_match},
-	{"search",	reg_search},
-	{"group",	reg_group},
+	{"match",	(method)reg_match},
+	{"search",	(method)reg_search},
+	{"group",	(method)reg_group},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -243,12 +264,39 @@
 		INCREF(re->re_translate);
 		return re->re_translate;
 	}
+	if (strcmp(name, "groupindex") == 0) {
+		if (re->re_groupindex == NULL) {
+			INCREF(None);
+			return None;
+		}
+		INCREF(re->re_groupindex);
+		return re->re_groupindex;
+	}
+	if (strcmp(name, "realpat") == 0) {
+		if (re->re_realpat == NULL) {
+			INCREF(None);
+			return None;
+		}
+		INCREF(re->re_realpat);
+		return re->re_realpat;
+	}
+	if (strcmp(name, "givenpat") == 0) {
+		if (re->re_givenpat == NULL) {
+			INCREF(None);
+			return None;
+		}
+		INCREF(re->re_givenpat);
+		return re->re_givenpat;
+	}
 	if (strcmp(name, "__members__") == 0) {
-		object *list = newlistobject(3);
+		object *list = newlistobject(6);
 		if (list) {
 			setlistitem(list, 0, newstringobject("last"));
 			setlistitem(list, 1, newstringobject("regs"));
 			setlistitem(list, 2, newstringobject("translate"));
+			setlistitem(list, 3, newstringobject("groupindex"));
+			setlistitem(list, 4, newstringobject("realpat"));
+			setlistitem(list, 5, newstringobject("givenpat"));
 			if (err_occurred()) {
 				DECREF(list);
 				list = NULL;
@@ -266,21 +314,25 @@
 	sizeof(regexobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	reg_dealloc,		/*tp_dealloc*/
+	(destructor)reg_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	reg_getattr,		/*tp_getattr*/
+	(getattrfunc)reg_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 };
 
 static object *
-newregexobject(pat, size, translate)
-	char *pat;
-	int size;
+newregexobject(pattern, translate, givenpat, groupindex)
+	object *pattern;
 	object *translate;
+	object *givenpat;
+	object *groupindex;
 {
 	regexobject *re;
+	char *pat = getstringvalue(pattern);
+	int size = getstringsize(pattern);
+
 	if (translate != NULL && getstringsize(translate) != 256) {
 		err_setstr(RegexError,
 			   "translation table must be 256 bytes");
@@ -299,6 +351,11 @@
 		XINCREF(translate);
 		re->re_translate = translate;
 		re->re_lastok = NULL;
+		re->re_groupindex = groupindex;
+		INCREF(pattern);
+		re->re_realpat = pattern;
+		INCREF(givenpat);
+		re->re_givenpat = givenpat;
 		error = re_compile_pattern(pat, size, &re->re_patbuf);
 		if (error != NULL) {
 			err_setstr(RegexError, error);
@@ -314,17 +371,131 @@
 	object *self;
 	object *args;
 {
-	char *pat;
-	int size;
+	object *pat = NULL;
 	object *tran = NULL;
-	if (!getargs(args, "s#", &pat, &size)) {
+	if (!getargs(args, "S", &pat)) {
 		err_clear();
-		if (!getargs(args, "(s#S)", &pat, &size, &tran))
+		if (!getargs(args, "(SS)", &pat, &tran))
 			return NULL;
 	}
-	return newregexobject(pat, size, tran);
+	return newregexobject(pat, tran, pat, NULL);
 }
 
+static object *
+symcomp(pattern, gdict)
+	object *pattern;
+	object *gdict;
+{
+	char *opat = getstringvalue(pattern);
+	char *oend = opat + getstringsize(pattern);
+	int group_count = 0;
+	int escaped = 0;
+	char *o = opat;
+	char *n;
+	char name_buf[128];
+	char *g;
+	object *npattern;
+	int require_escape = re_syntax & RE_NO_BK_PARENS ? 0 : 1;
+
+	npattern = newsizedstringobject((char*)NULL, getstringsize(pattern));
+	if (npattern == NULL)
+		return NULL;
+	n = getstringvalue(npattern);
+
+	while (o < oend) {
+		if (*o == '(' && escaped == require_escape) {
+			char *backtrack;
+			escaped = 0;
+			++group_count;
+			*n++ = *o;
+			if (++o >= oend || *o != '<')
+				continue;
+			/* *o == '<' */
+			if (o+1 < oend && *(o+1) == '>')
+				continue;
+			backtrack = o;
+			g = name_buf;
+			for (++o; o < oend;) {
+				if (*o == '>') {
+					object *group_name = NULL;
+					object *group_index = NULL;
+					*g++ = '\0';
+					group_name = newstringobject(name_buf);
+					group_index = newintobject(group_count);
+					if (group_name == NULL || group_index == NULL
+					    || mappinginsert(gdict, group_name, group_index) != 0) {
+						XDECREF(group_name);
+						XDECREF(group_index);
+						XDECREF(npattern);
+						return NULL;
+					}
+					++o; /* eat the '>' */
+					break;
+				}
+				if (!isalnum(*o) && *o != '_') {
+					o = backtrack;
+					break;
+				}
+				*g++ = *o++;
+			}
+		}
+		if (*o == '[' && !escaped) {
+			*n++ = *o;
+			++o;	/* eat the char following '[' */
+			*n++ = *o;
+			while (o < oend && *o != ']') {
+				++o;
+				*n++ = *o;
+			}
+			if (o < oend)
+				++o;
+		}
+		else if (*o == '\\') {
+			escaped = 1;
+			*n++ = *o;
+			++o;
+		}
+		else {
+			escaped = 0;
+			*n++ = *o;
+			++o;
+		}
+	}
+
+	if (resizestring(&npattern, n - getstringvalue(npattern)) == 0)
+		return npattern;
+	else {
+		DECREF(npattern);
+		return NULL;
+	}
+
+}
+
+static object *
+regex_symcomp(self, args)
+	object *self;
+	object *args;
+{
+	object *pattern;
+	object *tran = NULL;
+	object *gdict = NULL;
+	object *npattern;
+	if (!getargs(args, "S", &pattern)) {
+		err_clear();
+		if (!getargs(args, "(SS)", &pattern, &tran))
+			return NULL;
+	}
+	gdict = newmappingobject();
+	if (gdict == NULL
+	    || (npattern = symcomp(pattern, gdict)) == NULL) {
+		DECREF(gdict);
+		DECREF(pattern);
+		return NULL;
+	}
+	return newregexobject(npattern, tran, pattern, gdict);
+}
+
+
 static object *cache_pat;
 static object *cache_prog;
 
@@ -384,6 +555,7 @@
 
 static struct methodlist regex_global_methods[] = {
 	{"compile",	regex_compile},
+	{"symcomp",	regex_symcomp},
 	{"match",	regex_match},
 	{"search",	regex_search},
 	{"set_syntax",	regex_set_syntax},
diff --git a/Modules/regexpr.c b/Modules/regexpr.c
index d5c0c85..f877558 100644
--- a/Modules/regexpr.c
+++ b/Modules/regexpr.c
@@ -22,11 +22,9 @@
 Emacs-specific code and syntax table code is almost directly borrowed
 from GNU regexp.
 
-$Header$
-
 */
 
-#include "PROTO.h" /* For PROTO macro --Guido */
+#include "myproto.h" /* For PROTO macro --Guido */
 
 #include <stdio.h>
 #include <assert.h>
@@ -116,6 +114,7 @@
 
 static int re_compile_initialized = 0;
 static int regexp_syntax = 0;
+int re_syntax = 0; /* Exported copy of regexp_syntax */
 static unsigned char regexp_plain_ops[256];
 static unsigned char regexp_quoted_ops[256];
 static unsigned char regexp_precedences[Rnum_ops];
@@ -256,6 +255,7 @@
 
   ret = regexp_syntax;
   regexp_syntax = syntax;
+  re_syntax = syntax; /* Exported copy */
   re_compile_initialize();
   return ret;
 }
@@ -644,7 +644,7 @@
 		  }
 		if (range)
 		  {
-		    for (a = prev; a <= ch; a++)
+		    for (a = prev; a <= (int)ch; a++)
 		      SETBIT(pattern, offset, a);
 		    prev = -1;
 		    range = 0;
diff --git a/Modules/regexpr.h b/Modules/regexpr.h
index 7e82abd..034da3c 100644
--- a/Modules/regexpr.h
+++ b/Modules/regexpr.h
@@ -25,11 +25,6 @@
 #ifndef REGEXPR_H
 #define REGEXPR_H
 
-#if defined(__STDC__) || defined(THINK_C)
-#undef HAVE_PROTOTYPES
-#define HAVE_PROTOTYPES
-#endif
-
 #define RE_NREGS	100  /* number of registers available */
 
 typedef struct re_pattern_buffer
@@ -69,6 +64,10 @@
 
 #ifdef HAVE_PROTOTYPES
 
+extern int re_syntax;
+/* This is the actual syntax mask.  It was added so that Python
+   could do syntax-dependent munging of patterns before compilation. */
+
 int re_set_syntax(int syntax);
 /* This sets the syntax to use and returns the previous syntax.  The
    syntax is specified by a bit mask of the above defined bits. */
@@ -129,6 +128,7 @@
 
 #else /* HAVE_PROTOTYPES */
 
+extern int re_syntax;
 int re_set_syntax();
 char *re_compile_pattern();
 int re_match();
diff --git a/Modules/rgbimgmodule.c b/Modules/rgbimgmodule.c
index 4421f5d..de888eb 100644
--- a/Modules/rgbimgmodule.c
+++ b/Modules/rgbimgmodule.c
@@ -16,7 +16,9 @@
  */
 #include "allobjects.h"
 #include "modsupport.h"
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
+#endif
 #include <string.h>
 
 /*
@@ -199,7 +201,7 @@
 
 static int writetab(outf,tab,len)
 FILE *outf;
-unsigned long *tab;
+/*unsigned*/ long *tab;
 int len;
 {
     int r;
@@ -213,7 +215,7 @@
 
 static readtab(inf,tab,len)
 FILE *inf;
-unsigned long *tab;
+/*unsigned*/ long *tab;
 int len;
 {
     while(len) {
@@ -744,7 +746,7 @@
     object *m, *d;
     m = initmodule("rgbimg", rgbimg_methods);
     d = getmoduledict(m);
-    ImgfileError = newstringobject("rgbimg,error");
+    ImgfileError = newstringobject("rgbimg.error");
     if (ImgfileError == NULL || dictinsert(d, "error", ImgfileError))
 	fatal("can't define rgbimg.error");
 }
diff --git a/Modules/rotormodule.c b/Modules/rotormodule.c
index d397e2c..a6d043f 100644
--- a/Modules/rotormodule.c
+++ b/Modules/rotormodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -89,7 +89,7 @@
 	unsigned char *advances; /* [num_rotors] */
 } rotorobject;
 
-extern typeobject Rotortype;	/* Really static, forward */
+staticforward typeobject Rotortype;
 
 #define is_rotorobject(v)		((v)->ob_type == &Rotortype)
 
@@ -486,7 +486,7 @@
 		}
 	} else {
 		while (i < r->rotors) {
-			tp = r->e_rotor[(i*r->size)+(((r->positions[i] ^ tp) % r->size))];
+			tp = r->e_rotor[(i*r->size)+(((r->positions[i] ^ tp) % (unsigned int) r->size))];
 			i++;
 		}
 	}
@@ -525,7 +525,7 @@
 		}
 	} else {
 		while (0 <= i) {
-			tc = (r->positions[i] ^ r->d_rotor[(i*r->size)+tc]) % r->size;
+			tc = (r->positions[i] ^ r->d_rotor[(i*r->size)+tc]) % (unsigned int) r->size;
 			i--;
 		}
 	}
@@ -656,7 +656,7 @@
 	}
 	memset(tmp,'\0',len+1);
 	memcpy(tmp,string,len);
-	RTR_e_region(self,tmp,len, TRUE);
+	RTR_e_region(self,(unsigned char *)tmp,len, TRUE);
 	rtn = newsizedstringobject(tmp,len);
 	free(tmp);
 	return(rtn);
@@ -680,7 +680,7 @@
 	}
 	memset(tmp,'\0',len+1);
 	memcpy(tmp,string,len);
-	RTR_e_region(self,tmp,len, FALSE);
+	RTR_e_region(self,(unsigned char *)tmp,len, FALSE);
 	rtn = newsizedstringobject(tmp,len);
 	free(tmp);
 	return(rtn);
@@ -704,7 +704,7 @@
 	}
 	memset(tmp,'\0',len+1);
 	memcpy(tmp,string,len);
-	RTR_d_region(self,tmp,len, TRUE);
+	RTR_d_region(self,(unsigned char *)tmp,len, TRUE);
 	rtn = newsizedstringobject(tmp,len);
 	free(tmp);
 	return(rtn);
@@ -728,7 +728,7 @@
 	}
 	memset(tmp,'\0',len+1);
 	memcpy(tmp,string,len);
-	RTR_d_region(self,tmp,len, FALSE);
+	RTR_d_region(self,(unsigned char *)tmp,len, FALSE);
 	rtn = newsizedstringobject(tmp,len);
 	free(tmp);
 	return(rtn);
@@ -749,11 +749,11 @@
 }
 
 static struct methodlist rotor_methods[] = {
-	{"encrypt",	rotor_encrypt},
-	{"encryptmore",	rotor_encryptmore},
-	{"decrypt",	rotor_decrypt},
-	{"decryptmore",	rotor_decryptmore},
-	{"setkey",	rotor_setkey},
+	{"encrypt",	(method)rotor_encrypt},
+	{"encryptmore",	(method)rotor_encryptmore},
+	{"decrypt",	(method)rotor_decrypt},
+	{"decryptmore",	(method)rotor_decryptmore},
+	{"setkey",	(method)rotor_setkey},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -769,17 +769,17 @@
 
 static typeobject Rotortype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
+	0,				/*ob_size*/
 	"rotor",			/*tp_name*/
-	sizeof(rotorobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	sizeof(rotorobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	rotor_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	rotor_getattr,		/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
+	(destructor)rotor_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)rotor_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 
 
diff --git a/Modules/selectmodule.c b/Modules/selectmodule.c
index 2cae7f4..ef3ec23 100644
--- a/Modules/selectmodule.c
+++ b/Modules/selectmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,7 +28,8 @@
 #include "modsupport.h"
 #include "ceval.h"
 
-#include "myselect.h"
+#include <sys/types.h>
+#include "myselect.h" /* Also includes mytime.h */
 
 static object *SelectError;
 
@@ -63,12 +64,13 @@
 	    err_badarg();
 	    return -1;
 	}
-	if ( v >= FD_SETSIZE ) {
-	    err_setstr(SystemError, "FD_SETSIZE too low in select()");
+	if ( v < 0 || v >= FD_SETSIZE ) {
+	    err_setstr(ValueError, "filedescriptor out of range in select()");
 	    return -1;
 	}
 	if ( v > max ) max = v;
 	FD_SET(v, set);
+	XDECREF(fd2obj[v]);
 	fd2obj[v] = o;
     }
     return max+1;
@@ -91,11 +93,12 @@
     for(i=0; i<max; i++)
       if ( FD_ISSET(i,set) ) {
 	  if ( i > FD_SETSIZE ) {
-	      err_setstr(SystemError, "FD_SETSIZE too low in select()");
+	      err_setstr(SystemError,
+			 "filedescriptor out of range returned in select()");
 	      return NULL;
 	  }
 	  o = fd2obj[i];
-	  if ( o == 0 ) {
+	  if ( o == NULL ) {
 	      err_setstr(SystemError,
 			 "Bad filedescriptor returned from select()");
 	      return NULL;
diff --git a/Modules/sgimodule.c b/Modules/sgimodule.c
index 418609d..92a8acd 100644
--- a/Modules/sgimodule.c
+++ b/Modules/sgimodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Modules/signalmodule.c b/Modules/signalmodule.c
index 211ebe7..640505b 100644
--- a/Modules/signalmodule.c
+++ b/Modules/signalmodule.c
@@ -107,6 +107,19 @@
  
 
 static object *
+signal_alarm(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	int t;
+	if (!getargs(args, "i", &t))
+		return NULL;
+	alarm(t);
+	INCREF(None);
+	return None;
+}
+
+static object *
 signal_signal(self, args)
 	object *self; /* Not used */
 	object *args;
@@ -173,6 +186,7 @@
 /* List of functions defined in the module */
 
 static struct methodlist signal_methods[] = {
+	{"alarm",	signal_alarm},
         {"signal",	signal_signal},
         {"getsignal",	signal_getsignal},
 	{NULL,		NULL}		/* sentinel */
diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c
index 3fc8755..32f22db 100644
--- a/Modules/socketmodule.c
+++ b/Modules/socketmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -30,7 +30,7 @@
 Limitations:
 
 - only AF_INET and AF_UNIX address families are supported
-- no asynchronous I/O (but read polling: avail)
+- no asynchronous I/O (but you can use select() on sockets)
 - no read/write operations (use send/recv or makefile instead)
 - setsockopt() and getsockopt() only support integer options
 
@@ -51,7 +51,6 @@
 Socket methods:
 
 - s.accept() --> new socket object, sockaddr
-- s.avail() --> boolean
 - s.setsockopt(level, optname, flag) --> None
 - s.getsockopt(level, optname) --> flag
 - s.bind(sockaddr) --> None
@@ -62,8 +61,8 @@
 - s.makefile(mode) --> file object
 - s.recv(nbytes [,flags]) --> string
 - s.recvfrom(nbytes [,flags]) --> string, sockaddr
-- s.send(string [,flags]) --> None
-- s.sendto(string, [flags,] sockaddr) --> None
+- s.send(string [,flags]) --> nbytes
+- s.sendto(string, [flags,] sockaddr) --> nbytes
 - s.shutdown(how) --> None
 - s.close() --> None
 
@@ -73,17 +72,17 @@
 #include "modsupport.h"
 #include "ceval.h"
 
-#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
+#include <sys/types.h>
+#include "mytime.h"
 
 #include <signal.h>
+#include <netdb.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#ifdef HAVE_SYS_UN_H
 #include <sys/un.h>
-#include <netdb.h>
-
-#ifdef i860
-/* Cray APP doesn't have getpeername() */
-#define NO_GETPEERNAME
+#else
+#undef AF_UNIX
 #endif
 
 
@@ -121,7 +120,7 @@
    some of which call newsocobject(), which uses Socktype, so
    there has to be a circular reference. */
 
-extern typeobject Socktype; /* Forward */
+staticforward typeobject Socktype;
 
 
 /* Create a new socket object.
@@ -233,11 +232,13 @@
 		return ret;
 	}
 
+#ifdef AF_UNIX
 	case AF_UNIX:
 	{
 		struct sockaddr_un *a = (struct sockaddr_un *) addr;
 		return newstringobject(a->sun_path);
 	}
+#endif /* AF_UNIX */
 
 	/* More cases here... */
 
@@ -263,6 +264,7 @@
 {
 	switch (s->sock_family) {
 
+#ifdef AF_UNIX
 	case AF_UNIX:
 	{
 		static struct sockaddr_un addr;
@@ -280,6 +282,7 @@
 		*len_ret = len + sizeof addr.sun_family;
 		return 1;
 	}
+#endif /* AF_UNIX */
 
 	case AF_INET:
 	{
@@ -318,11 +321,13 @@
 {
 	switch (s->sock_family) {
 
+#ifdef AF_UNIX
 	case AF_UNIX:
 	{
 		*len_ret = sizeof (struct sockaddr_un);
 		return 1;
 	}
+#endif /* AF_UNIX */
 
 	case AF_INET:
 	{
@@ -477,29 +482,6 @@
 }
 
 
-/* s.avail() method */
-
-static object *
-sock_avail(s, args)
-	sockobject *s;
-	object *args;
-{
-	struct timeval timeout;
-	fd_set readers;
-	int n;
-	if (!getnoarg(args))
-		return NULL;
-	timeout.tv_sec = 0;
-	timeout.tv_usec = 0;
-	FD_ZERO(&readers);
-	FD_SET(s->sock_fd, &readers);
-	n = select(s->sock_fd+1, &readers, (fd_set *)0, (fd_set *)0, &timeout);
-	if (n < 0)
-		return socket_error();
-	return newintobject((long) (n != 0));
-}
-
-
 /* s.bind(sockaddr) method */
 
 static object *
@@ -599,7 +581,7 @@
 }
 
 
-#ifndef NO_GETPEERNAME
+#ifdef HAVE_GETPEERNAME		/* Cray APP doesn't have this :-( */
 /* s.getpeername() method */
 
 static object *
@@ -620,7 +602,7 @@
 		return socket_error();
 	return makesockaddr((struct sockaddr *) addrbuf, addrlen);
 }
-#endif
+#endif /* HAVE_GETPEERNAME */
 
 
 /* s.listen(n) method */
@@ -635,6 +617,8 @@
 	if (!getintarg(args, &backlog))
 		return NULL;
 	BGN_SAVE
+	if (backlog < 1)
+		backlog = 1;
 	res = listen(s->sock_fd, backlog);
 	END_SAVE
 	if (res < 0)
@@ -755,8 +739,7 @@
 	END_SAVE
 	if (n < 0)
 		return socket_error();
-	INCREF(None);
-	return None;
+	return newintobject((long)n);
 }
 
 
@@ -784,8 +767,7 @@
 	END_SAVE
 	if (n < 0)
 		return socket_error();
-	INCREF(None);
-	return None;
+	return newintobject((long)n);
 }
 
 
@@ -813,27 +795,26 @@
 /* List of methods for socket objects */
 
 static struct methodlist sock_methods[] = {
-	{"accept",	sock_accept},
-	{"avail",	sock_avail},
-	{"allowbroadcast",	sock_allowbroadcast},
-	{"setsockopt",	sock_setsockopt},
-	{"getsockopt",	sock_getsockopt},
-	{"bind",	sock_bind},
-	{"close",	sock_close},
-	{"connect",	sock_connect},
-	{"fileno",	sock_fileno},
-	{"getsockname",	sock_getsockname},
-#ifndef NO_GETPEERNAME
-	{"getpeername",	sock_getpeername},
+	{"accept",		(method)sock_accept},
+	{"allowbroadcast",	(method)sock_allowbroadcast},
+	{"setsockopt",		(method)sock_setsockopt},
+	{"getsockopt",		(method)sock_getsockopt},
+	{"bind",		(method)sock_bind},
+	{"close",		(method)sock_close},
+	{"connect",		(method)sock_connect},
+	{"fileno",		(method)sock_fileno},
+	{"getsockname",		(method)sock_getsockname},
+#ifdef HAVE_GETPEERNAME
+	{"getpeername",		(method)sock_getpeername},
 #endif
-	{"listen",	sock_listen},
-	{"makefile",	sock_makefile},
-	{"recv",	sock_recv},
-	{"recvfrom",	sock_recvfrom},
-	{"send",	sock_send},
-	{"sendto",	sock_sendto},
-	{"shutdown",	sock_shutdown},
-	{NULL,		NULL}		/* sentinel */
+	{"listen",		(method)sock_listen},
+	{"makefile",		(method)sock_makefile},
+	{"recv",		(method)sock_recv},
+	{"recvfrom",		(method)sock_recvfrom},
+	{"send",		(method)sock_send},
+	{"sendto",		(method)sock_sendto},
+	{"shutdown",		(method)sock_shutdown},
+	{NULL,			NULL}		/* sentinel */
 };
 
 
@@ -860,19 +841,17 @@
 }
 
 
-/* Type object for socket objects.
-   XXX This should be static, but some compilers don't grok the
-   XXX forward reference to it in that case... */
+/* Type object for socket objects. */
 
-typeobject Socktype = {
+static typeobject Socktype = {
 	OB_HEAD_INIT(&Typetype)
 	0,
 	"socket",
 	sizeof(sockobject),
 	0,
-	sock_dealloc,	/*tp_dealloc*/
+	(destructor)sock_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
-	sock_getattr,	/*tp_getattr*/
+	(getattrfunc)sock_getattr, /*tp_getattr*/
 	0,		/*tp_setattr*/
 	0,		/*tp_compare*/
 	0,		/*tp_repr*/
@@ -1061,7 +1040,9 @@
 	if (SocketError == NULL || dictinsert(d, "error", SocketError) != 0)
 		fatal("can't define socket.error");
 	insint(d, "AF_INET", AF_INET);
+#ifdef AF_UNIX
 	insint(d, "AF_UNIX", AF_UNIX);
+#endif /* AF_UNIX */
 	insint(d, "SOCK_STREAM", SOCK_STREAM);
 	insint(d, "SOCK_DGRAM", SOCK_DGRAM);
 	insint(d, "SOCK_RAW", SOCK_RAW);
diff --git a/Modules/stdwinmodule.c b/Modules/stdwinmodule.c
index fc81cff..2342527 100644
--- a/Modules/stdwinmodule.c
+++ b/Modules/stdwinmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -75,7 +75,7 @@
 #define HAVE_BITMAPS
 #endif /* !macintosh */
 
-#ifdef USE_THREAD
+#ifdef WITH_THREAD
 
 #include "thread.h"
 
@@ -113,7 +113,7 @@
 	object	*w_attr;	/* Attributes dictionary */
 } windowobject;
 
-extern typeobject Windowtype;	/* Really static, forward */
+staticforward typeobject Windowtype;
 
 #define is_windowobject(wp) ((wp)->ob_type == &Windowtype)
 
@@ -124,7 +124,7 @@
 	object	*m_attr;	/* Attributes dictionary */
 } menuobject;
 
-extern typeobject Menutype;	/* Really static, forward */
+staticforward typeobject Menutype;
 
 #define is_menuobject(mp) ((mp)->ob_type == &Menutype)
 
@@ -134,7 +134,7 @@
 	object	*b_attr;	/* Attributes dictionary */
 } bitmapobject;
 
-extern typeobject Bitmaptype;	/* Really static, forward */
+staticforward typeobject Bitmaptype;
 
 #define is_bitmapobject(mp) ((mp)->ob_type == &Bitmaptype)
 
@@ -730,44 +730,44 @@
 
 static struct methodlist drawing_methods[] = {
 #ifdef HAVE_BITMAPS
-	{"bitmap",	drawing_bitmap},
+	{"bitmap",	(method)drawing_bitmap},
 #endif
-	{"box",		drawing_box},
-	{"circle",	drawing_circle},
-	{"cliprect",	drawing_cliprect},
-	{"close",	drawing_close},
-	{"elarc",	drawing_elarc},
-	{"enddrawing",	drawing_close},
-	{"erase",	drawing_erase},
-	{"fillcircle",	drawing_fillcircle},
-	{"fillelarc",	drawing_fillelarc},
-	{"fillpoly",	drawing_fillpoly},
-	{"invert",	drawing_invert},
-	{"line",	drawing_line},
-	{"noclip",	drawing_noclip},
-	{"paint",	drawing_paint},
-	{"poly",	drawing_poly},
-	{"shade",	drawing_shade},
-	{"text",	drawing_text},
-	{"xorcircle",	drawing_xorcircle},
-	{"xorelarc",	drawing_xorelarc},
-	{"xorline",	drawing_xorline},
-	{"xorpoly",	drawing_xorpoly},
+	{"box",		(method)drawing_box},
+	{"circle",	(method)drawing_circle},
+	{"cliprect",	(method)drawing_cliprect},
+	{"close",	(method)drawing_close},
+	{"elarc",	(method)drawing_elarc},
+	{"enddrawing",	(method)drawing_close},
+	{"erase",	(method)drawing_erase},
+	{"fillcircle",	(method)drawing_fillcircle},
+	{"fillelarc",	(method)drawing_fillelarc},
+	{"fillpoly",	(method)drawing_fillpoly},
+	{"invert",	(method)drawing_invert},
+	{"line",	(method)drawing_line},
+	{"noclip",	(method)drawing_noclip},
+	{"paint",	(method)drawing_paint},
+	{"poly",	(method)drawing_poly},
+	{"shade",	(method)drawing_shade},
+	{"text",	(method)drawing_text},
+	{"xorcircle",	(method)drawing_xorcircle},
+	{"xorelarc",	(method)drawing_xorelarc},
+	{"xorline",	(method)drawing_xorline},
+	{"xorpoly",	(method)drawing_xorpoly},
 	
 	/* Text measuring methods: */
-	{"baseline",	drawing_baseline},
-	{"lineheight",	drawing_lineheight},
-	{"textbreak",	drawing_textbreak},
-	{"textwidth",	drawing_textwidth},
+	{"baseline",	(method)drawing_baseline},
+	{"lineheight",	(method)drawing_lineheight},
+	{"textbreak",	(method)drawing_textbreak},
+	{"textwidth",	(method)drawing_textwidth},
 
 	/* Font setting methods: */
-	{"setfont",	drawing_setfont},
+	{"setfont",	(method)drawing_setfont},
 	
 	/* Color methods: */
-	{"getbgcolor",	drawing_getbgcolor},
-	{"getfgcolor",	drawing_getfgcolor},
-	{"setbgcolor",	drawing_setbgcolor},
-	{"setfgcolor",	drawing_setfgcolor},
+	{"getbgcolor",	(method)drawing_getbgcolor},
+	{"getfgcolor",	(method)drawing_getfgcolor},
+	{"setbgcolor",	(method)drawing_setbgcolor},
+	{"setfgcolor",	(method)drawing_setfgcolor},
 
 	{NULL,		NULL}		/* sentinel */
 };
@@ -791,9 +791,9 @@
 	sizeof(drawingobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	drawing_dealloc,	/*tp_dealloc*/
+	(destructor)drawing_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	drawing_getattr,	/*tp_getattr*/
+	(getattrfunc)drawing_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -809,7 +809,7 @@
 	object		*t_attr;	/* Attributes dictionary */
 } textobject;
 
-extern typeobject Texttype;	/* Really static, forward */
+staticforward typeobject Texttype;
 
 static textobject *
 newtextobject(wp, left, top, right, bottom)
@@ -1073,20 +1073,20 @@
 }
 
 static struct methodlist text_methods[] = {
-	{"arrow",	text_arrow},
-	{"close",	text_close},
-	{"draw",	text_draw},
-	{"event",	text_event},
-	{"getfocus",	text_getfocus},
-	{"getfocustext",text_getfocustext},
-	{"getrect",	text_getrect},
-	{"gettext",	text_gettext},
-	{"move",	text_move},
-	{"replace",	text_replace},
-	{"setactive",	text_setactive},
-	{"setfocus",	text_setfocus},
-	{"settext",	text_settext},
-	{"setview",	text_setview},
+	{"arrow",	(method)text_arrow},
+	{"close",	(method)text_close},
+	{"draw",	(method)text_draw},
+	{"event",	(method)text_event},
+	{"getfocus",	(method)text_getfocus},
+	{"getfocustext",(method)text_getfocustext},
+	{"getrect",	(method)text_getrect},
+	{"gettext",	(method)text_gettext},
+	{"move",	(method)text_move},
+	{"replace",	(method)text_replace},
+	{"setactive",	(method)text_setactive},
+	{"setfocus",	(method)text_setfocus},
+	{"settext",	(method)text_settext},
+	{"setview",	(method)text_setview},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -1137,17 +1137,17 @@
 		return dictinsert(tp->t_attr, name, v);
 }
 
-typeobject Texttype = {
+static typeobject Texttype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"textedit",		/*tp_name*/
 	sizeof(textobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	text_dealloc,		/*tp_dealloc*/
+	(destructor)text_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	text_getattr,		/*tp_getattr*/
-	text_setattr,		/*tp_setattr*/
+	(getattrfunc)text_getattr, /*tp_getattr*/
+	(setattrfunc)text_setattr, /*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 };
@@ -1289,11 +1289,11 @@
 }
 
 static struct methodlist menu_methods[] = {
-	{"additem",	menu_additem},
-	{"setitem",	menu_setitem},
-	{"enable",	menu_enable},
-	{"check",	menu_check},
-	{"close",	menu_close},
+	{"additem",	(method)menu_additem},
+	{"setitem",	(method)menu_setitem},
+	{"enable",	(method)menu_enable},
+	{"check",	(method)menu_check},
+	{"close",	(method)menu_close},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -1344,17 +1344,17 @@
 		return dictinsert(mp->m_attr, name, v);
 }
 
-typeobject Menutype = {
+static typeobject Menutype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"menu",			/*tp_name*/
 	sizeof(menuobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	menu_dealloc,		/*tp_dealloc*/
+	(destructor)menu_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	menu_getattr,		/*tp_getattr*/
-	menu_setattr,		/*tp_setattr*/
+	(getattrfunc)menu_getattr, /*tp_getattr*/
+	(setattrfunc)menu_setattr, /*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 };
@@ -1447,10 +1447,10 @@
 }
 
 static struct methodlist bitmap_methods[] = {
-	{"close",	bitmap_close},
-	{"getsize",	bitmap_getsize},
-	{"getbit",	bitmap_getbit},
-	{"setbit",	bitmap_setbit},
+	{"close",	(method)bitmap_close},
+	{"getsize",	(method)bitmap_getsize},
+	{"getbit",	(method)bitmap_getbit},
+	{"setbit",	(method)bitmap_setbit},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -1501,17 +1501,17 @@
 		return dictinsert(bp->b_attr, name, v);
 }
 
-typeobject Bitmaptype = {
+static typeobject Bitmaptype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"bitmap",			/*tp_name*/
 	sizeof(bitmapobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	bitmap_dealloc,		/*tp_dealloc*/
+	(destructor)bitmap_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	bitmap_getattr,		/*tp_getattr*/
-	bitmap_setattr,		/*tp_setattr*/
+	(getattrfunc)bitmap_getattr, /*tp_getattr*/
+	(setattrfunc)bitmap_setattr, /*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 };
@@ -1852,29 +1852,29 @@
 #endif
 
 static struct methodlist window_methods[] = {
-	{"begindrawing",window_begindrawing},
-	{"change",	window_change},
-	{"close",	window_close},
-	{"getdocsize",	window_getdocsize},
-	{"getorigin",	window_getorigin},
-	{"gettitle",	window_gettitle},
-	{"getwinpos",	window_getwinpos},
-	{"getwinsize",	window_getwinsize},
-	{"menucreate",	window_menucreate},
-	{"scroll",	window_scroll},
-	{"setactive",	window_setactive},
-	{"setdocsize",	window_setdocsize},
-	{"setorigin",	window_setorigin},
-	{"setselection",window_setselection},
-	{"settimer",	window_settimer},
-	{"settitle",	window_settitle},
-	{"setwincursor",window_setwincursor},
-	{"setwinpos",	window_setwinpos},
-	{"setwinsize",	window_setwinsize},
-	{"show",	window_show},
-	{"textcreate",	window_textcreate},
+	{"begindrawing",(method)window_begindrawing},
+	{"change",	(method)window_change},
+	{"close",	(method)window_close},
+	{"getdocsize",	(method)window_getdocsize},
+	{"getorigin",	(method)window_getorigin},
+	{"gettitle",	(method)window_gettitle},
+	{"getwinpos",	(method)window_getwinpos},
+	{"getwinsize",	(method)window_getwinsize},
+	{"menucreate",	(method)window_menucreate},
+	{"scroll",	(method)window_scroll},
+	{"setactive",	(method)window_setactive},
+	{"setdocsize",	(method)window_setdocsize},
+	{"setorigin",	(method)window_setorigin},
+	{"setselection",(method)window_setselection},
+	{"settimer",	(method)window_settimer},
+	{"settitle",	(method)window_settitle},
+	{"setwincursor",(method)window_setwincursor},
+	{"setwinpos",	(method)window_setwinpos},
+	{"setwinsize",	(method)window_setwinsize},
+	{"show",	(method)window_show},
+	{"textcreate",	(method)window_textcreate},
 #ifdef CWI_HACKS
-	{"getxwindowid",window_getxwindowid},
+	{"getxwindowid",(method)window_getxwindowid},
 #endif
 	{NULL,		NULL}		/* sentinel */
 };
@@ -1926,17 +1926,17 @@
 		return dictinsert(wp->w_attr, name, v);
 }
 
-typeobject Windowtype = {
+static typeobject Windowtype = {
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"window",		/*tp_name*/
 	sizeof(windowobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	window_dealloc,		/*tp_dealloc*/
+	(destructor)window_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	window_getattr,		/*tp_getattr*/
-	window_setattr,		/*tp_setattr*/
+	(getattrfunc)window_getattr, /*tp_getattr*/
+	(setattrfunc)window_setattr, /*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 };
@@ -2515,23 +2515,24 @@
 	{"setdefwinsize",	stdwin_setdefwinsize},
 	
 	/* Text measuring methods borrow code from drawing objects: */
-	{"baseline",		drawing_baseline},
-	{"lineheight",		drawing_lineheight},
-	{"textbreak",		drawing_textbreak},
-	{"textwidth",		drawing_textwidth},
+	{"baseline",		(method)drawing_baseline},
+	{"lineheight",		(method)drawing_lineheight},
+	{"textbreak",		(method)drawing_textbreak},
+	{"textwidth",		(method)drawing_textwidth},
 
 	/* Same for font setting methods: */
-	{"setfont",		drawing_setfont},
+	{"setfont",		(method)drawing_setfont},
 
 	/* Same for color setting/getting methods: */
-	{"getbgcolor",		drawing_getbgcolor},
-	{"getfgcolor",		drawing_getfgcolor},
-	{"setbgcolor",		drawing_setbgcolor},
-	{"setfgcolor",		drawing_setfgcolor},
+	{"getbgcolor",		(method)drawing_getbgcolor},
+	{"getfgcolor",		(method)drawing_getfgcolor},
+	{"setbgcolor",		(method)drawing_setbgcolor},
+	{"setfgcolor",		(method)drawing_setfgcolor},
 
 	{NULL,			NULL}		/* sentinel */
 };
 
+#ifndef macintosh
 static int
 checkstringlist(args, ps, pn)
 	object *args;
@@ -2592,6 +2593,7 @@
 	DECREF(newlist);
 	return 1;
 }
+#endif /* macintosh */
 
 void
 initstdwin()
@@ -2601,6 +2603,9 @@
 	char buf[1000];
 
 	if (!inited) {
+#ifdef macintosh
+		winit();
+#else
 		int argc = 0;
 		char **argv = NULL;
 		object *sys_argv = sysget("argv");
@@ -2625,6 +2630,7 @@
 			if (!putbackstringlist(sys_argv, argv, argc))
 				err_clear();
 		}
+#endif
 		inited = 1;
 	}
 	m = initmodule("stdwin", stdwin_methods);
@@ -2634,7 +2640,7 @@
 	StdwinError = newstringobject("stdwin.error");
 	if (StdwinError == NULL || dictinsert(d, "error", StdwinError) != 0)
 		fatal("can't define stdwin.error");
-#ifdef USE_THREAD
+#ifdef WITH_THREAD
 	StdwinLock = allocate_lock();
 	if (StdwinLock == NULL)
 		fatal("can't allocate stdwin lock");
diff --git a/Modules/stropmodule.c b/Modules/stropmodule.c
index fe67ca0..c980272 100644
--- a/Modules/stropmodule.c
+++ b/Modules/stropmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -31,6 +31,8 @@
 /* XXX This file assumes that the <ctype.h> is*() functions
    XXX are defined for all 8-bit characters! */
 
+#include <errno.h>
+
 
 static object *
 strop_split(self, args)
@@ -236,7 +238,7 @@
 	object *args;
 {
 	char *s, *sub;
-	int len, n, i;
+	int len, n, i, j;
 
 	if (getargs(args, "(s#s#i)", &s, &len, &sub, &n, &i)) {
 		if (i < 0)
@@ -250,16 +252,16 @@
 		err_clear();
 		if (!getargs(args, "(s#s#)", &s, &len, &sub, &n))
 			return NULL;
-		i = len;
+		i = 0;
 	}
 
 	if (n == 0)
 		return newintobject((long)i);
 
-	for (i -= n; i >= 0; --i)
-		if (s[i] == sub[0] &&
-		    (n == 1 || strncmp(&s[i+1], &sub[1], n-1) == 0))
-			return newintobject((long)i);
+	for (j = len-n; j >= i; --j)
+		if (s[j] == sub[0] &&
+		    (n == 1 || strncmp(&s[j+1], &sub[1], n-1) == 0))
+			return newintobject((long)j);
 
 	err_setstr(ValueError, "substring not found");
 	return NULL;
@@ -408,9 +410,108 @@
 }
 
 
+static object *
+strop_atoi(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	extern long mystrtol PROTO((const char *, char **, int));
+	extern unsigned long mystrtoul PROTO((const char *, char **, int));
+	char *s, *end;
+	int base = 10;
+	long x;
+
+	if (args != NULL && is_tupleobject(args)) {
+		if (!getargs(args, "(si)", &s, &base))
+			return NULL;
+		if (base != 0 && base < 2 || base > 36) {
+			err_setstr(ValueError, "invalid base for atoi()");
+			return NULL;
+		}
+	}
+	else if (!getargs(args, "s", &s))
+		return NULL;
+	errno = 0;
+	if (base == 0 && s[0] == '0')
+		x = (long) mystrtoul(s, &end, base);
+	else
+		x = mystrtol(s, &end, base);
+	if (*end != '\0') {
+		err_setstr(ValueError, "invalid literal for atoi()");
+		return NULL;
+	}
+	else if (errno != 0) {
+		err_setstr(OverflowError, "atoi() literal too large");
+		return NULL;
+	}
+	return newintobject(x);
+}
+
+
+static object *
+strop_atol(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	char *s, *end;
+	int base = 10;
+	object *x;
+
+	if (args != NULL && is_tupleobject(args)) {
+		if (!getargs(args, "(si)", &s, &base))
+			return NULL;
+		if (base != 0 && base < 2 || base > 36) {
+			err_setstr(ValueError, "invalid base for atol()");
+			return NULL;
+		}
+	}
+	else if (!getargs(args, "s", &s))
+		return NULL;
+	x = long_escan(s, &end, base);
+	if (x == NULL)
+		return NULL;
+	if (base == 0 && (*end == 'l' || *end == 'L'))
+		end++;
+	if (*end != '\0') {
+		err_setstr(ValueError, "invalid literal for atol()");
+		DECREF(x);
+		return NULL;
+	}
+	return x;
+}
+
+
+static object *
+strop_atof(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	extern double strtod PROTO((const char *, char **));
+	char *s, *end;
+	double x;
+
+	if (!getargs(args, "s", &s))
+		return NULL;
+	errno = 0;
+	x = strtod(s, &end);
+	if (*end != '\0') {
+		err_setstr(ValueError, "invalid literal for atof()");
+		return NULL;
+	}
+	else if (errno != 0) {
+		err_setstr(OverflowError, "atof() literal too large");
+		return NULL;
+	}
+	return newfloatobject(x);
+}
+
+
 /* List of functions defined in the module */
 
 static struct methodlist strop_methods[] = {
+	{"atof",	strop_atof},
+	{"atoi",	strop_atoi},
+	{"atol",	strop_atol},
 	{"index",	strop_index},
 	{"joinfields",	strop_joinfields},
 	{"lower",	strop_lower},
diff --git a/Modules/structmodule.c b/Modules/structmodule.c
index 03e8f18..7d8815e 100644
--- a/Modules/structmodule.c
+++ b/Modules/structmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Modules/sunaudiodev.c b/Modules/sunaudiodev.c
index 5bd7249..a2f3869 100644
--- a/Modules/sunaudiodev.c
+++ b/Modules/sunaudiodev.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,10 +28,14 @@
 #include "modsupport.h"
 #include "structmember.h"
 
+#ifdef HAVE_SYS_AUDIOIO_H
+#define SOLARIS
+#endif
+
 #include <stropts.h>
 #include <sys/ioctl.h>
 #ifdef SOLARIS
-#include <multimedia/libaudio.h>
+#include <sys/audioio.h>
 #else
 #include <sun/audioio.h>
 #endif
@@ -52,8 +56,8 @@
 	audio_info_t ai;
 } sadstatusobject;
 
-extern typeobject Sadtype;		/* Really static, forward */
-extern typeobject Sadstatustype;	/* Really static, forward */
+staticforward typeobject Sadtype;
+staticforward typeobject Sadstatustype;
 static sadstatusobject *sads_alloc();	/* Forward */
 
 static object *SunAudioError;
@@ -427,17 +431,17 @@
 
 static typeobject Sadtype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"sun_audio_device",	/*tp_name*/
-	sizeof(sadobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"sun_audio_device",		/*tp_name*/
+	sizeof(sadobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	sad_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	sad_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
+	(destructor)sad_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)sad_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 
 static typeobject Sadstatustype = {
@@ -447,12 +451,12 @@
 	sizeof(sadstatusobject),	/*tp_size*/
 	0,				/*tp_itemsize*/
 	/* methods */
-	sads_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	sads_getattr,	/*tp_getattr*/
-	sads_setattr,	/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
+	(destructor)sads_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)sads_getattr,	/*tp_getattr*/
+	(setattrfunc)sads_setattr,	/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 /* ------------------------------------------------------------------- */
 
diff --git a/Modules/svmodule.c b/Modules/svmodule.c
index d3fda30..dad2414 100644
--- a/Modules/svmodule.c
+++ b/Modules/svmodule.c
@@ -1,5 +1,5 @@
 /**********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -227,7 +227,7 @@
 #endif
 
 static object *
-writefile(self, args)
+svc_writefile(self, args)
 	captureobject *self;
 	object *args;
 {
@@ -276,19 +276,19 @@
 }
 
 static struct methodlist capture_methods[] = {
-	{"YUVtoRGB",		svc_YUVtoRGB},
-	{"RGB8toRGB32",		svc_RGB8toRGB32},
-	{"InterleaveFields",	svc_InterleaveFields},
-	{"UnlockCaptureData",	svc_UnlockCaptureData},
-	{"FindVisibleRegion",	svc_FindVisibleRegion},
-	{"GetFields",		svc_GetFields},
-	{"YUVtoYUV422DC",	svc_YUVtoYUV422DC},
-	{"YUVtoYUV422DC_quarter",svc_YUVtoYUV422DC_quarter},
-	{"YUVtoYUV422DC_sixteenth",svc_YUVtoYUV422DC_sixteenth},
+	{"YUVtoRGB",		(method)svc_YUVtoRGB},
+	{"RGB8toRGB32",		(method)svc_RGB8toRGB32},
+	{"InterleaveFields",	(method)svc_InterleaveFields},
+	{"UnlockCaptureData",	(method)svc_UnlockCaptureData},
+	{"FindVisibleRegion",	(method)svc_FindVisibleRegion},
+	{"GetFields",		(method)svc_GetFields},
+	{"YUVtoYUV422DC",	(method)svc_YUVtoYUV422DC},
+	{"YUVtoYUV422DC_quarter",(method)svc_YUVtoYUV422DC_quarter},
+	{"YUVtoYUV422DC_sixteenth",(method)svc_YUVtoYUV422DC_sixteenth},
 #ifdef USE_GL
-	{"lrectwrite",		svc_lrectwrite},
+	{"lrectwrite",		(method)svc_lrectwrite},
 #endif
-	{"writefile",		writefile},
+	{"writefile",		(method)svc_writefile},
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -316,17 +316,17 @@
 
 typeobject Capturetype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"capture",		/*tp_name*/
-	sizeof(captureobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"capture",			/*tp_name*/
+	sizeof(captureobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	capture_dealloc,	/*tp_dealloc*/
-	0,			/*tp_print*/
-	capture_getattr,	/*tp_getattr*/
-	0,			/*tp_setattr*/
-	0,			/*tp_compare*/
-	0,			/*tp_repr*/
+	(destructor)capture_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)capture_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 
 static object *
@@ -835,25 +835,25 @@
 }
 
 static struct methodlist svideo_methods[] = {
-	{"BindGLWindow",	sv_BindGLWindow},
-	{"EndContinuousCapture",sv_EndContinuousCapture},
-	{"IsVideoDisplayed",	sv_IsVideoDisplayed},
-	{"OutputOffset",	sv_OutputOffset},
-	{"PutFrame",		sv_PutFrame},
-	{"QuerySize",		sv_QuerySize},
-	{"SetSize",		sv_SetSize},
-	{"SetStdDefaults",	sv_SetStdDefaults},
-	{"UseExclusive",	sv_UseExclusive},
-	{"WindowOffset",	sv_WindowOffset},
-	{"InitContinuousCapture",sv_InitContinuousCapture},
-	{"CaptureBurst",	sv_CaptureBurst},
-	{"CaptureOneFrame",	sv_CaptureOneFrame},
-	{"GetCaptureData",	sv_GetCaptureData},
-	{"CloseVideo",		sv_CloseVideo},
-	{"LoadMap",		sv_LoadMap},
-	{"GetParam",		sv_GetParam},
-	{"GetParamRange",	sv_GetParamRange},
-	{"SetParam",		sv_SetParam},
+	{"BindGLWindow",	(method)sv_BindGLWindow},
+	{"EndContinuousCapture",(method)sv_EndContinuousCapture},
+	{"IsVideoDisplayed",	(method)sv_IsVideoDisplayed},
+	{"OutputOffset",	(method)sv_OutputOffset},
+	{"PutFrame",		(method)sv_PutFrame},
+	{"QuerySize",		(method)sv_QuerySize},
+	{"SetSize",		(method)sv_SetSize},
+	{"SetStdDefaults",	(method)sv_SetStdDefaults},
+	{"UseExclusive",	(method)sv_UseExclusive},
+	{"WindowOffset",	(method)sv_WindowOffset},
+	{"InitContinuousCapture",(method)sv_InitContinuousCapture},
+	{"CaptureBurst",	(method)sv_CaptureBurst},
+	{"CaptureOneFrame",	(method)sv_CaptureOneFrame},
+	{"GetCaptureData",	(method)sv_GetCaptureData},
+	{"CloseVideo",		(method)sv_CloseVideo},
+	{"LoadMap",		(method)sv_LoadMap},
+	{"GetParam",		(method)sv_GetParam},
+	{"GetParamRange",	(method)sv_GetParamRange},
+	{"SetParam",		(method)sv_SetParam},
 	{NULL,			NULL} 		/* sentinel */
 };
 
@@ -930,9 +930,9 @@
 	sizeof(svobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	svideo_dealloc,		/*tp_dealloc*/
+	(destructor)svideo_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	svideo_getattr,		/*tp_getattr*/
+	(getattrfunc)svideo_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
@@ -973,10 +973,10 @@
 }
 
 static struct methodlist sv_methods[] = {
-	{"InterleaveFields",	sv_InterleaveFields},
-	{"RGB8toRGB32",		sv_RGB8toRGB32},
-	{"YUVtoRGB",		sv_YUVtoRGB},
-	{"OpenVideo",		sv_OpenVideo},
+	{"InterleaveFields",	(method)sv_InterleaveFields},
+	{"RGB8toRGB32",		(method)sv_RGB8toRGB32},
+	{"YUVtoRGB",		(method)sv_YUVtoRGB},
+	{"OpenVideo",		(method)sv_OpenVideo},
 	{NULL,			NULL}	/* Sentinel */
 };
 
diff --git a/Modules/threadmodule.c b/Modules/threadmodule.c
index 40169a3..301f060 100644
--- a/Modules/threadmodule.c
+++ b/Modules/threadmodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -29,9 +29,14 @@
 #include "modsupport.h"
 #include "ceval.h"
 
+#ifndef WITH_THREAD
+Error!  The rest of Python is not compiled with thread support.
+Rerun configure, adding a --with-thread option.
+#endif
+
 #include "thread.h"
 
-int threads_started = 0;
+extern int threads_started;
 
 static object *ThreadError;
 
@@ -43,7 +48,7 @@
 	type_lock lock_lock;
 } lockobject;
 
-extern typeobject Locktype;	/* Really static, forward */
+staticforward typeobject Locktype;
 
 #define is_lockobject(v)		((v)->ob_type == &Locktype)
 
@@ -147,12 +152,12 @@
 }
 
 static struct methodlist lock_methods[] = {
-	{"acquire_lock",	lock_acquire_lock},
-	{"acquire",		lock_acquire_lock},
-	{"release_lock",	lock_release_lock},
-	{"release",		lock_release_lock},
-	{"locked_lock",		lock_locked_lock},
-	{"locked",		lock_locked_lock},
+	{"acquire_lock",	(method)lock_acquire_lock},
+	{"acquire",		(method)lock_acquire_lock},
+	{"release_lock",	(method)lock_release_lock},
+	{"release",		(method)lock_release_lock},
+	{"locked_lock",		(method)lock_locked_lock},
+	{"locked",		(method)lock_locked_lock},
 	{NULL,			NULL}		/* sentinel */
 };
 
@@ -166,17 +171,17 @@
 
 static typeobject Locktype = {
 	OB_HEAD_INIT(&Typetype)
-	0,			/*ob_size*/
-	"lock",			/*tp_name*/
-	sizeof(lockobject),	/*tp_size*/
-	0,			/*tp_itemsize*/
+	0,				/*ob_size*/
+	"lock",				/*tp_name*/
+	sizeof(lockobject),		/*tp_size*/
+	0,				/*tp_itemsize*/
 	/* methods */
-	lock_dealloc,	/*tp_dealloc*/
-	0,		/*tp_print*/
-	lock_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
-	0,		/*tp_compare*/
-	0,		/*tp_repr*/
+	(destructor)lock_dealloc,	/*tp_dealloc*/
+	0,				/*tp_print*/
+	(getattrfunc)lock_getattr,	/*tp_getattr*/
+	0,				/*tp_setattr*/
+	0,				/*tp_compare*/
+	0,				/*tp_repr*/
 };
 
 
@@ -238,6 +243,7 @@
 	for (;;) { } /* Should not be reached */
 }
 
+#ifndef NO_EXIT_PROG
 static object *
 thread_exit_prog(self, args)
 	object *self; /* Not used */
@@ -249,6 +255,7 @@
 	goaway(sts); /* Calls exit_prog(sts) or _exit_prog(sts) */
 	for (;;) { } /* Should not be reached */
 }
+#endif
 
 static object *
 thread_allocate_lock(self, args)
@@ -260,14 +267,33 @@
 	return (object *) newlockobject();
 }
 
+static object *
+thread_get_ident(self, args)
+	object *self; /* Not used */
+	object *args;
+{
+	long ident;
+	if (!getnoarg(args))
+		return NULL;
+	ident = get_thread_ident();
+	if (ident == -1) {
+		err_setstr(ThreadError, "no current thread ident");
+		return NULL;
+	}
+	return newintobject(ident);
+}
+
 static struct methodlist thread_methods[] = {
-	{"start_new_thread",	thread_start_new_thread},
-	{"start_new",		thread_start_new_thread},
-	{"allocate_lock",	thread_allocate_lock},
-	{"allocate",		thread_allocate_lock},
-	{"exit_thread",		thread_exit_thread},
-	{"exit",		thread_exit_thread},
-	{"exit_prog",		thread_exit_prog},
+	{"start_new_thread",	(method)thread_start_new_thread},
+	{"start_new",		(method)thread_start_new_thread},
+	{"allocate_lock",	(method)thread_allocate_lock},
+	{"allocate",		(method)thread_allocate_lock},
+	{"exit_thread",		(method)thread_exit_thread},
+	{"exit",		(method)thread_exit_thread},
+	{"get_ident",		(method)thread_get_ident},
+#ifndef NO_EXIT_PROG
+	{"exit_prog",		(method)thread_exit_prog},
+#endif
 	{NULL,			NULL}		/* sentinel */
 };
 
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 5406907..d35eba8 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,118 +28,71 @@
 #include "modsupport.h"
 #include "ceval.h"
 
-#include "sigtype.h"
-
-#include <signal.h>
-#include <setjmp.h>
-
-#ifdef BSD_TIME
-#define HAVE_GETTIMEOFDAY
-#include "myselect.h" /* Implies <sys/types.h>, <sys/time.h>, <sys/param.h> */
-#endif
-
 #ifdef macintosh
-#define NO_UNISTD
+#include <time.h>
+#else
+#include <sys/types.h>
 #endif
 
-#ifndef NO_UNISTD
+#ifdef QUICKWIN
+#include <io.h>
+#endif
+
+#ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
 
-/* What happens here is not trivial.
-   The BSD_TIME code needs <sys/time.h> (for struct timeval).
-   The rest of the code needs only time_t, except some MS-DOS
-   code which needs clock_t as well.
-   Standard C says that time_t is defined in <time.h>, and
-   does not have <sys/types.h>; THINK C agrees (MS-DOS too?).
-   What's worse, in pure 4.3 BSD, older SunOS versions, and
-   probably everything derived from BSD, you can't #include
-   both <time.h> and <sys/time.h> in the same file, since
-   <sys/time.h> includes <time.h> without any protection,
-   and <time.h> contains a typedef, which can't be parsed twice!
-   So on traditional UNIX systems we include <sys/types.h>
-   and <sys/time.h> and hope this implies <time.h> and time_t,
-   while on other systems, including conforming Standard C
-   systems (where 'unix' can't be defined), we rely on <time.h>.
-   Still one problem: BSD_TIME won't work with strict Standard C...
-*/
+#ifdef HAVE_SELECT
+#include "myselect.h"
+#else
+#include "mytime.h"
+#endif
 
-#ifdef unix
-#include <sys/types.h>
-#include <sys/time.h> /* Implies <time.h> everywhere, as far as I know */
-#else /* !unix */
-#include <time.h>
-#endif /* !unix */
+#ifdef HAVE_FTIME
+#include <sys/timeb.h>
+#endif
 
-#ifdef SYSV
-#if defined(sun) && defined(__STDC__)
-/* Temporary hack for Solaris 2. */
-#define _timezone timezone
-#define _altzone altzone
-#define _daylight daylight
-#define _tzname tzname
+#ifdef _M_IX86
+#include <windows.h>
+#define timezone _timezone
 #endif
-/* Access timezone stuff */
-#ifdef OLDTZ				/* ANSI prepends underscore to these */
-#define _timezone	timezone	/* seconds to be added to GMT */
-#define _altzone	0		/* _timezone if daylight saving time */
-#define _daylight	0		/* if zero, _altzone is not available*/
-#define _tzname		tzname		/* Name of timezone and altzone */
-#endif
-#ifdef NOALTTZ				/* if system doesn't support alt tz */
-#undef _daylight
-#undef _altzone
-#define _daylight	0
-#define _altzone 	0
-#endif
-#endif /* SYSV */
 
 /* Forward declarations */
-static void floatsleep PROTO((double));
-static long millitimer PROTO((void)); 
-
-/* Time methods */
+static int floatsleep PROTO((double));
+static double floattime PROTO(());
 
 static object *
 time_time(self, args)
 	object *self;
 	object *args;
 {
-#ifdef HAVE_GETTIMEOFDAY
-	struct timeval t;
-	struct timezone tz;
+	double secs;
 	if (!getnoarg(args))
 		return NULL;
-	if (gettimeofday(&t, &tz) != 0) {
+	secs = floattime();
+	if (secs == 0.0) {
 		err_errno(IOError);
 		return NULL;
 	}
-	return newfloatobject(t.tv_sec*1.0 + t.tv_usec*0.000001);
-#else /* !HAVE_GETTIMEOFDAY */
-	time_t secs;
+	return newfloatobject(secs);
+}
+
+#ifdef HAVE_CLOCK
+
+#ifndef CLOCKS_PER_SEC
+#define CLOCKS_PER_SEC 1000000
+#endif
+
+static object *
+time_clock(self, args)
+	object *self;
+	object *args;
+{
 	if (!getnoarg(args))
 		return NULL;
-	time(&secs);
-#ifdef macintosh
-/* The Mac epoch is 1904, while UNIX uses 1970; Python prefers 1970 */
-/* Moreover, the Mac returns local time.  This we cannot fix... */
-#define TIMEDIFF ((time_t) \
-	(((1970-1904)*365L + (1970-1904)/4) * 24 * 3600))
-	secs -= TIMEDIFF;
-#endif
-	return newfloatobject((double)secs);
-#endif /* !HAVE_GETTIMEOFDAY */
+	return newfloatobject(((double)clock()) / CLOCKS_PER_SEC);
 }
-
-static jmp_buf sleep_intr;
-
-/* ARGSUSED */
-static void
-sleep_catcher(sig)
-	int sig; /* Not used but required by interface */
-{
-	longjmp(sleep_intr, 1);
-}
+#endif /* HAVE_CLOCK */
 
 static object *
 time_sleep(self, args)
@@ -147,91 +100,22 @@
 	object *args;
 {
 	double secs;
-	SIGTYPE (*sigsave)() = 0; /* Initialized to shut lint up */
 	if (!getargs(args, "d", &secs))
 		return NULL;
 	BGN_SAVE
-	if (setjmp(sleep_intr)) {
+	if (floatsleep(secs) != 0) {
 		RET_SAVE
-		signal(SIGINT, sigsave);
-		err_set(KeyboardInterrupt);
 		return NULL;
 	}
-	sigsave = signal(SIGINT, SIG_IGN);
-	if (sigsave != (SIGTYPE (*)()) SIG_IGN)
-		signal(SIGINT, sleep_catcher);
-	floatsleep(secs);
 	END_SAVE
-	signal(SIGINT, sigsave);
 	INCREF(None);
 	return None;
 }
 
-#ifdef macintosh
-#define DO_MILLI
-#endif
-
-#ifdef AMOEBA
-#define DO_MILLI
-extern long sys_milli();
-#define millitimer sys_milli
-#endif /* AMOEBA */
-
-#ifdef BSD_TIME
-#define DO_MILLI
-#endif /* BSD_TIME */
-
-#ifdef MSDOS
-#define DO_MILLI
-#endif
-
-#ifdef DO_MILLI
-
-static object *
-time_millisleep(self, args)
-	object *self;
-	object *args;
-{
-	long msecs;
-	SIGTYPE (*sigsave)();
-	if (!getlongarg(args, &msecs))
-		return NULL;
-	BGN_SAVE
-	if (setjmp(sleep_intr)) {
-		RET_SAVE
-		signal(SIGINT, sigsave);
-		err_set(KeyboardInterrupt);
-		return NULL;
-	}
-	sigsave = signal(SIGINT, SIG_IGN);
-	if (sigsave != (SIGTYPE (*)()) SIG_IGN)
-		signal(SIGINT, sleep_catcher);
-	floatsleep(msecs / 1000.0);
-	END_SAVE
-	signal(SIGINT, sigsave);
-	INCREF(None);
-	return None;
-}
-
-static object *
-time_millitimer(self, args)
-	object *self;
-	object *args;
-{
-	long msecs;
-	if (!getnoarg(args))
-		return NULL;
-	msecs = millitimer();
-	return newintobject(msecs);
-}
-
-#endif /* DO_MILLI */
-
-
 static object *
 time_convert(when, function)
 	time_t when;
-	struct tm * (*function) PROTO((time_t *));
+	struct tm * (*function) PROTO((const time_t *));
 {
 	struct tm *p = function(&when);
 	return mkvalue("(iiiiiiiii)",
@@ -324,8 +208,6 @@
 	return newstringobject(p);
 }
 
-/* Some very old systems may not have mktime().  Comment it out then! */
-
 static object *
 time_mktime(self, args)
 	object *self;
@@ -338,12 +220,11 @@
 }
 
 static struct methodlist time_methods[] = {
-#ifdef DO_MILLI
-	{"millisleep",	time_millisleep},
-	{"millitimer",	time_millitimer},
-#endif /* DO_MILLI */
-	{"sleep",	time_sleep},
 	{"time",	time_time},
+#ifdef HAVE_CLOCK
+	{"clock",	time_clock},
+#endif
+	{"sleep",	time_sleep},
 	{"gmtime",	time_gmtime},
 	{"localtime",	time_localtime},
 	{"asctime",	time_asctime},
@@ -352,26 +233,32 @@
 	{NULL,		NULL}		/* sentinel */
 };
 
-
 void
 inittime()
 {
 	object *m, *d;
 	m = initmodule("time", time_methods);
 	d = getmoduledict(m);
-#ifdef SYSV
+#ifdef HAVE_TZNAME
 	tzset();
-	dictinsert(d, "timezone", newintobject((long)_timezone));
-	dictinsert(d, "altzone", newintobject((long)_altzone));
-	dictinsert(d, "daylight", newintobject((long)_daylight));
-	dictinsert(d, "tzname", mkvalue("(zz)", _tzname[0], _tzname[1]));
-#else /* !SYSV */
+	dictinsert(d, "timezone", newintobject((long)timezone));
+#ifdef HAVE_ALTZONE
+	dictinsert(d, "altzone", newintobject((long)altzone));
+#else
+	dictinsert(d, "altzone", newintobject((long)timezone-3600));
+#endif
+	dictinsert(d, "daylight", newintobject((long)daylight));
+	dictinsert(d, "tzname", mkvalue("(zz)", tzname[0], tzname[1]));
+#else /* !HAVE_TZNAME */
+#if HAVE_TM_ZONE
 	{
 #define YEAR ((time_t)((365 * 24 + 6) * 3600))
 		time_t t;
 		struct tm *p;
 		long winterzone, summerzone;
 		char wintername[10], summername[10];
+		/* XXX This won't work on the southern hemisphere.
+		   XXX Anybody got a better idea? */
 		t = (time((time_t *)0) / YEAR) * YEAR;
 		p = localtime(&t);
 		winterzone = -p->tm_gmtoff;
@@ -389,68 +276,54 @@
 		dictinsert(d, "tzname",
 			   mkvalue("(zz)", wintername, summername));
 	}
-#endif /* !SYSV */
+#endif /* HAVE_TM_ZONE */
+#endif /* !HAVE_TZNAME */
 }
 
 
-#ifdef macintosh
+/* Implement floattime() for various platforms */
 
-#define MacTicks	(* (long *)0x16A)
-
-#ifdef THINK_C_3_0
-sleep(secs)
-	int secs;
+static double
+floattime()
 {
-	register long deadline;
-	
-	deadline = MacTicks + mecs * 60;
-	while (MacTicks < deadline) {
-		if (intrcheck())
-			sleep_catcher(SIGINT);
-	}
-}
-#endif
-
-static void
-floatsleep(secs)
-	double secs;
-{
-	register long deadline;
-	
-	deadline = MacTicks + (long)(secs * 60.0);
-	while (MacTicks < deadline) {
-		if (intrcheck())
-			sleep_catcher(SIGINT);
-	}
-}
-
-static long
-millitimer()
-{
-	return MacTicks * 50 / 3; /* MacTicks * 1000 / 60 */
-}
-
-#endif /* macintosh */
-
-
-#ifdef unix
-
-#ifdef BSD_TIME
-
-static long
-millitimer()
-{
+	/* There are three ways to get the time:
+	   (1) gettimeofday() -- resolution in microseconds
+	   (2) ftime() -- resolution in milliseconds
+	   (3) time() -- resolution in seconds
+	   In all cases the return value is a float in seconds.
+	   Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may
+	   fail, so we fall back on ftime() or time().
+	   Note: clock resolution does not imply clock accuracy! */
+#ifdef HAVE_GETTIMEOFDAY
+    {
 	struct timeval t;
-	struct timezone tz;
-	if (gettimeofday(&t, &tz) != 0)
-		return -1;
-	return t.tv_sec*1000 + t.tv_usec/1000;
+	if (gettimeofday(&t, (struct timezone *)NULL) == 0)
+		return (double)t.tv_sec + t.tv_usec*0.000001;
+    }
+#endif /* !HAVE_GETTIMEOFDAY */
+    {
+#ifdef HAVE_FTIME
+	struct timeb t;
+	ftime(&t);
+	return (double)t.time + t.millitm*0.001;
+#else /* !HAVE_FTIME */
+	time_t secs;
+	time(&secs);
+	return (double)secs;
+#endif /* !HAVE_FTIME */
+    }
 }
 
-static void
+
+/* Implement floatsleep() for various platforms.
+   When interrupted (or when another error occurs), return -1 and
+   set an exception; else return 0. */
+
+static int
 floatsleep(secs)
 	double secs;
 {
+#ifdef HAVE_SELECT
 	struct timeval t;
 	double frac;
 	extern double fmod PROTO((double, double));
@@ -459,51 +332,57 @@
 	secs = floor(secs);
 	t.tv_sec = (long)secs;
 	t.tv_usec = (long)(frac*1000000.0);
-	(void) select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t);
-}
-
-#else /* !BSD_TIME */
-
-static void
-floatsleep(secs)
-	double secs;
-{
-	sleep((int)secs);
-}
-
-#endif /* !BSD_TIME */
-
-#endif /* unix */
-
-
+	if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {
+		err_errno(IOError);
+		return -1;
+	}
+#else /* !HAVE_SELECT */
+#ifdef macintosh
+#define MacTicks	(* (long *)0x16A)
+	long deadline;
+	deadline = MacTicks + (long)(secs * 60.0);
+	while (MacTicks < deadline) {
+		if (sigcheck())
+			return -1;
+	}
+#else /* !macintosh */
 #ifdef MSDOS
-
-#ifndef CLOCKS_PER_SEC
-#define CLOCKS_PER_SEC 55	/* 54.945 msec per tick (18.2 HZ clock) */
+	struct timeb t1, t2;
+	double frac;
+	extern double fmod PROTO((double, double));
+	extern double floor PROTO((double));
+	if (secs <= 0.0)
+		return;
+	frac = fmod(secs, 1.0);
+	secs = floor(secs);
+	ftime(&t1);
+	t2.time = t1.time + (int)secs;
+	t2.millitm = t1.millitm + (int)(frac*1000.0);
+	while (t2.millitm >= 1000) {
+		t2.time++;
+		t2.millitm -= 1000;
+	}
+	for (;;) {
+#ifdef QUICKWIN
+		_wyield();
 #endif
-
-static void
-floatsleep(secs)
-	double secs;
-{
-	delay(long(secs/1000.0));
+		if (sigcheck())
+			return -1;
+		ftime(&t1);
+		if (t1.time > t2.time ||
+		    t1.time == t2.time && t1.millitm >= t2.millitm)
+			break;
+	}
+#else /* !MSDOS */
+#ifdef _M_IX86
+	/* XXX Can't interrupt this sleep */
+	Sleep((int)(secs*1000));
+#else /* _M_IX86 */
+	/* XXX Can't interrupt this sleep */
+	sleep((int)secs);
+#endif /* _M_IX86 */
+#endif /* !MSDOS */
+#endif /* !macintosh */
+#endif /* !HAVE_SELECT */
+	return 0;
 }
-
-static long
-millitimer()
-{
-	clock_t ticks;
-
-	ticks = clock();	/* ticks since program start */
-	return ticks * CLOCKS_PER_SEC;/* XXX shouldn't this be different? */
-}
-
-floatsleep(secs)
-      double secs;
-{
-      clock_t t= clock( );
-      while( (clock()-t)/CLOCKS_PER_SEC<secs )
-              ;
-}
-
-#endif /* MSDOS */
diff --git a/Modules/version.c b/Modules/version.c
deleted file mode 100644
index d71b59f..0000000
--- a/Modules/version.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
-Amsterdam, The Netherlands.
-
-                        All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
-supporting documentation, and that the names of Stichting Mathematisch
-Centrum or CWI not be used in advertising or publicity pertaining to
-distribution of the software without specific, written prior permission.
-
-STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
-THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
-FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
-FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
-WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
-ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
-OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
-
-******************************************************************/
-
-/* Python version information */
-
-/* Return the version string.  This is constructed from the official
-   version number, the patch level, and the current date (if known to
-   the compiler, else a manually inserted date). */
-
-#define VERSION "1.0.%d ALPHA (%s)"
-
-#ifdef __DATE__
-#define DATE __DATE__
-#else
-#define DATE ">= 21 Dec 1993"
-#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 1990, 1991, 1992, 1993 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
-   appended.  (The Mac has no environment variables, so there the
-   default path is always returned.)  The default path may be passed
-   to the preprocessor; if not, a system-dependent default is used. */
-
-#ifndef PYTHONPATH
-#ifdef macintosh
-#define PYTHONPATH ": :lib :demo"
-#endif /* macintosh */
-#endif /* !PYTHONPATH */
-
-#ifndef PYTHONPATH
-#ifdef MSDOS
-#define PYTHONPATH ".;..\\lib;\\python\\lib"
-#endif /* MSDOS */
-#endif /* !PYTHONPATH */
-
-#ifndef PYTHONPATH
-#define PYTHONPATH ".:/usr/local/lib/python"
-#endif /* !PYTHONPATH */
-
-extern char *getenv();
-
-char *
-getpythonpath()
-{
-#ifdef macintosh
-	return PYTHONPATH;
-#else /* !macintosh */
-	char *path = getenv("PYTHONPATH");
-	char *defpath = PYTHONPATH;
-	char *buf;
-	char *p;
-	int n;
-
-	if (path == 0 || *path == '\0')
-		return defpath;
-	n = strlen(path) + strlen(defpath) + 2;
-	buf = malloc(n);
-	if (buf == NULL)
-		return path; /* XXX too bad -- but not likely */
-	strcpy(buf, path);
-	p = buf + strlen(buf);
-	*p++ = DELIM;
-	strcpy(p, defpath);
-	return buf;
-#endif /* !macintosh */
-}
-
-
-/* Table of built-in modules.
-   These are initialized when first imported.
-   Note: selection of optional extensions is now generally done by the
-   mkext.py script in ../Extensions, but for non-UNIX systems most
-   well-known extensions are still listed here. */
-
-/* Standard modules */
-
-#ifdef USE_AL
-extern void inital();
-#endif
-#ifdef USE_AMOEBA
-extern void initamoeba();
-#endif
-#ifdef USE_AUDIO
-extern void initaudio();
-#endif
-#ifdef USE_AUDIOOP
-extern void initaudioop();
-#endif
-#ifdef USE_CD
-extern void initcd();
-#endif
-#ifdef USE_CL
-extern void initcl();
-#endif
-#ifdef USE_DBM
-extern void initdbm();
-#endif
-#ifdef USE_FCNTL
-extern void initfcntl();
-#endif
-#ifdef USE_FL
-extern void initfl();
-#endif
-#ifdef USE_FM
-extern void initfm();
-#endif
-#ifdef USE_GL
-extern void initgl();
-#endif
-#ifdef USE_GRP
-extern void initgrp();
-#endif
-#ifdef USE_IMGFILE
-extern void initimgfile();
-#endif
-#ifdef USE_JPEG
-extern void initjpeg();
-#endif
-#ifdef USE_MAC
-extern void initmac();
-#endif
-#ifdef USE_MARSHAL
-extern void initmarshal();
-#endif
-#ifdef USE_MATH
-extern void initmath();
-#endif
-#ifdef USE_NIS
-extern void initnis();
-#endif
-#ifdef USE_PANEL
-extern void initpanel();
-#endif
-#ifdef USE_POSIX
-extern void initposix();
-#endif
-#ifdef USE_PWD
-extern void initpwd();
-#endif
-#ifdef USE_REGEX
-extern void initregex();
-#endif
-#ifdef USE_ROTOR
-extern void initrotor();
-#endif
-#ifdef USE_SELECT
-extern void initselect();
-#endif
-#ifdef USE_SGI
-extern void initsgi();
-#endif
-#ifdef USE_SOCKET
-extern void initsocket();
-#endif
-#ifdef USE_STDWIN
-extern void initstdwin();
-#endif
-#ifdef USE_STROP
-extern void initstrop();
-#endif
-#ifdef USE_STRUCT
-extern void initstruct();
-#endif
-#ifdef USE_SUNAUDIODEV
-extern void initsunaudiodev();
-#endif
-#ifdef USE_SV
-extern void initsv();
-#endif
-#ifdef USE_TIME
-extern void inittime();
-#endif
-#ifdef USE_IMAGEOP
-extern void initimageop();
-#endif
-#ifdef USE_MPZ
-extern void initmpz();
-#endif
-#ifdef USE_MD5
-extern void initmd5();
-#endif
-#ifdef USE_ARRAY
-extern void initarray();
-#endif
-#ifdef USE_XT
-extern void initXt();
-#endif
-#ifdef USE_XAW
-extern void initXaw();
-#endif
-#ifdef USE_XM
-extern void initXm();
-#endif
-#ifdef USE_GLX
-extern void initGlx();
-#endif
-#ifdef USE_HTML
-extern void initHTML();
-#endif
-#ifdef USE_XLIB
-extern void initXlib();
-#endif
-#ifdef USE_PARSER
-extern void initparser();
-#endif
-/* -- ADDMODULE MARKER 1 -- */
-
-struct {
-	char *name;
-	void (*initfunc)();
-} inittab[] = {
-
-#ifdef USE_AL
-	{"al",		inital},
-#endif
-
-#ifdef USE_AMOEBA
-	{"amoeba",	initamoeba},
-#endif
-
-#ifdef USE_AUDIO
-	{"audio",	initaudio},
-#endif
-
-#ifdef USE_AUDIOOP
-	{"audioop",	initaudioop},
-#endif
-
-#ifdef USE_CD
-	{"cd",		initcd},
-#endif
-
-#ifdef USE_CL
-	{"cl",		initcl},
-#endif
-
-#ifdef USE_DBM
-	{"dbm",		initdbm},
-#endif
-
-#ifdef USE_FCNTL
-	{"fcntl",	initfcntl},
-#endif
-
-#ifdef USE_FL
-	{"fl",		initfl},
-#endif
-
-#ifdef USE_FM
-	{"fm",		initfm},
-#endif
-
-#ifdef USE_GL
-	{"gl",		initgl},
-#endif
-
-#ifdef USE_GRP
-	{"grp",		initgrp},
-#endif
-
-#ifdef USE_IMGFILE
-	{"imgfile",	initimgfile},
-#endif
-
-#ifdef USE_JPEG
-	{"jpeg",	initjpeg},
-#endif
-
-#ifdef USE_MAC
-	{"mac",	initmac},
-#endif
-
-#ifdef USE_MARSHAL
-	{"marshal",	initmarshal},
-#endif
-
-#ifdef USE_MATH
-	{"math",	initmath},
-#endif
-
-#ifdef USE_NIS
-	{"nis",		initnis},
-#endif
-
-#ifdef USE_PANEL
-	{"pnl",		initpanel},
-#endif
-
-#ifdef USE_POSIX
-	{"posix",	initposix},
-#endif
-
-#ifdef USE_PWD
-	{"pwd",		initpwd},
-#endif
-
-#ifdef USE_REGEX
-	{"regex",	initregex},
-#endif
-
-#ifdef USE_ROTOR
-	{"rotor",	initrotor},
-#endif
-
-#ifdef USE_SELECT
-	{"select",	initselect},
-#endif
-
-#ifdef USE_SGI
-	{"sgi",		initsgi},
-#endif
-
-#ifdef USE_SOCKET
-	{"socket",	initsocket},
-#endif
-
-#ifdef USE_STDWIN
-	{"stdwin",	initstdwin},
-#endif
-
-#ifdef USE_STROP
-	{"strop",	initstrop},
-#endif
-
-#ifdef USE_STRUCT
-	{"struct",	initstruct},
-#endif
-
-#ifdef USE_SUNAUDIODEV
-	{"sunaudiodev",	initsunaudiodev},
-#endif
-
-#ifdef USE_SV
-	{"sv",		initsv},
-#endif
-
-#ifdef USE_TIME
-	{"time",	inittime},
-#endif
-
-#ifdef USE_IMAGEOP
-       {"imageop", initimageop},
-#endif
-
-#ifdef USE_MPZ
-       {"mpz", initmpz},
-#endif
-
-#ifdef USE_MD5
-       {"md5", initmd5},
-#endif
-
-#ifdef USE_ARRAY
-       {"array", initarray},
-#endif
diff --git a/Modules/yuv.h b/Modules/yuv.h
index 4046df6..60b6287 100644
--- a/Modules/yuv.h
+++ b/Modules/yuv.h
@@ -1,3 +1,27 @@
+/***********************************************************
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
 #ifndef Py_YUV_H
 #define Py_YUV_H
 #ifdef __cplusplus
diff --git a/Modules/yuvconvert.c b/Modules/yuvconvert.c
index 1b0ea63..69ec47c 100644
--- a/Modules/yuvconvert.c
+++ b/Modules/yuvconvert.c
@@ -1,3 +1,27 @@
+/***********************************************************
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
+Amsterdam, The Netherlands.
+
+                        All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its 
+documentation for any purpose and without fee is hereby granted, 
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in 
+supporting documentation, and that the names of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+******************************************************************/
+
 #include "yuv.h"
 
 void
diff --git a/Objects/Makefile.in b/Objects/Makefile.in
index 42671d9..d0c086f 100644
--- a/Objects/Makefile.in
+++ b/Objects/Makefile.in
@@ -9,17 +9,17 @@
 
 CC=		@CC@
 RANLIB=		@RANLIB@
+AR=		@AR@
+
 DEFS=		@DEFS@
 
 
 # === Other things that are customizable but not by configure ===
 
-TOP=		..
-INCLDIR=	$(TOP)/Py
-OPT=		-g
-CFLAGS=		$(OPT) -I$(INCLDIR) $(DEFS)
+INCLDIR=	$(srcdir)/../Include
+OPT=		-O
+CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
 
-AR=		ar
 MKDEP=		mkdep
 SHELL=		/bin/sh
 
@@ -57,11 +57,33 @@
 clobber:	clean
 		-rm -f *.a tags TAGS
 
-Makefile:	Makefile.in $(TOP)/config.status
-		CONFIG_FILES=Makefile $(SHELL) $(TOP)/config.status
+Makefile:	$(srcdir)/Makefile.in ../config.status
+		(cd ..; CONFIG_FILES=Objects/Makefile CONFIG_HEADERS= \
+		$(SHELL) config.status)
 
-depend:		$(SRCS)
-		$(MKDEP) $(CFLAGS) $(SRCS) $(PGENSRCS)
+depend:
+		$(MKDEP) $(CFLAGS) `echo $(OBJS) | tr ' ' '\012' | \
+					sed 's|\(.*\)\.o|$(srcdir)/\1.c|'`
+
+.PRECIOUS:	Makefile
+
+accessobject.o: accessobject.c
+classobject.o: classobject.c
+fileobject.o: fileobject.c
+floatobject.o: floatobject.c
+frameobject.o: frameobject.c
+funcobject.o: funcobject.c
+intobject.o: intobject.c
+listobject.o: listobject.c
+longobject.o: longobject.c
+mappingobject.o: mappingobject.c
+methodobject.o: methodobject.c
+moduleobject.o: moduleobject.c
+object.o: object.c
+rangeobject.o: rangeobject.c
+stringobject.o: stringobject.c
+tupleobject.o: tupleobject.c
+typeobject.o: typeobject.c
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
 # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/Objects/accessobject.c b/Objects/accessobject.c
index b2cd4ad..d516e67 100644
--- a/Objects/accessobject.c
+++ b/Objects/accessobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -26,7 +26,7 @@
 
 /* XXX TO DO LIST
    - __init__ and __del__ (and all other similar methods)
-     should be usable even when private, not ignored (???)
+     should be usable even when private, not ignored
 */
 
 #include "allobjects.h"
@@ -321,12 +321,12 @@
 	sizeof(accessobject),	/*tp_size*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	access_dealloc,		/*tp_dealloc*/
+	(destructor)access_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	access_getattr,		/*tp_getattr*/
+	(getattrfunc)access_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
 	0,			/*tp_compare*/
-	access_repr,		/*tp_repr*/
+	(reprfunc)access_repr, /*tp_repr*/
 	0,			/*tp_as_number*/
 	0,			/*tp_as_sequence*/
 	0,			/*tp_as_mapping*/
diff --git a/Objects/classobject.c b/Objects/classobject.c
index 268cf1a..35ce0b1 100644
--- a/Objects/classobject.c
+++ b/Objects/classobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -103,7 +103,7 @@
 	register char *name;
 {
 	register object *v;
-	object *class;
+	classobject *class;
 	if (strcmp(name, "__dict__") == 0) {
 		INCREF(op->cl_dict);
 		return op->cl_dict;
@@ -189,12 +189,12 @@
 	"class",
 	sizeof(classobject),
 	0,
-	class_dealloc,	/*tp_dealloc*/
+	(destructor)class_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
-	class_getattr,	/*tp_getattr*/
-	class_setattr,	/*tp_setattr*/
+	(getattrfunc)class_getattr, /*tp_getattr*/
+	(setattrfunc)class_setattr, /*tp_setattr*/
 	0,		/*tp_compare*/
-	class_repr,	/*tp_repr*/
+	(reprfunc)class_repr, /*tp_repr*/
 	0,		/*tp_as_number*/
 	0,		/*tp_as_sequence*/
 	0,		/*tp_as_mapping*/
@@ -235,7 +235,7 @@
 	
 	n = gettuplesize(class->cl_bases);
 	for (i = 0; i < n; i++) {
-		if (addaccess(gettupleitem(class->cl_bases, i), inst) < 0)
+		if (addaccess((classobject *)gettupleitem(class->cl_bases, i), inst) < 0)
 			return -1;
 	}
 	
@@ -613,9 +613,9 @@
 }
 
 static mapping_methods instance_as_mapping = {
-	instance_length,	/*mp_length*/
-	instance_subscript,	/*mp_subscript*/
-	instance_ass_subscript,	/*mp_ass_subscript*/
+	(inquiry)instance_length, /*mp_length*/
+	(binaryfunc)instance_subscript, /*mp_subscript*/
+	(objobjargproc)instance_ass_subscript, /*mp_ass_subscript*/
 };
 
 static object *
@@ -764,13 +764,13 @@
 }
 
 static sequence_methods instance_as_sequence = {
-	instance_length,	/*sq_length*/
-	instance_concat,	/*sq_concat*/
-	instance_repeat,	/*sq_repeat*/
-	instance_item,		/*sq_item*/
-	instance_slice,		/*sq_slice*/
-	instance_ass_item,	/*sq_ass_item*/
-	instance_ass_slice,	/*sq_ass_slice*/
+	(inquiry)instance_length, /*sq_length*/
+	(binaryfunc)instance_concat, /*sq_concat*/
+	(intargfunc)instance_repeat, /*sq_repeat*/
+	(intargfunc)instance_item, /*sq_item*/
+	(intintargfunc)instance_slice, /*sq_slice*/
+	(intobjargproc)instance_ass_item, /*sq_ass_item*/
+	(intintobjargproc)instance_ass_slice, /*sq_ass_slice*/
 };
 
 static object *
@@ -916,29 +916,29 @@
 UNARY(instance_hex, "__hex__")
 
 static number_methods instance_as_number = {
-	instance_add,		/*nb_add*/
-	instance_sub,		/*nb_subtract*/
-	instance_mul,		/*nb_multiply*/
-	instance_div,		/*nb_divide*/
-	instance_mod,		/*nb_remainder*/
-	instance_divmod,	/*nb_divmod*/
-	instance_pow,		/*nb_power*/
-	instance_neg,		/*nb_negative*/
-	instance_pos,		/*nb_positive*/
-	instance_abs,		/*nb_absolute*/
-	instance_nonzero,	/*nb_nonzero*/
-	instance_invert,	/*nb_invert*/
-	instance_lshift,	/*nb_lshift*/
-	instance_rshift,	/*nb_rshift*/
-	instance_and,		/*nb_and*/
-	instance_xor,		/*nb_xor*/
-	instance_or,		/*nb_or*/
-	instance_coerce,	/*nb_coerce*/
-	instance_int,		/*nb_int*/
-	instance_long,		/*nb_long*/
-	instance_float,		/*nb_float*/
-	instance_oct,		/*nb_oct*/
-	instance_hex,		/*nb_hex*/
+	(binaryfunc)instance_add, /*nb_add*/
+	(binaryfunc)instance_sub, /*nb_subtract*/
+	(binaryfunc)instance_mul, /*nb_multiply*/
+	(binaryfunc)instance_div, /*nb_divide*/
+	(binaryfunc)instance_mod, /*nb_remainder*/
+	(binaryfunc)instance_divmod, /*nb_divmod*/
+	(binaryfunc)instance_pow, /*nb_power*/
+	(unaryfunc)instance_neg, /*nb_negative*/
+	(unaryfunc)instance_pos, /*nb_positive*/
+	(unaryfunc)instance_abs, /*nb_absolute*/
+	(inquiry)instance_nonzero, /*nb_nonzero*/
+	(unaryfunc)instance_invert, /*nb_invert*/
+	(binaryfunc)instance_lshift, /*nb_lshift*/
+	(binaryfunc)instance_rshift, /*nb_rshift*/
+	(binaryfunc)instance_and, /*nb_and*/
+	(binaryfunc)instance_xor, /*nb_xor*/
+	(binaryfunc)instance_or, /*nb_or*/
+	(coercion)instance_coerce, /*nb_coerce*/
+	(unaryfunc)instance_int, /*nb_int*/
+	(unaryfunc)instance_long, /*nb_long*/
+	(unaryfunc)instance_float, /*nb_float*/
+	(unaryfunc)instance_oct, /*nb_oct*/
+	(unaryfunc)instance_hex, /*nb_hex*/
 };
 
 typeobject Instancetype = {
@@ -947,17 +947,17 @@
 	"instance",
 	sizeof(instanceobject),
 	0,
-	instance_dealloc,	/*tp_dealloc*/
+	(destructor)instance_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
 	(object * (*) FPROTO((object *, char *)))
-	instance_getattr,	/*tp_getattr*/
-	instance_setattr,	/*tp_setattr*/
-	instance_compare,	/*tp_compare*/
-	instance_repr,		/*tp_repr*/
+	(getattrfunc)instance_getattr, /*tp_getattr*/
+	(setattrfunc)instance_setattr, /*tp_setattr*/
+	(cmpfunc)instance_compare, /*tp_compare*/
+	(reprfunc)instance_repr, /*tp_repr*/
 	&instance_as_number,	/*tp_as_number*/
 	&instance_as_sequence,	/*tp_as_sequence*/
 	&instance_as_mapping,	/*tp_as_mapping*/
-	instance_hash,		/*tp_hash*/
+	(hashfunc)instance_hash, /*tp_hash*/
 };
 
 
@@ -1126,14 +1126,14 @@
 	"instance method",
 	sizeof(instancemethodobject),
 	0,
-	instancemethod_dealloc,	/*tp_dealloc*/
+	(destructor)instancemethod_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	instancemethod_getattr,	/*tp_getattr*/
+	(getattrfunc)instancemethod_getattr, /*tp_getattr*/
 	0,			/*tp_setattr*/
-	instancemethod_compare,	/*tp_compare*/
-	instancemethod_repr,	/*tp_repr*/
+	(cmpfunc)instancemethod_compare, /*tp_compare*/
+	(reprfunc)instancemethod_repr, /*tp_repr*/
 	0,			/*tp_as_number*/
 	0,			/*tp_as_sequence*/
 	0,			/*tp_as_mapping*/
-	instancemethod_hash,	/*tp_hash*/
+	(hashfunc)instancemethod_hash, /*tp_hash*/
 };
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 518fe04..eb8f4aa 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -26,6 +26,7 @@
 
 #include "allobjects.h"
 #include "modsupport.h"
+#include "structmember.h"
 #include "ceval.h"
 
 #define BUF(v) GETSTRINGVALUE((stringobject *)v)
@@ -113,6 +114,30 @@
 	return (object *)f;
 }
 
+void
+setfilebufsize(f, bufsize)
+	object *f;
+	int bufsize;
+{
+	if (bufsize >= 0) {
+#ifdef HAVE_SETVBUF
+		int type;
+		switch (bufsize) {
+		case 0:
+			type = _IONBF;
+			break;
+		case 1:
+			type = _IOLBF;
+			bufsize = BUFSIZ;
+			break;
+		default:
+			type = _IOFBF;
+		}
+		setvbuf(((fileobject *)f)->f_fp, (char *)NULL, type, bufsize);
+#endif /* HAVE_SETVBUF */
+	}
+}
+
 static object *
 err_closed()
 {
@@ -290,16 +315,16 @@
 	
 	if (f->f_fp == NULL)
 		return err_closed();
-	if (args == NULL) {
+	if (args == NULL)
 		n = 0;
+	else {
+		if (!getargs(args, "i", &n))
+			return NULL;
 		if (n < 0) {
 			err_setstr(ValueError, "negative read count");
 			return NULL;
 		}
 	}
-	else if (!getargs(args, "i", &n))
-		return NULL;
-	
 	n2 = n != 0 ? n : BUFSIZ;
 	v = newsizedstringobject((char *)NULL, n2);
 	if (v == NULL)
@@ -358,10 +383,9 @@
 	for (;;) {
 		if ((c = getc(fp)) == EOF) {
 			clearerr(fp);
-			if (intrcheck()) {
+			if (sigcheck()) {
 				RET_SAVE
 				DECREF(v);
-				err_set(KeyboardInterrupt);
 				return NULL;
 			}
 			if (n < 0 && buf == BUF(v)) {
@@ -583,26 +607,58 @@
 }
 
 static struct methodlist file_methods[] = {
-	{"close",	file_close},
-	{"flush",	file_flush},
-	{"fileno",	file_fileno},
-	{"isatty",	file_isatty},
-	{"read",	file_read},
-	{"readline",	file_readline},
-	{"readlines",	file_readlines},
-	{"seek",	file_seek},
-	{"tell",	file_tell},
-	{"write",	file_write},
-	{"writelines",	file_writelines},
+	{"close",	(method)file_close},
+	{"flush",	(method)file_flush},
+	{"fileno",	(method)file_fileno},
+	{"isatty",	(method)file_isatty},
+	{"read",	(method)file_read},
+	{"readline",	(method)file_readline},
+	{"readlines",	(method)file_readlines},
+	{"seek",	(method)file_seek},
+	{"tell",	(method)file_tell},
+	{"write",	(method)file_write},
+	{"writelines",	(method)file_writelines},
 	{NULL,		NULL}		/* sentinel */
 };
 
+#define OFF(x) offsetof(fileobject, x)
+
+static struct memberlist file_memberlist[] = {
+	{"softspace",	T_INT,		OFF(f_softspace)},
+	{"mode",	T_OBJECT,	OFF(f_mode),	RO},
+	{"name",	T_OBJECT,	OFF(f_name),	RO},
+	/* getattr(f, "closed") is implemented without this table */
+	{"closed",	T_INT,		0,		RO},
+	{NULL}	/* Sentinel */
+};
+
 static object *
 file_getattr(f, name)
 	fileobject *f;
 	char *name;
 {
-	return findmethod(file_methods, (object *)f, name);
+	object *res;
+
+	res = findmethod(file_methods, (object *)f, name);
+	if (res != NULL)
+		return res;
+	err_clear();
+	if (strcmp(name, "closed") == 0)
+		return newintobject((long)(f->f_fp == 0));
+	return getmember((char *)f, file_memberlist, name);
+}
+
+static int
+file_setattr(f, name, v)
+	fileobject *f;
+	char *name;
+	object *v;
+{
+	if (v == NULL) {
+		err_setstr(AttributeError, "can't delete file attributes");
+		return -1;
+	}
+	return setmember((char *)f, file_memberlist, name, v);
 }
 
 typeobject Filetype = {
@@ -611,12 +667,12 @@
 	"file",
 	sizeof(fileobject),
 	0,
-	file_dealloc,	/*tp_dealloc*/
+	(destructor)file_dealloc, /*tp_dealloc*/
 	0,		/*tp_print*/
-	file_getattr,	/*tp_getattr*/
-	0,		/*tp_setattr*/
+	(getattrfunc)file_getattr, /*tp_getattr*/
+	(setattrfunc)file_setattr, /*tp_setattr*/
 	0,		/*tp_compare*/
-	file_repr,	/*tp_repr*/
+	(reprfunc)file_repr, /*tp_repr*/
 };
 
 /* Interface for the 'soft space' between print items. */
@@ -710,7 +766,7 @@
 		if (fp != NULL)
 			fputs(s, fp);
 	}
-	else {
+	else if (!err_occurred()) {
 		object *v = newstringobject(s);
 		if (v == NULL) {
 			err_clear();
diff --git a/Objects/floatobject.c b/Objects/floatobject.c
index d3a2c77..5ff67db 100644
--- a/Objects/floatobject.c
+++ b/Objects/floatobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -47,7 +47,7 @@
 #define CHECK(x) /* Don't know how to check */
 #endif
 
-#ifndef THINK_C
+#ifndef macintosh
 extern double fmod PROTO((double, double));
 extern double pow PROTO((double, double));
 #endif
@@ -77,12 +77,31 @@
 getfloatvalue(op)
 	object *op;
 {
-	if (!is_floatobject(op)) {
+	number_methods *nb;
+	floatobject *fo;
+	double val;
+	
+	if (op && is_floatobject(op))
+		return GETFLOATVALUE((floatobject*) op);
+	
+	if (op == NULL || (nb = op->ob_type->tp_as_number) == NULL ||
+	    nb->nb_float == NULL) {
 		err_badarg();
 		return -1;
 	}
-	else
-		return ((floatobject *)op) -> ob_fval;
+	
+	fo = (floatobject*) (*nb->nb_float) (op);
+	if (fo == NULL)
+		return -1;
+	if (!is_floatobject(fo)) {
+		err_setstr(TypeError, "nb_float should return float object");
+		return -1;
+	}
+	
+	val = GETFLOATVALUE(fo);
+	DECREF(fo);
+	
+	return val;
 }
 
 /* Methods */
@@ -156,7 +175,17 @@
 	/* This is designed so that Python numbers with the same
 	   value hash to the same value, otherwise comparisons
 	   of mapping keys will turn out weird */
+
+#ifdef MPW /* MPW C modf expects pointer to extended as second argument */
+{
+	extended e;
+	fractpart = modf(v->ob_fval, &e);
+	intpart = e;
+}
+#else
 	fractpart = modf(v->ob_fval, &intpart);
+#endif
+
 	if (fractpart == 0.0) {
 		if (intpart > 0x7fffffffL || -intpart > 0x7fffffffL) {
 			/* Convert to long int and use its hash... */
@@ -372,27 +401,27 @@
 
 
 static number_methods float_as_number = {
-	float_add,	/*nb_add*/
-	float_sub,	/*nb_subtract*/
-	float_mul,	/*nb_multiply*/
-	float_div,	/*nb_divide*/
-	float_rem,	/*nb_remainder*/
-	float_divmod,	/*nb_divmod*/
-	float_pow,	/*nb_power*/
-	float_neg,	/*nb_negative*/
-	float_pos,	/*nb_positive*/
-	float_abs,	/*nb_absolute*/
-	float_nonzero,	/*nb_nonzero*/
+	(binaryfunc)float_add, /*nb_add*/
+	(binaryfunc)float_sub, /*nb_subtract*/
+	(binaryfunc)float_mul, /*nb_multiply*/
+	(binaryfunc)float_div, /*nb_divide*/
+	(binaryfunc)float_rem, /*nb_remainder*/
+	(binaryfunc)float_divmod, /*nb_divmod*/
+	(binaryfunc)float_pow, /*nb_power*/
+	(unaryfunc)float_neg, /*nb_negative*/
+	(unaryfunc)float_pos, /*nb_positive*/
+	(unaryfunc)float_abs, /*nb_absolute*/
+	(inquiry)float_nonzero, /*nb_nonzero*/
 	0,		/*nb_invert*/
 	0,		/*nb_lshift*/
 	0,		/*nb_rshift*/
 	0,		/*nb_and*/
 	0,		/*nb_xor*/
 	0,		/*nb_or*/
-	float_coerce,	/*nb_coerce*/
-	float_int,	/*nb_int*/
-	float_long,	/*nb_long*/
-	float_float,	/*nb_float*/
+	(coercion)float_coerce, /*nb_coerce*/
+	(unaryfunc)float_int, /*nb_int*/
+	(unaryfunc)float_long, /*nb_long*/
+	(unaryfunc)float_float, /*nb_float*/
 	0,		/*nb_oct*/
 	0,		/*nb_hex*/
 };
@@ -403,14 +432,14 @@
 	"float",
 	sizeof(floatobject),
 	0,
-	float_dealloc,		/*tp_dealloc*/
-	float_print,		/*tp_print*/
+	(destructor)float_dealloc, /*tp_dealloc*/
+	(printfunc)float_print, /*tp_print*/
 	0,			/*tp_getattr*/
 	0,			/*tp_setattr*/
-	float_compare,		/*tp_compare*/
-	float_repr,		/*tp_repr*/
+	(cmpfunc)float_compare, /*tp_compare*/
+	(reprfunc)float_repr, /*tp_repr*/
 	&float_as_number,	/*tp_as_number*/
 	0,			/*tp_as_sequence*/
 	0,			/*tp_as_mapping*/
-	float_hash,		/*tp_hash */
+	(hashfunc)float_hash, /*tp_hash*/
 };
diff --git a/Objects/xxobject.c b/Objects/xxobject.c
index 64e0228..e135d3f 100644
--- a/Objects/xxobject.c
+++ b/Objects/xxobject.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -42,7 +42,7 @@
 	object	*x_attr;	/* Attributes dictionary */
 } xxobject;
 
-extern typeobject Xxtype;	/* Really static, forward */
+staticforward typeobject Xxtype;
 
 #define is_xxobject(v)		((v)->ob_type == &Xxtype)
 
@@ -80,7 +80,7 @@
 }
 
 static struct methodlist xx_methods[] = {
-	{"demo",	xx_demo},
+	{"demo",	(method)xx_demo},
 	{NULL,		NULL}		/* sentinel */
 };
 
@@ -125,13 +125,13 @@
 	OB_HEAD_INIT(&Typetype)
 	0,			/*ob_size*/
 	"xx",			/*tp_name*/
-	sizeof(xxobject),	/*tp_size*/
+	sizeof(xxobject),	/*tp_basicsize*/
 	0,			/*tp_itemsize*/
 	/* methods */
-	xx_dealloc,		/*tp_dealloc*/
+	(destructor)xx_dealloc, /*tp_dealloc*/
 	0,			/*tp_print*/
-	xx_getattr,		/*tp_getattr*/
-	xx_setattr,		/*tp_setattr*/
+	(getattrfunc)xx_getattr, /*tp_getattr*/
+	(setattrfunc)xx_setattr, /*tp_setattr*/
 	0,			/*tp_compare*/
 	0,			/*tp_repr*/
 	0,			/*tp_as_number*/
diff --git a/Parser/Makefile.in b/Parser/Makefile.in
index b5649aa..4c1e1fa 100644
--- a/Parser/Makefile.in
+++ b/Parser/Makefile.in
@@ -9,17 +9,17 @@
 
 CC=		@CC@
 RANLIB=		@RANLIB@
+AR=		@AR@
+
 DEFS=		@DEFS@
 
 
 # === Other things that are customizable but not by configure ===
 
-TOP=		..
-INCLDIR=	$(TOP)/Py
-OPT=		-g
-CFLAGS=		$(OPT) -I$(INCLDIR) $(DEFS)
+INCLDIR=	$(srcdir)/../Include
+OPT=		-O
+CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
 
-AR=		ar
 MKDEP=		mkdep
 SHELL=		/bin/sh
 
@@ -34,13 +34,7 @@
 
 PGENOBJS=	pgenmain.o
 
-PARSERSRCS=	acceler.c fgetsintr.c grammar1.c \
-		intrcheck.c listnode.c myreadline.c node.c parser.c \
-		parsetok.c tokenizer.c bitset.c \
-		firstsets.c grammar.c metagrammar.c pgen.c \
-		printgrammar.c
-
-PGENSRCS=	pgenmain.c
+OBJS=		$(PGENOBJS) $(PARSEROBJS)
 
 PGEN=		pgen
 
@@ -64,11 +58,32 @@
 clobber:	clean
 		-rm -f $(PGEN) *.a tags TAGS
 
-Makefile:	Makefile.in $(TOP)/config.status
-		CONFIG_FILES=Makefile $(SHELL) $(TOP)/config.status
+Makefile:	$(srcdir)/Makefile.in ../config.status
+		(cd ..; CONFIG_FILES=Parser/Makefile CONFIG_HEADERS= \
+		$(SHELL) config.status)
 
-depend:		$(PARSERSRCS) $(PGENSRCS)
-		$(MKDEP) $(CFLAGS) $(PARSERSRCS) $(PGENSRCS)
+depend:
+		$(MKDEP) $(CFLAGS) `echo $(OBJS) | tr ' ' '\012' | \
+					sed 's|\(.*\)\.o|$(srcdir)/\1.c|'`
+
+.PRECIOUS:	Makefile
+
+acceler.o: acceler.c
+grammar1.o: grammar1.c
+intrcheck.o: intrcheck.c
+listnode.o: listnode.c
+myreadline.o: myreadline.c
+node.o: node.c
+parser.o: parser.c
+parsetok.o: parsetok.c
+tokenizer.o: tokenizer.c
+bitset.o: bitset.c
+firstsets.o: firstsets.c
+grammar.o: grammar.c
+metagrammar.o: metagrammar.c
+pgen.o: pgen.c
+printgrammar.o: printgrammar.c
+pgenmain.o: pgenmain.c
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
 # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/Parser/assert.h b/Parser/assert.h
index dbce369..d007eca 100644
--- a/Parser/assert.h
+++ b/Parser/assert.h
@@ -5,7 +5,7 @@
 #endif
 
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -28,7 +28,13 @@
 
 ******************************************************************/
 
+#ifdef MPW /* This is for MPW's File command */
+
+#define assert(e) { if (!(e)) { printf("### Python: Assertion failed:\n\
+    File %s; Line %d\n", __FILE__, __LINE__); abort(); } }
+#else
 #define assert(e) { if (!(e)) { printf("Assertion failed\n"); abort(); } }
+#endif
 
 #ifdef __cplusplus
 }
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
index 870333c..18f8b1d 100644
--- a/Parser/myreadline.c
+++ b/Parser/myreadline.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -32,12 +32,19 @@
    - a malloc'ed string ending in \n normally
 */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
 
+#include "myproto.h"
 #include "mymalloc.h"
+#include "intrcheck.h"
 
-#ifdef HAVE_READLINE
+#ifdef WITH_READLINE
 
 extern char *readline();
 
@@ -54,7 +61,44 @@
 	longjmp(jbuf, 1);
 }
 
-#endif /* HAVE_READLINE */
+#else /* !WITH_READLINE */
+
+/* This function restarts a fgets() after an EINTR error occurred
+   except if intrcheck() returns true. */
+
+static int
+my_fgets(buf, len, fp)
+	char *buf;
+	int len;
+	FILE *fp;
+{
+	char *p;
+	for (;;) {
+		errno = 0;
+		p = fgets(buf, len, fp);
+		if (p != NULL)
+			return 0; /* No error */
+		if (feof(fp)) {
+			return -1; /* EOF */
+		}
+#ifdef EINTR
+		if (errno == EINTR) {
+			if (intrcheck()) {
+				return 1; /* Interrupt */
+			}
+			continue;
+		}
+#endif
+		if (intrcheck()) {
+			return 1; /* Interrupt */
+		}
+		return -2; /* Error */
+	}
+	/* NOTREACHED */
+}
+
+#endif /* WITH_READLINE */
+
 
 char *
 my_readline(prompt)
@@ -62,7 +106,7 @@
 {
 	int n;
 	char *p;
-#ifdef HAVE_READLINE
+#ifdef WITH_READLINE
 	RETSIGTYPE (*old_inthandler)();
 	static int been_here;
 	if (!been_here) {
@@ -92,28 +136,41 @@
 		p[n+1] = '\0';
 	}
 	return p;
-#else /* !HAVE_READLINE */
+#else /* !WITH_READLINE */
 	n = 100;
 	if ((p = malloc(n)) == NULL)
 		return NULL;
 	if (prompt)
 		fprintf(stderr, "%s", prompt);
-	if (fgets(p, n, stdin) == NULL)
-		    *p = '\0';
-	if (intrcheck()) {
+	switch (my_fgets(p, n, stdin)) {
+	case 0: /* Normal case */
+		break;
+	case 1: /* Interrupt */
 		free(p);
 		return NULL;
+	case -1: /* EOF */
+	case -2: /* Error */
+	default: /* Shouldn't happen */
+		*p = '\0';
+		break;
 	}
+#ifdef MPW
+	/* Hack for MPW C where the prompt comes right back in the input */
+	/* XXX (Actually this would be rather nice on most systems...) */
+	n = strlen(prompt);
+	if (strncmp(p, prompt, n) == 0)
+		memmove(p, p + n, strlen(p) - n + 1);
+#endif
 	n = strlen(p);
 	while (n > 0 && p[n-1] != '\n') {
 		int incr = n+2;
 		p = realloc(p, n + incr);
 		if (p == NULL)
 			return NULL;
-		if (fgets(p+n, incr, stdin) == NULL)
+		if (my_fgets(p+n, incr, stdin) != 0)
 			break;
 		n += strlen(p+n);
 	}
 	return realloc(p, n+1);
-#endif /* !HAVE_READLINE */
+#endif /* !WITH_READLINE */
 }
diff --git a/Python/Makefile.in b/Python/Makefile.in
index 7340ed4..732ea86 100644
--- a/Python/Makefile.in
+++ b/Python/Makefile.in
@@ -9,19 +9,20 @@
 
 CC=		@CC@
 RANLIB=		@RANLIB@
+AR=		@AR@
+
 DEFS=		@DEFS@
 LIBOBJS=	@LIBOBJS@
 LIBS=		@LIBS@
+DLINCLDIR=	@DLINCLDIR@
 
 
 # === Other things that are customizable but not by configure ===
 
-TOP=		..
-INCLDIR=	$(TOP)/Py
-OPT=		-g
-CFLAGS=		$(OPT) -I$(INCLDIR) $(DEFS)
+INCLDIR=	$(srcdir)/../Include
+OPT=		-O
+CFLAGS=		$(OPT) -I$(INCLDIR) -I.. $(DEFS)
 
-AR=		ar
 MKDEP=		mkdep
 SHELL=		/bin/sh
 
@@ -29,52 +30,77 @@
 # === Fixed definitions ===
 
 OBJS=		\
-		arraymodule.o \
 		bltinmodule.o \
 		ceval.o cgensupport.o compile.o \
 		errors.o \
 		frozenmain.o \
 		getmtime.o graminit.o \
 		import.o \
-		marshal.o mathmodule.o modsupport.o \
-		parsermodule.o posixmodule.o pythonmain.o pythonrun.o \
-		regexmodule.o regexpr.o \
-		stropmodule.o structmember.o structmodule.o sysmodule.o \
-		timemodule.o traceback.o \
+		marshal.o modsupport.o mystrtoul.o \
+		pythonmain.o pythonrun.o \
+		sigcheck.o structmember.o sysmodule.o \
+		traceback.o \
 		version.o \
 		$(LIBOBJS)
 
 LIB=		libPython.a
 
-MYLIBS=		$(LIB) ../Objects/libObjects.a ../Parser/libParser.a
-
 SYSLIBS=	-lm
 
 
 # === Rules ===
 
-all:		$(LIB) python
+all:		$(LIB)
 
 $(LIB):		$(OBJS)
 		$(AR) cr $(LIB) $(OBJS)
 		$(RANLIB) $(LIB)
 
-python:		config.o $(MYLIBS)
-		$(CC) config.o $(MYLIBS) $(LIBS) $(SYSLIBS) -o python
-
-config.o:	Makefile
-
 clean:
 		-rm -f *.o core *~ [@,#]* *.old *.orig *.rej
 
 clobber:	clean
-		-rm -f *.a python tags TAGS
+		-rm -f *.a tags TAGS
 
-Makefile:	Makefile.in $(TOP)/config.status
-		CONFIG_FILES=Makefile $(SHELL) $(TOP)/config.status
+Makefile:	$(srcdir)/Makefile.in ../config.status
+		(cd ..; CONFIG_FILES=Python/Makefile CONFIG_HEADERS= \
+		$(SHELL) config.status)
 
-depend:		$(SRCS)
-		$(MKDEP) $(CFLAGS) $(SRCS) $(PGENSRCS)
+import.o:	import.c
+		$(CC) $(CFLAGS) -I$(DLINCLDIR) -c $(srcdir)/import.c
+
+depend:
+		$(MKDEP) $(CFLAGS) `echo $(OBJS) | tr ' ' '\012' | \
+					sed 's|\(.*\)\.o|$(srcdir)/\1.c|'`
+
+.PRECIOUS:	Makefile
+
+bltinmodule.o: bltinmodule.c
+ceval.o: ceval.c
+cgensupport.o: cgensupport.c
+compile.o: compile.c
+dup2.o: dup2.c
+errors.o: errors.c
+fmod.o: fmod.c
+frozenmain.o: frozenmain.c
+getcwd.o: getcwd.c
+getmtime.o: getmtime.c
+graminit.o: graminit.c
+import.o: import.c
+marshal.o: marshal.c
+memmove.o: memmove.c
+modsupport.o: modsupport.c
+mystrtoul.o: mystrtoul.c
+pythonmain.o: pythonmain.c
+pythonrun.o: pythonrun.c
+sigcheck.o: sigcheck.c
+strerror.o: strerror.c
+strtod.o: strtod.c
+structmember.o: structmember.c
+sysmodule.o: sysmodule.c
+thread.o: thread.c
+traceback.o: traceback.c
+version.o: version.c
 
 # DO NOT DELETE THIS LINE -- mkdep uses it.
 # DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
diff --git a/Python/dup2.c b/Python/dup2.c
index 85ec5d5..ee1a7ad 100644
--- a/Python/dup2.c
+++ b/Python/dup2.c
@@ -20,12 +20,17 @@
 int fd1, fd2;
 {
 	if (fd1 != fd2) {
+#ifdef MPW
+		close (fd2); /* XXX RJW MPW does not implement F_GETFL but it does have dup */
+		fd2 = dup(fd1);
+#else
 		if (fcntl(fd1, F_GETFL) < 0)
 			return BADEXIT;
 		if (fcntl(fd2, F_GETFL) >= 0)
 			close(fd2);
 		if (fcntl(fd1, F_DUPFD, fd2) < 0)
 			return BADEXIT;
+#endif
 	}
 	return fd2;
 }
diff --git a/Python/getmtime.c b/Python/getmtime.c
index 931da64..fa2fd02 100644
--- a/Python/getmtime.c
+++ b/Python/getmtime.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -26,8 +26,16 @@
 
 /* (A separate file because this may be OS dependent) */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef macintosh
+#include "stat.h"
+#else
 #include <sys/types.h>
 #include <sys/stat.h>
+#endif
 
 long
 getmtime(path)
diff --git a/Python/memmove.c b/Python/memmove.c
index e812751..143e642 100644
--- a/Python/memmove.c
+++ b/Python/memmove.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
diff --git a/Python/mystrtoul.c b/Python/mystrtoul.c
index 965421b..6b2a06f 100644
--- a/Python/mystrtoul.c
+++ b/Python/mystrtoul.c
@@ -1,5 +1,5 @@
 /***********************************************************
-Copyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
+Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
 Amsterdam, The Netherlands.
 
                         All Rights Reserved
@@ -22,6 +22,12 @@
 
 ******************************************************************/
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* strtol and strtoul, renamed to avoid conflicts */
+
 /*
 **	strtoul
 **		This is a general purpose routine for converting
@@ -40,7 +46,7 @@
 #include <errno.h>
 
 unsigned long
-strtoul(str, ptr, base)
+mystrtoul(str, ptr, base)
 register char *	str;
 char **		ptr;
 int		base;
@@ -108,8 +114,10 @@
 	}
 	temp = result;
 	result = result * base + c;
+#ifndef MPW
 	if ((result - c) / base != temp)	/* overflow */
 	    ovf = 1;
+#endif
 	str++;
     }
 
@@ -125,7 +133,7 @@
 }
 
 long
-strtol(str, ptr, base)
+mystrtol(str, ptr, base)
 char *	str;
 char ** ptr;
 int	base;
@@ -140,7 +148,7 @@
 	if (sign == '+' || sign == '-')
 		str++;
 	
-	result = (long) strtoul(str, ptr, base);
+	result = (long) mystrtoul(str, ptr, base);
 	
 	/* Signal overflow if the result appears negative,
 	   except for the largest negative integer */
