- Put all options in a struct
- Unified initialization code for interpreter and applet
- Implemented new options to skip AE-processing for argc/argv and for
  disabling interactive option setting
diff --git a/Mac/Python/macgetargv.c b/Mac/Python/macgetargv.c
index a06b100..e0ecb8e 100644
--- a/Mac/Python/macgetargv.c
+++ b/Mac/Python/macgetargv.c
@@ -295,16 +295,19 @@
 /* Get the argv vector, return argc */
 
 int
-PyMac_GetArgv(pargv)
+PyMac_GetArgv(pargv, noevents)
 	char ***pargv;
+	int noevents;
 {
 	
 	arg_count = 0;
 	arg_vector[arg_count++] = strdup(get_application_name());
 	
-	set_ae_handlers();
-	event_loop();
-	reset_ae_handlers();
+	if( !noevents ) {
+		set_ae_handlers();
+		event_loop();
+		reset_ae_handlers();
+	}
 	
 	arg_vector[arg_count] = NULL;
 	
diff --git a/Mac/Python/macgetpath.c b/Mac/Python/macgetpath.c
index 5c2cafd..466f073 100644
--- a/Mac/Python/macgetpath.c
+++ b/Mac/Python/macgetpath.c
@@ -310,9 +310,7 @@
 #endif /* !USE_BUILTIN_PATH */
 
 void
-PyMac_PreferenceOptions(int *inspect, int *verbose, int *suppress_print, 
-						 int *unbuffered, int *debugging, int *keep_normal,
-						 int *keep_error)
+PyMac_PreferenceOptions(PyMac_PrefRecord *pr)
 {
 	short oldrh, prefrh = -1;
 	Handle handle;
@@ -339,14 +337,15 @@
     size = GetHandleSize(handle);
     p = (char *)*handle;
     
-    if ( size > POPT_INSPECT ) *inspect = p[POPT_INSPECT];
-    if ( size > POPT_VERBOSE ) *verbose = p[POPT_VERBOSE];
-    if ( size > POPT_SUPPRESS ) *suppress_print = p[POPT_SUPPRESS];
-    if ( size > POPT_UNBUFFERED ) *unbuffered = p[POPT_UNBUFFERED];
-    if ( size > POPT_DEBUGGING ) *debugging = p[POPT_DEBUGGING];
-    if ( size > POPT_KEEPNORM ) *keep_normal = p[POPT_KEEPNORM];
-    if ( size > POPT_KEEPERR ) *keep_error = p[POPT_KEEPERR];
-    /* The rest are not implemented yet */
+    if ( size > POPT_INSPECT ) pr->inspect = p[POPT_INSPECT];
+    if ( size > POPT_VERBOSE ) pr->verbose = p[POPT_VERBOSE];
+    if ( size > POPT_SUPPRESS ) pr->suppress_print = p[POPT_SUPPRESS];
+    if ( size > POPT_UNBUFFERED ) pr->unbuffered = p[POPT_UNBUFFERED];
+    if ( size > POPT_DEBUGGING ) pr->debugging = p[POPT_DEBUGGING];
+    if ( size > POPT_KEEPNORM ) pr->keep_normal = p[POPT_KEEPNORM];
+    if ( size > POPT_KEEPERR ) pr->keep_error = p[POPT_KEEPERR];
+    if ( size > POPT_NOINTOPT ) pr->nointopt = p[POPT_NOINTOPT];
+    if ( size > POPT_NOARGS ) pr->noargs = p[POPT_NOARGS];
     
     HUnlock(handle);
 
diff --git a/Mac/Python/macglue.c b/Mac/Python/macglue.c
index 17bbff0..3df1a8a 100644
--- a/Mac/Python/macglue.c
+++ b/Mac/Python/macglue.c
@@ -178,9 +178,11 @@
 		return;
 }
 
-#ifdef __CFM68K__
+/*
+** SpinCursor (needed by GUSI) drags in heaps of stuff, so we
+** provide a dummy here.
+*/
 void SpinCursor(short x) { /* Dummy */ }
-#endif /* __CFM68K */
 
 /*
 ** Replacement GUSI Spin function
diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c
index 095673e..b464872 100644
--- a/Mac/Python/macmain.c
+++ b/Mac/Python/macmain.c
@@ -60,16 +60,15 @@
 extern char *Py_GetCopyright Py_PROTO((void));
 
 
-/* For Py_GetProgramName(); set by main() */
-static char *argv0;
+/* #define OBSOLETE_ARGCARGV 1		/* I think this is not needed anymore... */
 
+#ifdef OBSOLETE_ARGCARGV
 /* For Py_GetArgcArgv(); set by main() */
 static char **orig_argv;
 static int  orig_argc;
+#endif
 
-/* Flags indicating whether stdio window should stay open on termination */
-static int keep_normal;
-static int keep_error = 1;
+PyMac_PrefRecord options;
 
 static void Py_Main Py_PROTO((int, char **)); /* Forward */
 void PyMac_Exit Py_PROTO((int)); /* Forward */
@@ -93,10 +92,108 @@
 #endif
 }
 
