diff options
Diffstat (limited to 'Mac/Python/macmain.c')
-rw-r--r-- | Mac/Python/macmain.c | 640 |
1 files changed, 0 insertions, 640 deletions
diff --git a/Mac/Python/macmain.c b/Mac/Python/macmain.c deleted file mode 100644 index d257142..0000000 --- a/Mac/Python/macmain.c +++ /dev/null @@ -1,640 +0,0 @@ -/*********************************************************** -Copyright 1991-1997 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 interpreter main program */ - -#include "Python.h" -#include "pythonresources.h" -#include "import.h" -#include "marshal.h" -#include "macglue.h" - -#ifdef WITHOUT_FRAMEWORKS -#include <Memory.h> -#include <Resources.h> -#include <stdio.h> -#include <Events.h> -#include <Windows.h> -#include <Fonts.h> -#include <Balloons.h> -#include <CFBundle.h> -#include <CFURL.h> -#include <CFString.h> -#include <CFBase.h> -#include <CFArray.h> -#include <Gestalt.h> -#include <Appearance.h> -#else -#include <Carbon/Carbon.h> -#endif /* WITHOUT_FRAMEWORKS */ - -#ifdef __MWERKS__ -#include <SIOUX.h> -#define USE_SIOUX -extern int ccommand(char ***); -#if __profile__ == 1 -#include <profiler.h> -#endif /* __profile__ */ -#endif /* __MWERKS__ */ - -#include <unistd.h> -#ifdef USE_MAC_SHARED_LIBRARY -extern PyMac_AddLibResources(void); -#endif - -#define STARTUP "PythonStartup" - -#define COPYRIGHT \ - "Type \"copyright\", \"credits\" or \"license\" for more information." - -short PyMac_AppRefNum; /* RefNum of application resource fork */ - -/* For Py_GetArgcArgv(); set by main() */ -static char **orig_argv; -static int orig_argc; - -/* A flag which remembers whether the user has acknowledged all the console -** output (by typing something) -*/ -#define STATE_UNKNOWN 0 -#define STATE_LASTREAD 1 -#define STATE_LASTWRITE 2 -int console_output_state = STATE_UNKNOWN; - -PyMac_PrefRecord PyMac_options; - -static void PyMac_Main(int, char **, char *); /* Forward */ -void PyMac_Exit(int); /* Forward */ - -/* Initialize the Mac toolbox world */ - -static void -init_mac_world(void) -{ - InitCursor(); -} - -/* -** PyMac_InteractiveOptions - Allow user to set options if option key is pressed -*/ -static void -PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp) -{ - KeyMap rmap; - unsigned char *map; - short item, type; - ControlHandle handle; - DialogPtr dialog; - Rect rect; - - /* - ** 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); \ - SetControlValue(handle, (short)p->var); - - SET_OPT_ITEM(OPT_INSPECT, inspect); - SET_OPT_ITEM(OPT_VERBOSE, verbose); - /* OPT_VERBOSEVERBOSE is default off */ - SET_OPT_ITEM(OPT_OPTIMIZE, optimize); - SET_OPT_ITEM(OPT_UNBUFFERED, unbuffered); - SET_OPT_ITEM(OPT_DEBUGGING, debugging); - GetDialogItem(dialog, OPT_KEEPALWAYS, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_ALWAYS)); - GetDialogItem(dialog, OPT_KEEPOUTPUT, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_OUTPUT)); - GetDialogItem(dialog, OPT_KEEPERROR, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_ERROR)); - GetDialogItem(dialog, OPT_KEEPNEVER, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_NEVER)); -/* SET_OPT_ITEM(OPT_KEEPCONSOLE, keep_console); */ - SET_OPT_ITEM(OPT_TABWARN, tabwarn); - SET_OPT_ITEM(OPT_NOSITE, nosite); - SET_OPT_ITEM(OPT_DIVISIONWARN, divisionwarn); - SET_OPT_ITEM(OPT_UNIXNEWLINES, unixnewlines); - /* 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 ) { - DisposeDialog(dialog); - exit(0); - } - if ( item == OPT_CMDLINE ) { - int old_argc = *argcp; - int i; - 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); \ - SetControlValue(handle, (short)p->var); \ - } - - OPT_ITEM(OPT_INSPECT, inspect); - OPT_ITEM(OPT_VERBOSE, verbose); - if ( item == OPT_VERBOSEVERBOSE ) { - if ( p->verbose == 2 ) - p->verbose = 1; - else - p->verbose = 2; - GetDialogItem(dialog, OPT_VERBOSE, &type, (Handle *)&handle, &rect); - SetControlValue(handle, 1); - } - GetDialogItem(dialog, OPT_VERBOSEVERBOSE, &type, (Handle *)&handle, &rect); - SetControlValue(handle, p->verbose == 2); - OPT_ITEM(OPT_OPTIMIZE, optimize); - OPT_ITEM(OPT_UNBUFFERED, unbuffered); - OPT_ITEM(OPT_DEBUGGING, debugging); - if ( item == OPT_KEEPALWAYS ) p->keep_console = POPT_KEEPCONSOLE_ALWAYS; - if ( item == OPT_KEEPOUTPUT ) p->keep_console = POPT_KEEPCONSOLE_OUTPUT; - if ( item == OPT_KEEPERROR ) p->keep_console = POPT_KEEPCONSOLE_ERROR; - if ( item == OPT_KEEPNEVER ) p->keep_console = POPT_KEEPCONSOLE_NEVER; - GetDialogItem(dialog, OPT_KEEPALWAYS, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_ALWAYS)); - GetDialogItem(dialog, OPT_KEEPOUTPUT, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_OUTPUT)); - GetDialogItem(dialog, OPT_KEEPERROR, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_ERROR)); - GetDialogItem(dialog, OPT_KEEPNEVER, &type, (Handle *)&handle, &rect); - SetControlValue(handle, (short)(p->keep_console == POPT_KEEPCONSOLE_NEVER)); - OPT_ITEM(OPT_TABWARN, tabwarn); - OPT_ITEM(OPT_NOSITE, nosite); - OPT_ITEM(OPT_DIVISIONWARN, divisionwarn); - OPT_ITEM(OPT_UNIXNEWLINES, unixnewlines); - -#undef OPT_ITEM - } - DisposeDialog(dialog); -} - -/* -** Initialization code, shared by interpreter and applets -*/ -static void -init_common(int *argcp, char ***argvp, int embedded) -{ - /* Remember resource fork refnum, for later */ - PyMac_AppRefNum = CurResFile(); - - /* Initialize toolboxes */ - init_mac_world(); - -#ifdef USE_MAC_SHARED_LIBRARY - /* Add the shared library to the stack of resource files */ - (void)PyMac_init_process_location(); - PyMac_AddLibResources(); -#endif - -#if defined(USE_GUSI) - atexit(PyMac_StopGUSISpin); -#endif - -#ifdef USE_SIOUX - /* Set various SIOUX flags. Some are changed later based on options */ - SIOUXSettings.asktosaveonclose = 0; - SIOUXSettings.showstatusline = 0; - SIOUXSettings.tabspaces = 4; -#endif - - /* Get options from preference file (or from applet resource fork) */ - PyMac_options.keep_console = POPT_KEEPCONSOLE_OUTPUT; /* default-default */ - PyMac_options.unixnewlines = 1; - PyMac_PreferenceOptions(&PyMac_options); - - if ( embedded ) { - static char *emb_argv[] = {"embedded-python", 0}; - - *argcp = 1; - *argvp = emb_argv; - } else { - /* Create argc/argv. Do it before we go into the options event loop. - ** In MachoPython we skip this step if we already have plausible - ** command line arguments. - */ - *argcp = PyMac_GetArgv(argvp, PyMac_options.noargs); -#ifndef NO_ARGV0_CHDIR - if (*argcp >= 1 && (*argvp)[0] && (*argvp)[0][0]) { - /* Workaround for MacOS X, which currently (DP4) doesn't set - ** the working folder correctly - */ - char app_wd[256], *p; - - strncpy(app_wd, (*argvp)[0], 256); - p = strrchr(app_wd, ':'); - if ( p ) *p = 0; - chdir(app_wd); - } -#endif - /* Do interactive option setting, if allowed and <option> depressed */ - PyMac_InteractiveOptions(&PyMac_options, argcp, argvp); - } - - /* Copy selected options to where the machine-independent stuff wants it */ - Py_VerboseFlag = PyMac_options.verbose; -/* Py_SuppressPrintingFlag = PyMac_options.suppress_print; */ - Py_OptimizeFlag = PyMac_options.optimize; - Py_DebugFlag = PyMac_options.debugging; - Py_NoSiteFlag = PyMac_options.nosite; - Py_TabcheckFlag = PyMac_options.tabwarn; - Py_DivisionWarningFlag = PyMac_options.divisionwarn; - if ( PyMac_options.noargs ) { - /* don't process events at all without the scripts permission */ - PyMacSchedParams scp; - - PyMac_GetSchedParams(&scp); - scp.process_events = 0; - /* Should we disable command-dot as well? */ - PyMac_SetSchedParams(&scp); - } - - /* Set buffering */ - if (PyMac_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 - } -#if __profile__ == 1 - /* collectSummary or collectDetailed, timebase, #routines, max stack depth */ - ProfilerInit(collectSummary, bestTimeBase, 8000, 250); -#endif - - /* Tell the rest of python about our argc/argv */ - orig_argc = *argcp; /* For Py_GetArgcArgv() */ - orig_argv = *argvp; - Py_SetProgramName((*argvp)[0]); -} - -/* -** Inspection mode after script/applet termination -*/ -static int -run_inspect(void) -{ - int sts = 0; - - if (PyMac_options.inspect && isatty((int)fileno(stdin))) - sts = PyRun_AnyFile(stdin, "<stdin>") != 0; - return sts; -} - -#ifdef USE_MAC_APPLET_SUPPORT -/* Applet support */ - -/* Run a compiled Python Python script from 'PYC ' resource __main__ */ -static int -run_main_resource(void) -{ - Handle h; - long size; - PyObject *code; - PyObject *result; - - h = GetNamedResource('PYC ', "\p__main__"); - if (h == NULL) { - Alert(NOPYC_ALERT, NULL); - return 1; - } - size = GetResourceSizeOnDisk(h); - HLock(h); - code = PyMarshal_ReadObjectFromString(*h + 8, (int)(size - 8)); - HUnlock(h); - ReleaseResource(h); - if (code == NULL) { - PyErr_Print(); - return 1; - } - result = PyImport_ExecCodeModule("__main__", code); - Py_DECREF(code); - if (result == NULL) { - PyErr_Print(); - return 1; - } - Py_DECREF(result); - return 0; -} - -/* Initialization sequence for applets */ -void -PyMac_InitApplet(void) -{ - int argc; - char **argv; - int err; - - init_common(&argc, &argv, 0); - - Py_Initialize(); - PySys_SetArgv(argc, argv); - - err = run_main_resource(); - - err = (run_inspect() || err); - - fflush(stderr); - fflush(stdout); - PyMac_Exit(err); - /* XXX Should we bother to Py_Exit(sts)? */ -} - -/* -** Hook for embedding python. -*/ -void -PyMac_Initialize(void) -{ - int argc; - char **argv; - - init_common(&argc, &argv, 1); - Py_Initialize(); - PySys_SetArgv(argc, argv); -} - -#endif /* USE_MAC_APPLET_SUPPORT */ - -/* For normal application */ -void -PyMac_InitApplication(void) -{ - int argc; - char **argv; - OSType filetype; - - static char scriptpath[1024]; - char *script = NULL; - - init_common(&argc, &argv, 0); - - if ( argc > 1 ) { - /* We're running a script. Attempt to change current directory */ - char curwd[256], *endp; - - strcpy(curwd, argv[1]); - endp = strrchr(curwd, ':'); - if ( endp && endp > curwd ) { - *endp = '\0'; - - chdir(curwd); - } - /* Check that the first argument is a text file */ - filetype = PyMac_getfiletype(argv[1]); - if ( filetype != 'TEXT' && filetype != 0 ) { - Alert(NOTASCRIPT_ID, NULL); - exit(0); - } - } - PyMac_Main(argc, argv, script); -} - -/* Main program */ - -static void -PyMac_Main(int argc, char **argv, char *filename) -{ - int sts; - char *command = NULL; - FILE *fp = stdin; - - if ( filename ) { - /* Someone else has found our "script" already */ - argv[0] = filename; - } else { - filename = argv[1]; - argv++; - argc--; - } - - if (Py_VerboseFlag || - (command == NULL && filename == NULL && isatty((int)fileno(fp)))) - fprintf(stderr, "%s %s on %s\n%s\n", - "Python", - Py_GetVersion(), Py_GetPlatform(), COPYRIGHT); - - if (filename != NULL) { - if ((fp = fopen(filename, "r" PY_STDIOTEXTMODE)) == NULL) { - fprintf(stderr, "%s: can't open file '%s'\n", - argv[0], filename); - PyMac_Exit(2); - } - } - - /* We initialize the menubar here, hoping SIOUX is initialized by now */ - PyMac_InitMenuBar(); - - Py_Initialize(); - -#if 0 - /* According to Martin v. Loewis this is a bad idea... */ - PyUnicode_SetDefaultEncoding(PyMac_getscript()); -#endif - - PySys_SetArgv(argc, argv); - - if (filename == NULL && isatty((int)fileno(fp))) { - FILE *fp = fopen(STARTUP, "r" PY_STDIOTEXTMODE); - if (fp != NULL) { - (void) PyRun_SimpleFile(fp, STARTUP); - PyErr_Clear(); - fclose(fp); - } - } - sts = PyRun_AnyFile( - fp, filename == NULL ? "<stdin>" : filename) != 0; - if (filename != NULL) - fclose(fp); - - if ( filename != NULL || command != NULL ) - sts = (run_inspect() || sts); - - Py_Exit(sts); - /*NOTREACHED*/ -} - -/* -** Reset the "unseen output" flag -*/ -void -PyMac_OutputSeen(void) -{ - if ( console_output_state == STATE_UNKNOWN ) - PyMac_InitMenuBar(); - console_output_state = STATE_LASTREAD; -} - -/* -** Set the "unseen output" flag -*/ -void -PyMac_OutputNotSeen(void) -{ - if ( console_output_state == STATE_UNKNOWN ) - PyMac_InitMenuBar(); - console_output_state = STATE_LASTWRITE; -} - -/* -** Override abort() - The default one is not what we want. -*/ -void -abort(void) -{ - console_output_state = STATE_LASTWRITE; - PyMac_Exit(1); -} - -/* -** Terminate application -*/ -void -PyMac_Exit(int status) -{ -#ifdef USE_SIOUX - int keep = 0; -#endif - -#if __profile__ == 1 - ProfilerDump("\pPython Profiler Results"); - ProfilerTerm(); -#endif - -#ifdef USE_SIOUX - switch (PyMac_options.keep_console) { - case POPT_KEEPCONSOLE_NEVER: - keep = 0; - break; - case POPT_KEEPCONSOLE_OUTPUT: - if (console_output_state == STATE_LASTWRITE || - console_output_state == STATE_UNKNOWN ) - keep = 1; - else - keep = 0; - break; - case POPT_KEEPCONSOLE_ERROR: - keep = (status != 0); - break; - default: - keep = 1; - } - if (keep) { - SIOUXSettings.standalone = 1; - SIOUXSettings.autocloseonquit = 0; - SIOUXSetTitle("\p\307terminated\310"); - PyMac_RaiseConsoleWindow(); - PyMac_RestoreMenuBar(); -#ifdef USE_MSL - /* - ** Temporary workaround: autocloseonquit clearing does not - ** currently work for the MSL/GUSI combo. - */ - while(getchar() > 0); -#endif - } - else - SIOUXSettings.autocloseonquit = 1; -#endif /* USE_SIOUX */ - - exit(status); -} - -/* Make the *original* argc/argv available to other modules. - This is rare, but it is needed by the secureware extension. */ - -void -Py_GetArgcArgv(int *argc,char ***argv) -{ - *argc = orig_argc; - *argv = orig_argv; -} - -/* More cruft that shouldn't really be here, used in sysmodule.c */ -/* Return the program name -- some code out there needs this. */ -char * -Py_GetProgramFullPath(void) -{ - return orig_argv[0]; -} - -char * -Py_GetPrefix(void) -{ - return PyMac_GetPythonDir(); -} - -char * -Py_GetExecPrefix(void) -{ - return PyMac_GetPythonDir(); -} - -int -PyMac_GetDelayConsoleFlag(void) -{ - return (int)PyMac_options.delayconsole; -} - |