"Compiling" version
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index f276fb4..5cc1d96 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -3,31 +3,31 @@
 /*
 Various bits of information used by the interpreter are collected in
 module 'sys'.
+Function member:
+- exit(sts): call (C, POSIX) exit(sts)
 Data members:
 - stdin, stdout, stderr: standard file objects
-- ps1, ps2: primary and secondary prompts (strings)
-- path: module search path (list of strings)
 - modules: the table of modules (dictionary)
-Function members:
-- exit(sts): call exit()
+- path: module search path (list of strings)
+- argv: script arguments (list of strings)
+- ps1, ps2: optional primary and secondary prompts (strings)
 */
 
-#include <stdio.h>
+#include "allobjects.h"
 
-#include "PROTO.h"
-#include "object.h"
-#include "stringobject.h"
-#include "listobject.h"
-#include "dictobject.h"
-#include "fileobject.h"
-#include "moduleobject.h"
 #include "sysmodule.h"
-#include "node.h" /* For context.h */
-#include "context.h" /* For import.h */
 #include "import.h"
-#include "methodobject.h"
 #include "modsupport.h"
-#include "errors.h"
+
+/* Define delimiter used in $PYTHONPATH */
+
+#ifdef THINK_C
+#define DELIM ' '
+#endif
+
+#ifndef DELIM
+#define DELIM ':'
+#endif
 
 static object *sysdict;
 
@@ -64,34 +64,6 @@
 }
 
 static object *
-makeargv(argc, argv)
-	int argc;
-	char **argv;
-{
-	int i;
-	object *av, *v;
-	if (argc < 0 || argv == NULL)
-		argc = 0;
-	av = newlistobject(argc);
-	if (av != NULL) {
-		for (i = 0; i < argc; i++) {
-			v = newstringobject(argv[i]);
-			if (v == NULL) {
-				DECREF(av);
-				av = NULL;
-				break;
-			}
-			setlistitem(av, i, v);
-		}
-	}
-	if (av == NULL)
-		fatal("no mem for sys.argv");
-	return av;
-}
-
-/* sys.exit method */
-
-static object *
 sys_exit(self, args)
 	object *self;
 	object *args;
@@ -104,88 +76,115 @@
 	/* NOTREACHED */
 }
 
+static struct methodlist sys_methods[] = {
+	{"exit",	sys_exit},
+	{NULL,		NULL}		/* sentinel */
+};
+
 static object *sysin, *sysout, *syserr;
 
 void
-initsys(argc, argv)
-	int argc;
-	char **argv;
+initsys()
 {
-	object *v;
-	object *exit;
-	if ((sysdict = newdictobject()) == NULL)
-		fatal("can't create sys dict");
+	object *m = initmodule("sys", sys_methods);
+	sysdict = getmoduledict(m);
+	INCREF(sysdict);
 	/* NB keep an extra ref to the std files to avoid closing them
 	   when the user deletes them */
+	/* XXX File objects should have a "don't close" flag instead */
 	sysin = newopenfileobject(stdin, "<stdin>", "r");
 	sysout = newopenfileobject(stdout, "<stdout>", "w");
 	syserr = newopenfileobject(stderr, "<stderr>", "w");
-	v = makeargv(argc, argv);
-	exit = newmethodobject("exit", sys_exit, (object *)NULL);
 	if (err_occurred())
-		fatal("can't create sys.* objects");
+		fatal("can't create sys.std* file objects");
 	dictinsert(sysdict, "stdin", sysin);
 	dictinsert(sysdict, "stdout", sysout);
 	dictinsert(sysdict, "stderr", syserr);
-	dictinsert(sysdict, "argv", v);
-	dictinsert(sysdict, "exit", exit);
+	dictinsert(sysdict, "modules", get_modules());
 	if (err_occurred())
 		fatal("can't insert sys.* objects in sys dict");
-	DECREF(exit);
-	DECREF(v);
-	/* The other symbols are added elsewhere */
-	
-	/* Only now can we initialize the import stuff, after which
-	   we can turn ourselves into a module */
-	initimport();
-	if ((v = new_module("sys")) == NULL)
-		fatal("can't create sys module");
-	if (setmoduledict(v, sysdict) != 0)
-		fatal("can't assign sys dict to sys module");
-	DECREF(v);
 }
 
-static void
-cleardict(d)
-	object *d;
+static object *
+makepathobject(path, delim)
+	char *path;
+	int delim;
 {
-	int i;
-	for (i = getdictsize(d); --i >= 0; ) {
-		char *k;
-		k = getdictkey(d, i);
-		if (k != NULL) {
-			(void) dictremove(d, k);
-		}
+	int i, n;
+	char *p;
+	object *v, *w;
+	
+	n = 1;
+	p = path;
+	while ((p = strchr(p, delim)) != NULL) {
+		n++;
+		p++;
 	}
+	v = newlistobject(n);
+	if (v == NULL)
+		return NULL;
+	for (i = 0; ; i++) {
+		p = strchr(path, delim);
+		if (p == NULL)
+			p = strchr(path, '\0'); /* End of string */
+		w = newsizedstringobject(path, (int) (p - path));
+		if (w == NULL) {
+			DECREF(v);
+			return NULL;
+		}
+		setlistitem(v, i, w);
+		if (*p == '\0')
+			break;
+		path = p+1;
+	}
+	return v;
 }
 
 void
-closesys()
+setpythonpath(path)
+	char *path;
 {
-	object *modules;
-	modules = sysget("modules");
-	if (modules != NULL && is_dictobject(modules)) {
+	object *v;
+	if ((v = makepathobject(path, DELIM)) == NULL)
+		fatal("can't create sys.path");
+	if (sysset("path", v) != 0)
+		fatal("can't assign sys.path");
+	DECREF(v);
+}
+
+static object *
+makeargvobject(argc, argv)
+	int argc;
+	char **argv;
+{
+	object *av;
+	if (argc < 0 || argv == NULL)
+		argc = 0;
+	av = newlistobject(argc);
+	if (av != NULL) {
 		int i;
-		/* Explicitly erase all modules; this is the safest way
-		   to get rid of at least *some* circular dependencies */
-		INCREF(modules);
-		for (i = getdictsize(modules); --i >= 0; ) {
-			char *k;
-			k = getdictkey(modules, i);
-			if (k != NULL) {
-				object *m;
-				m = dictlookup(modules, k);
-				if (m != NULL && is_moduleobject(m)) {
-					object *d;
-					d = getmoduledict(m);
-					if (d != NULL && is_dictobject(d)) {
-						cleardict(d);
-					}
-				}
+		for (i = 0; i < argc; i++) {
+			object *v = newstringobject(argv[i]);
+			if (v == NULL) {
+				DECREF(av);
+				av = NULL;
+				break;
 			}
+			setlistitem(av, i, v);
 		}
-		cleardict(modules);
-		DECREF(modules);
 	}
-	DECREF(sysdict);
+	return av;
+}
+
+void
+setpythonargv(argc, argv)
+	int argc;
+	char **argv;
+{
+	object *av = makeargvobject(argc, argv);
+	if (av == NULL)
+		fatal("no mem for sys.argv");
+	if (sysset("argv", av) != 0)
+		fatal("can't assign sys.argv");
+	DECREF(av);
 }