-/* Initialization code shared by interpreter and applets */
-
+/*
+** PyMac_InteractiveOptions - Allow user to set options if option key is pressed
+*/
 static void
-init_common()
+PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp)
+{
+	KeyMap rmap;
+	unsigned char *map;
+	short item, type;
+	ControlHandle handle;
+	DialogPtr dialog;
+	Rect rect;
+	int old_argc = *argcp;
+	int i;
+
+	/*
+	** If the preferences disallows interactive options we return,
+	** similarly of <option> isn't pressed.
+	*/
+	if (p->nointopt) return;
+	
+	GetKeys(rmap);
+	map = (unsigned char *)rmap;
+	if ( ( map[0x3a>>3] & (1<<(0x3a&7)) ) == 0 )	/* option key is 3a */
+		return;
+
+	dialog = GetNewDialog(OPT_DIALOG, NULL, (WindowPtr)-1);
+	if ( dialog == NULL ) {
+		printf("Option dialog not found - cannot set options\n");
+		return;
+	}
+	SetDialogDefaultItem(dialog, OPT_OK);
+	SetDialogCancelItem(dialog, OPT_CANCEL);
+	
+	/* Set default values */
+#define SET_OPT_ITEM(num, var) \
+		GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
+		SetCtlValue(handle, (short)p->var);
+
+	SET_OPT_ITEM(OPT_INSPECT, inspect);
+	SET_OPT_ITEM(OPT_VERBOSE, verbose);
+	SET_OPT_ITEM(OPT_SUPPRESS, suppress_print);
+	SET_OPT_ITEM(OPT_UNBUFFERED, unbuffered);
+	SET_OPT_ITEM(OPT_DEBUGGING, debugging);
+	SET_OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
+	SET_OPT_ITEM(OPT_KEEPERROR, keep_error);
+	/* The rest are not settable interactively */
+
+#undef SET_OPT_ITEM
+	
+	while (1) {
+		handle = NULL;
+		ModalDialog(NULL, &item);
+		if ( item == OPT_OK )
+			break;
+		if ( item == OPT_CANCEL ) {
+			DisposDialog(dialog);
+			exit(0);
+		}
+		if ( item == OPT_CMDLINE ) {
+			int new_argc, newer_argc;
+			char **new_argv, **newer_argv;
+			
+			new_argc = ccommand(&new_argv);
+			newer_argc = (new_argc-1) + old_argc;
+			newer_argv = malloc((newer_argc+1)*sizeof(char *));
+			if( !newer_argv )
+				Py_FatalError("Cannot malloc argv\n");
+			for(i=0; i<old_argc; i++)
+				newer_argv[i] = (*argvp)[i];
+			for(i=old_argc; i<=newer_argc; i++) /* Copy the NULL too */
+				newer_argv[i] = new_argv[i-old_argc+1];
+			*argvp = newer_argv;
+			*argcp = newer_argc;
+			
+			/* XXXX Is it not safe to use free() here, apparently */
+		}
+#define OPT_ITEM(num, var) \
+		if ( item == (num) ) { \
+			p->var = !p->var; \
+			GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
+			SetCtlValue(handle, (short)p->var); \
+		}
+		
+		OPT_ITEM(OPT_INSPECT, inspect);
+		OPT_ITEM(OPT_VERBOSE, verbose);
+		OPT_ITEM(OPT_SUPPRESS, suppress_print);
+		OPT_ITEM(OPT_UNBUFFERED, unbuffered);
+		OPT_ITEM(OPT_DEBUGGING, debugging);
+		OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
+		OPT_ITEM(OPT_KEEPERROR, keep_error);
+		
+#undef OPT_ITEM
+	}
+	DisposDialog(dialog);
+}
+
+/*
+** Initialization code, shared by interpreter and applets
+*/
+static void
+init_common(int *argcp, char ***argvp)
 {
 	/* Remember resource fork refnum, for later */
 	PyMac_AppRefNum = CurResFile();
@@ -123,8 +220,48 @@
 	SIOUXSettings.tabspaces = 4;
 #endif
 
+	/* Get options from preference file (or from applet resource fork) */
+	options.keep_error = 1;		/* default-default */
+	PyMac_PreferenceOptions(&options);
+	
+	/* Create argc/argv. Do it before we go into the options event loop. */
+	*argcp = PyMac_GetArgv(argvp, options.noargs);
+	
+	/* Do interactive option setting, if allowed and <option> depressed */
+	PyMac_InteractiveOptions(&options, argcp, argvp);
+	
+	/* Copy selected options to where the machine-independent stuff wants it */
+	Py_VerboseFlag = options.verbose;
+	Py_SuppressPrintingFlag = options.suppress_print;
+	Py_DebugFlag = options.debugging;
+	if ( options.noargs )
+		PyMac_DoYieldEnabled = 0;
+
+	/* Set buffering */
+	if (options.unbuffered) {
+#ifndef MPW
+		setbuf(stdout, (char *)NULL);
+		setbuf(stderr, (char *)NULL);
+#else
+		/* On MPW (3.2) unbuffered seems to hang */
+		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
+		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
+#endif
+	}
 }
 
+/*
+** Inspection mode after script/applet termination
+*/
+static int
+run_inspect()
+{
+	int sts = 0;
+	
+	if (options.inspect && isatty((int)fileno(stdin)))
+		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
+	return sts;
+}
 
 #ifdef USE_MAC_APPLET_SUPPORT
 /* Applet support */
@@ -170,11 +307,15 @@
 	char **argv;
 	int err;
 
-	init_common();
-	argc = PyMac_GetArgv(&argv);
+	init_common(&argc, &argv);
+	
 	Py_Initialize();
 	PySys_SetArgv(argc, argv);
+	
 	err = run_main_resource();
+	
+	err = (run_inspect() || err);
+	
 	fflush(stderr);
 	fflush(stdout);
 	PyMac_Exit(err);
@@ -190,8 +331,8 @@
 	int argc;
 	char **argv;
 	
-	init_common();
-	argc = PyMac_GetArgv(&argv);
+	init_common(&argc, &argv);
+	
 	if ( argc > 1 ) {
 		/* We're running a script. Attempt to change current directory */
 		char curwd[256], *endp;
@@ -211,103 +352,6 @@
 	Py_Main(argc, argv);
 }
 
-/*
-** PyMac_InteractiveOptions - Allow user to set options if option key is pressed
-*/
-void
-PyMac_InteractiveOptions(int *inspect, int *verbose, int *suppress_print, 
-						 int *unbuffered, int *debugging, int *keep_normal,
-						 int *keep_error, int *argcp, char ***argvp)
-{
-	KeyMap rmap;
-	unsigned char *map;
-	short item, type;
-	ControlHandle handle;
-	DialogPtr dialog;
-	Rect rect;
-	int old_argc = *argcp;
-	int i;
-	
-	/* Default-defaults: */
-	*keep_error = 1;
-	/* Get default settings from our preference file */
-	PyMac_PreferenceOptions(inspect, verbose, suppress_print,
-			unbuffered, debugging, keep_normal, keep_error);
-	/* If option is pressed override these */
-	GetKeys(rmap);
-	map = (unsigned char *)rmap;
-	if ( ( map[0x3a>>3] & (1<<(0x3a&7)) ) == 0 )	/* option key is 3a */
-		return;
-
-	dialog = GetNewDialog(OPT_DIALOG, NULL, (WindowPtr)-1);
-	if ( dialog == NULL ) {
-		printf("Option dialog not found - cannot set options\n");
-		return;
-	}
-	SetDialogDefaultItem(dialog, OPT_OK);
-	SetDialogCancelItem(dialog, OPT_CANCEL);
-	
-	/* Set default values */
-#define SET_OPT_ITEM(num, var) \
-		GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
-		SetCtlValue(handle, (short)*(var));
-
-	SET_OPT_ITEM(OPT_INSPECT, inspect);
-	SET_OPT_ITEM(OPT_VERBOSE, verbose);
-	SET_OPT_ITEM(OPT_SUPPRESS, suppress_print);
-	SET_OPT_ITEM(OPT_UNBUFFERED, unbuffered);
-	SET_OPT_ITEM(OPT_DEBUGGING, debugging);
-	SET_OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
-	SET_OPT_ITEM(OPT_KEEPERROR, keep_error);
-
-#undef SET_OPT_ITEM
-	
-	while (1) {
-		handle = NULL;
-		ModalDialog(NULL, &item);
-		if ( item == OPT_OK )
-			break;
-		if ( item == OPT_CANCEL ) {
-			DisposDialog(dialog);
-			exit(0);
-		}
-		if ( item == OPT_CMDLINE ) {
-			int new_argc, newer_argc;
-			char **new_argv, **newer_argv;
-			
-			new_argc = ccommand(&new_argv);
-			newer_argc = (new_argc-1) + old_argc;
-			newer_argv = malloc((newer_argc+1)*sizeof(char *));
-			if( !newer_argv )
-				Py_FatalError("Cannot malloc argv\n");
-			for(i=0; i<old_argc; i++)
-				newer_argv[i] = (*argvp)[i];
-			for(i=old_argc; i<=newer_argc; i++) /* Copy the NULL too */
-				newer_argv[i] = new_argv[i-old_argc+1];
-			*argvp = newer_argv;
-			*argcp = newer_argc;
-			
-			/* XXXX Is it not safe to use free() here, apparently */
-		}
-#define OPT_ITEM(num, var) \
-		if ( item == (num) ) { \
-			*(var) = !*(var); \
-			GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
-			SetCtlValue(handle, (short)*(var)); \
-		}
-		
-		OPT_ITEM(OPT_INSPECT, inspect);
-		OPT_ITEM(OPT_VERBOSE, verbose);
-		OPT_ITEM(OPT_SUPPRESS, suppress_print);
-		OPT_ITEM(OPT_UNBUFFERED, unbuffered);
-		OPT_ITEM(OPT_DEBUGGING, debugging);
-		OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
-		OPT_ITEM(OPT_KEEPERROR, keep_error);
-		
-#undef OPT_ITEM
-	}
-	DisposDialog(dialog);
-}
 /* Main program */
 
 static void
@@ -319,27 +363,11 @@
 	char *command = NULL;
 	char *filename = NULL;
 	FILE *fp = stdin;
-	int inspect = 0;
-	int unbuffered = 0;
 
-	PyMac_InteractiveOptions(&inspect, &Py_VerboseFlag, &Py_SuppressPrintingFlag,
-			&unbuffered, &Py_DebugFlag, &keep_normal, &keep_error, &argc, &argv);
-
+#ifdef OBSOLETE_ARGCARGV
 	orig_argc = argc;	/* For Py_GetArgcArgv() */
 	orig_argv = argv;
-	argv0 = argv[0];	/* For Py_GetProgramName() */
-
-	if (unbuffered) {
-#ifndef MPW
-		setbuf(stdout, (char *)NULL);
-		setbuf(stderr, (char *)NULL);
-#else
-		/* On MPW (3.2) unbuffered seems to hang */
-		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
-		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
 #endif
-	}
-
 	filename = argv[1];
 
 	if (Py_VerboseFlag ||
@@ -355,10 +383,7 @@
 		}
 	}
 	
-	/*
-	** For reasons I don't fully understand we cannot insert our
-	** menu earlier. Leave it here, we hope to be rid of Sioux soon anyway.
-	*/
+	/* We initialize the menubar here, hoping SIOUX is initialized by now */
 	PyMac_InitMenuBar();
 	
 	Py_Initialize();
@@ -377,10 +402,9 @@
 			fp, filename == NULL ? "<stdin>" : filename) != 0;
 	if (filename != NULL)
 		fclose(fp);
-
-	if (inspect && isatty((int)fileno(stdin)) &&
-	    (filename != NULL || command != NULL))
-		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
+		
+	if ( filename != NULL || command != NULL )
+		sts = (run_inspect() || sts);
 
 	Py_Exit(sts);
 	/*NOTREACHED*/
@@ -396,9 +420,9 @@
 	int keep;
 	
 	if ( status )
-		keep = keep_error;
+		keep = options.keep_error;
 	else
-		keep = keep_normal;
+		keep = options.keep_normal;
 		
 #ifdef USE_SIOUX
 	if (keep) {
@@ -423,12 +447,13 @@
 	exit(status);
 }
 
+#ifdef OBSOLETE_ARGCARGV
 /* Return the program name -- some code out there needs this. */
 
 char *
 Py_GetProgramName()
 {
-	return argv0;
+	return orig_argv[0];
 }
 
 
@@ -443,6 +468,7 @@
 	*argc = orig_argc;
 	*argv = orig_argv;
 }
+#endif /* OBSOLETE_ARGCARGV */
 
 /* More cruft that shouldn't really be here, used in sysmodule.c */