blob: 8b2a1fd67c9034f6da1780ee7942ff52fb17713e [file] [log] [blame]
Guido van Rossumb0f3c821994-08-23 13:34:25 +00001/***********************************************************
Jack Jansen42218ce1997-01-31 16:15:11 +00002Copyright 1991-1997 by Stichting Mathematisch Centrum, Amsterdam,
Guido van Rossum99546991995-01-08 14:33:34 +00003The Netherlands.
Guido van Rossumb0f3c821994-08-23 13:34:25 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Jack Jansen696c9581995-08-14 12:33:20 +000025/* Python interpreter main program */
Guido van Rossumb0f3c821994-08-23 13:34:25 +000026
Jack Jansen696c9581995-08-14 12:33:20 +000027#include "Python.h"
28#include "pythonresources.h"
29#include "import.h"
30#include "marshal.h"
Jack Jansenf6865f71996-09-04 15:24:59 +000031#include "macglue.h"
Guido van Rossumb0f3c821994-08-23 13:34:25 +000032
Jack Jansen696c9581995-08-14 12:33:20 +000033#include <Memory.h>
34#include <Resources.h>
Guido van Rossumb0f3c821994-08-23 13:34:25 +000035#include <stdio.h>
Jack Jansen696c9581995-08-14 12:33:20 +000036#include <Events.h>
37#include <Windows.h>
Jack Jansen2429c721996-03-07 15:17:11 +000038#include <Fonts.h>
Jack Jansen36b983c1997-09-09 13:53:21 +000039#include <Balloons.h>
Jack Jansen8f5725a1999-12-07 23:08:10 +000040#ifdef USE_APPEARANCE
41#include <Gestalt.h>
42#include <Appearance.h>
43#endif /* USE_APPEARANCE */
Jack Jansenc76fd391995-02-02 14:27:31 +000044#ifdef __MWERKS__
45#include <SIOUX.h>
Jack Jansen1e8557a1995-11-10 14:51:26 +000046#define USE_SIOUX
Jack Jansen8c693211997-01-07 16:19:42 +000047#if __profile__ == 1
48#include <profiler.h>
49#endif
Jack Jansenc76fd391995-02-02 14:27:31 +000050#endif
Jack Jansenee6eeb12000-06-02 21:28:52 +000051#include <unistd.h>
Jack Jansenc76fd391995-02-02 14:27:31 +000052
Jack Jansen696c9581995-08-14 12:33:20 +000053#define STARTUP "PythonStartup"
Jack Jansenbac428d1994-12-14 13:47:30 +000054
Jack Jansen696c9581995-08-14 12:33:20 +000055extern int Py_DebugFlag; /* For parser.c, declared in pythonrun.c */
56extern int Py_VerboseFlag; /* For import.c, declared in pythonrun.c */
Jack Jansen3f7d2b41996-09-06 22:21:07 +000057short PyMac_AppRefNum; /* RefNum of application resource fork */
Jack Jansen696c9581995-08-14 12:33:20 +000058
Jack Jansen1d2f8631996-08-02 15:16:16 +000059/* For Py_GetArgcArgv(); set by main() */
Jack Jansen696c9581995-08-14 12:33:20 +000060static char **orig_argv;
61static int orig_argc;
62
Jack Jansen7d5f9e81996-09-07 17:09:31 +000063PyMac_PrefRecord options;
Jack Jansen0168f271995-10-27 13:32:30 +000064
Jack Jansend88296d2000-07-11 19:51:05 +000065static void Py_Main(int, char **); /* Forward */
66void PyMac_Exit(int); /* Forward */
Jack Jansen76ceece1996-08-19 11:18:24 +000067
Jack Jansen8f5725a1999-12-07 23:08:10 +000068static void init_appearance()
69{
70#ifdef USE_APPEARANCE
71 OSErr err;
72 SInt32 response;
73
74 err = Gestalt(gestaltAppearanceAttr,&response);
75 if ( err ) goto no_appearance;
76 if ( !(response&(1<<gestaltAppearanceExists)) ) goto no_appearance;
77 /* XXXX Should we check the version? Compat-mode? */
78 PyMac_AppearanceCompliant = 1;
79no_appearance:
80 return;
81#endif /* USE_APPEARANCE */
82}
Jack Jansen01fbc681996-02-28 15:42:47 +000083/* Initialize the Mac toolbox world */
84
85static void
86init_mac_world()
87{
Jack Jansenee6eeb12000-06-02 21:28:52 +000088#ifndef TARGET_API_MAC_CARBON
89 /* These aren't needed for carbon */
Jack Jansen01fbc681996-02-28 15:42:47 +000090 MaxApplZone();
91 InitGraf(&qd.thePort);
92 InitFonts();
93 InitWindows();
94 TEInit();
95 InitDialogs((long)0);
96 InitMenus();
Jack Jansenee6eeb12000-06-02 21:28:52 +000097#endif
Jack Jansen01fbc681996-02-28 15:42:47 +000098 InitCursor();
Jack Jansen8f5725a1999-12-07 23:08:10 +000099 init_appearance();
Jack Jansen01fbc681996-02-28 15:42:47 +0000100}
101
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000102/*
103** PyMac_InteractiveOptions - Allow user to set options if option key is pressed
104*/
Jack Jansen01fbc681996-02-28 15:42:47 +0000105static void
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000106PyMac_InteractiveOptions(PyMac_PrefRecord *p, int *argcp, char ***argvp)
107{
108 KeyMap rmap;
109 unsigned char *map;
110 short item, type;
111 ControlHandle handle;
112 DialogPtr dialog;
113 Rect rect;
114 int old_argc = *argcp;
115 int i;
116
117 /*
118 ** If the preferences disallows interactive options we return,
119 ** similarly of <option> isn't pressed.
120 */
121 if (p->nointopt) return;
122
123 GetKeys(rmap);
124 map = (unsigned char *)rmap;
125 if ( ( map[0x3a>>3] & (1<<(0x3a&7)) ) == 0 ) /* option key is 3a */
126 return;
127
128 dialog = GetNewDialog(OPT_DIALOG, NULL, (WindowPtr)-1);
129 if ( dialog == NULL ) {
130 printf("Option dialog not found - cannot set options\n");
131 return;
132 }
133 SetDialogDefaultItem(dialog, OPT_OK);
134 SetDialogCancelItem(dialog, OPT_CANCEL);
135
136 /* Set default values */
137#define SET_OPT_ITEM(num, var) \
138 GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
Jack Jansen08c3be31997-04-08 15:27:00 +0000139 SetControlValue(handle, (short)p->var);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000140
141 SET_OPT_ITEM(OPT_INSPECT, inspect);
142 SET_OPT_ITEM(OPT_VERBOSE, verbose);
Jack Jansen36b983c1997-09-09 13:53:21 +0000143 SET_OPT_ITEM(OPT_OPTIMIZE, optimize);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000144 SET_OPT_ITEM(OPT_UNBUFFERED, unbuffered);
145 SET_OPT_ITEM(OPT_DEBUGGING, debugging);
146 SET_OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
147 SET_OPT_ITEM(OPT_KEEPERROR, keep_error);
Jack Jansen0c6d0372000-05-05 23:11:14 +0000148 SET_OPT_ITEM(OPT_TABWARN, tabwarn);
Jack Jansen36b983c1997-09-09 13:53:21 +0000149 SET_OPT_ITEM(OPT_NOSITE, nosite);
Jack Jansen0c6d0372000-05-05 23:11:14 +0000150 SET_OPT_ITEM(OPT_NONAVSERV, nonavservice);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000151 /* The rest are not settable interactively */
152
153#undef SET_OPT_ITEM
154
155 while (1) {
156 handle = NULL;
157 ModalDialog(NULL, &item);
158 if ( item == OPT_OK )
159 break;
160 if ( item == OPT_CANCEL ) {
Jack Jansen08c3be31997-04-08 15:27:00 +0000161 DisposeDialog(dialog);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000162 exit(0);
163 }
Jack Jansenee6eeb12000-06-02 21:28:52 +0000164#ifndef TARGET_API_MAC_CARBON
Jack Jansen36b983c1997-09-09 13:53:21 +0000165 if ( item == OPT_HELP ) {
166 HMSetBalloons(!HMGetBalloons());
167 }
Jack Jansenee6eeb12000-06-02 21:28:52 +0000168#endif
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000169 if ( item == OPT_CMDLINE ) {
170 int new_argc, newer_argc;
171 char **new_argv, **newer_argv;
172
173 new_argc = ccommand(&new_argv);
174 newer_argc = (new_argc-1) + old_argc;
175 newer_argv = malloc((newer_argc+1)*sizeof(char *));
176 if( !newer_argv )
177 Py_FatalError("Cannot malloc argv\n");
178 for(i=0; i<old_argc; i++)
179 newer_argv[i] = (*argvp)[i];
180 for(i=old_argc; i<=newer_argc; i++) /* Copy the NULL too */
181 newer_argv[i] = new_argv[i-old_argc+1];
182 *argvp = newer_argv;
183 *argcp = newer_argc;
184
185 /* XXXX Is it not safe to use free() here, apparently */
186 }
187#define OPT_ITEM(num, var) \
188 if ( item == (num) ) { \
189 p->var = !p->var; \
190 GetDialogItem(dialog, (num), &type, (Handle *)&handle, &rect); \
Jack Jansen08c3be31997-04-08 15:27:00 +0000191 SetControlValue(handle, (short)p->var); \
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000192 }
193
194 OPT_ITEM(OPT_INSPECT, inspect);
195 OPT_ITEM(OPT_VERBOSE, verbose);
Jack Jansen36b983c1997-09-09 13:53:21 +0000196 OPT_ITEM(OPT_OPTIMIZE, optimize);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000197 OPT_ITEM(OPT_UNBUFFERED, unbuffered);
198 OPT_ITEM(OPT_DEBUGGING, debugging);
199 OPT_ITEM(OPT_KEEPNORMAL, keep_normal);
200 OPT_ITEM(OPT_KEEPERROR, keep_error);
Jack Jansen0c6d0372000-05-05 23:11:14 +0000201 OPT_ITEM(OPT_TABWARN, tabwarn);
Jack Jansen36b983c1997-09-09 13:53:21 +0000202 OPT_ITEM(OPT_NOSITE, nosite);
Jack Jansen0c6d0372000-05-05 23:11:14 +0000203 OPT_ITEM(OPT_NONAVSERV, nonavservice);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000204
205#undef OPT_ITEM
206 }
Jack Jansen08c3be31997-04-08 15:27:00 +0000207 DisposeDialog(dialog);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000208}
209
210/*
211** Initialization code, shared by interpreter and applets
212*/
213static void
Jack Jansen52ac0371997-01-15 15:49:08 +0000214init_common(int *argcp, char ***argvp, int embedded)
Jack Jansen01fbc681996-02-28 15:42:47 +0000215{
Jack Jansen3f7d2b41996-09-06 22:21:07 +0000216 /* Remember resource fork refnum, for later */
217 PyMac_AppRefNum = CurResFile();
218
Jack Jansen01fbc681996-02-28 15:42:47 +0000219 /* Initialize toolboxes */
220 init_mac_world();
221
222#ifdef USE_MAC_SHARED_LIBRARY
223 /* Add the shared library to the stack of resource files */
Jack Jansen87c485c1998-07-31 09:38:01 +0000224 (void)PyMac_init_process_location();
Jack Jansen01fbc681996-02-28 15:42:47 +0000225 PyMac_AddLibResources();
226#endif
227
Jack Jansen2d1306b2000-04-07 09:10:49 +0000228#if defined(USE_GUSI1)
Jack Jansen01fbc681996-02-28 15:42:47 +0000229 /* Setup GUSI */
230 GUSIDefaultSetup();
Jack Jansenf6865f71996-09-04 15:24:59 +0000231 PyMac_SetGUSISpin();
Jack Jansen3f7d2b41996-09-06 22:21:07 +0000232 PyMac_SetGUSIOptions();
Jack Jansen01fbc681996-02-28 15:42:47 +0000233#endif
Jack Jansen2d1306b2000-04-07 09:10:49 +0000234#if defined(USE_GUSI)
235 atexit(PyMac_StopGUSISpin);
236#endif
Jack Jansen01fbc681996-02-28 15:42:47 +0000237
238#ifdef USE_SIOUX
239 /* Set various SIOUX flags. Some are changed later based on options */
Jack Jansencaa7c461997-06-12 10:49:13 +0000240/* SIOUXSettings.standalone = 0; /* XXXX Attempting to keep sioux from eating events */
Jack Jansen01fbc681996-02-28 15:42:47 +0000241 SIOUXSettings.asktosaveonclose = 0;
242 SIOUXSettings.showstatusline = 0;
243 SIOUXSettings.tabspaces = 4;
244#endif
245
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000246 /* Get options from preference file (or from applet resource fork) */
247 options.keep_error = 1; /* default-default */
248 PyMac_PreferenceOptions(&options);
249
Jack Jansen52ac0371997-01-15 15:49:08 +0000250 if ( embedded ) {
251 static char *emb_argv[] = {"embedded-python", 0};
252
253 *argcp = 1;
254 *argvp = emb_argv;
255 } else {
256 /* Create argc/argv. Do it before we go into the options event loop. */
257 *argcp = PyMac_GetArgv(argvp, options.noargs);
258
259 /* Do interactive option setting, if allowed and <option> depressed */
260 PyMac_InteractiveOptions(&options, argcp, argvp);
261 }
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000262
263 /* Copy selected options to where the machine-independent stuff wants it */
264 Py_VerboseFlag = options.verbose;
Jack Jansen7330b391997-08-08 14:56:41 +0000265/* Py_SuppressPrintingFlag = options.suppress_print; */
Jack Jansen36b983c1997-09-09 13:53:21 +0000266 Py_OptimizeFlag = options.optimize;
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000267 Py_DebugFlag = options.debugging;
Jack Jansena7a89eb1997-10-07 21:48:57 +0000268 Py_NoSiteFlag = options.nosite;
Jack Jansen0c6d0372000-05-05 23:11:14 +0000269 Py_TabcheckFlag = options.tabwarn;
Jack Jansene3ae0df1997-06-03 15:28:29 +0000270 if ( options.noargs ) {
271 /* don't process events at all without the scripts permission */
272 PyMacSchedParams scp;
273
274 PyMac_GetSchedParams(&scp);
275 scp.process_events = 0;
276 /* Should we disable command-dot as well? */
277 PyMac_SetSchedParams(&scp);
278 }
Jack Jansen36b983c1997-09-09 13:53:21 +0000279 /* XXXX dispatch oldexc and nosite */
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000280
281 /* Set buffering */
282 if (options.unbuffered) {
283#ifndef MPW
284 setbuf(stdout, (char *)NULL);
285 setbuf(stderr, (char *)NULL);
286#else
287 /* On MPW (3.2) unbuffered seems to hang */
288 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
289 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
290#endif
291 }
Jack Jansen8c693211997-01-07 16:19:42 +0000292#if __profile__ == 1
293 /* collectSummary or collectDetailed, timebase, #routines, max stack depth */
Jack Jansene7424871999-09-30 11:20:11 +0000294 ProfilerInit(collectSummary, bestTimeBase, 8000, 250);
Jack Jansen8c693211997-01-07 16:19:42 +0000295#endif
Jack Jansen7330b391997-08-08 14:56:41 +0000296
297 /* Tell the rest of python about our argc/argv */
298 orig_argc = *argcp; /* For Py_GetArgcArgv() */
299 orig_argv = *argvp;
300 Py_SetProgramName((*argvp)[0]);
Jack Jansen01fbc681996-02-28 15:42:47 +0000301}
302
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000303/*
304** Inspection mode after script/applet termination
305*/
306static int
307run_inspect()
308{
309 int sts = 0;
310
311 if (options.inspect && isatty((int)fileno(stdin)))
312 sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
313 return sts;
314}
Jack Jansen01fbc681996-02-28 15:42:47 +0000315
Jack Jansen0c6d0372000-05-05 23:11:14 +0000316/*
317** Import the macfsn module, which will override the Standard File
318** calls in the macfs builtin module by Navigation Services versions,
319** if available on this machine.
320*/
321static void
322PyMac_InstallNavServicesForSF()
323{
324 if ( !options.nonavservice ) {
325 PyObject *m = PyImport_ImportModule("macfsn");
326
327 if ( m == NULL ) {
328 PySys_WriteStderr("'import macfsn' failed; ");
329 if (Py_VerboseFlag) {
330 PySys_WriteStderr("traceback:\n");
331 PyErr_Print();
332 }
333 else {
334 PySys_WriteStderr("use -v for traceback\n");
335 }
336 }
337 }
338}
339
Jack Jansen696c9581995-08-14 12:33:20 +0000340#ifdef USE_MAC_APPLET_SUPPORT
341/* Applet support */
342
343/* Run a compiled Python Python script from 'PYC ' resource __main__ */
344static int
345run_main_resource()
346{
347 Handle h;
348 long size;
349 PyObject *code;
350 PyObject *result;
351
352 h = GetNamedResource('PYC ', "\p__main__");
353 if (h == NULL) {
354 Alert(NOPYC_ALERT, NULL);
355 return 1;
356 }
357 size = GetResourceSizeOnDisk(h);
358 HLock(h);
359 code = PyMarshal_ReadObjectFromString(*h + 8, (int)(size - 8));
360 HUnlock(h);
361 ReleaseResource(h);
362 if (code == NULL) {
363 PyErr_Print();
364 return 1;
365 }
366 result = PyImport_ExecCodeModule("__main__", code);
367 Py_DECREF(code);
368 if (result == NULL) {
369 PyErr_Print();
370 return 1;
371 }
372 Py_DECREF(result);
373 return 0;
374}
375
376/* Initialization sequence for applets */
377void
378PyMac_InitApplet()
379{
Guido van Rossumb0f3c821994-08-23 13:34:25 +0000380 int argc;
381 char **argv;
Jack Jansen696c9581995-08-14 12:33:20 +0000382 int err;
383
Jack Jansen52ac0371997-01-15 15:49:08 +0000384 init_common(&argc, &argv, 0);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000385
Jack Jansen696c9581995-08-14 12:33:20 +0000386 Py_Initialize();
Jack Jansen0c6d0372000-05-05 23:11:14 +0000387 PyMac_InstallNavServicesForSF();
Jack Jansen696c9581995-08-14 12:33:20 +0000388 PySys_SetArgv(argc, argv);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000389
Jack Jansen696c9581995-08-14 12:33:20 +0000390 err = run_main_resource();
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000391
392 err = (run_inspect() || err);
393
Jack Jansen696c9581995-08-14 12:33:20 +0000394 fflush(stderr);
395 fflush(stdout);
Jack Jansen0168f271995-10-27 13:32:30 +0000396 PyMac_Exit(err);
Jack Jansen696c9581995-08-14 12:33:20 +0000397 /* XXX Should we bother to Py_Exit(sts)? */
398}
399
Jack Jansen52ac0371997-01-15 15:49:08 +0000400/*
401** Hook for embedding python.
402*/
403void
404PyMac_Initialize()
405{
406 int argc;
407 char **argv;
408
409 init_common(&argc, &argv, 1);
410 Py_Initialize();
Jack Jansen0c6d0372000-05-05 23:11:14 +0000411 PyMac_InstallNavServicesForSF();
Jack Jansen52ac0371997-01-15 15:49:08 +0000412 PySys_SetArgv(argc, argv);
413}
414
Jack Jansen696c9581995-08-14 12:33:20 +0000415#endif /* USE_MAC_APPLET_SUPPORT */
416
417/* For normal application */
418void
419PyMac_InitApplication()
420{
421 int argc;
422 char **argv;
423
Jack Jansen52ac0371997-01-15 15:49:08 +0000424 init_common(&argc, &argv, 0);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000425
Jack Jansen696c9581995-08-14 12:33:20 +0000426 if ( argc > 1 ) {
427 /* We're running a script. Attempt to change current directory */
428 char curwd[256], *endp;
429
430 strcpy(curwd, argv[1]);
431 endp = strrchr(curwd, ':');
432 if ( endp && endp > curwd ) {
433 *endp = '\0';
434
435 chdir(curwd);
Jack Jansen2d1306b2000-04-07 09:10:49 +0000436#ifdef USE_GUSI1
Jack Jansen378815c1996-03-06 16:21:34 +0000437 /* Change MacOS's idea of wd too */
438 PyMac_FixGUSIcd();
439#endif
Jack Jansen696c9581995-08-14 12:33:20 +0000440 }
441 }
442 Py_Main(argc, argv);
443}
444
Jack Jansen696c9581995-08-14 12:33:20 +0000445/* Main program */
446
Jack Jansen76ceece1996-08-19 11:18:24 +0000447static void
Jack Jansen696c9581995-08-14 12:33:20 +0000448Py_Main(argc, argv)
449 int argc;
450 char **argv;
451{
Jack Jansen696c9581995-08-14 12:33:20 +0000452 int sts;
453 char *command = NULL;
454 char *filename = NULL;
455 FILE *fp = stdin;
Jack Jansen696c9581995-08-14 12:33:20 +0000456
Jack Jansen696c9581995-08-14 12:33:20 +0000457 filename = argv[1];
458
459 if (Py_VerboseFlag ||
460 command == NULL && filename == NULL && isatty((int)fileno(fp)))
461 fprintf(stderr, "Python %s\n%s\n",
Jack Jansena547dca1996-07-10 15:48:25 +0000462 Py_GetVersion(), Py_GetCopyright());
Jack Jansen696c9581995-08-14 12:33:20 +0000463
464 if (filename != NULL) {
465 if ((fp = fopen(filename, "r")) == NULL) {
466 fprintf(stderr, "%s: can't open file '%s'\n",
467 argv[0], filename);
Jack Jansen0168f271995-10-27 13:32:30 +0000468 PyMac_Exit(2);
Jack Jansen696c9581995-08-14 12:33:20 +0000469 }
470 }
471
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000472 /* We initialize the menubar here, hoping SIOUX is initialized by now */
Jack Jansen3469e991996-09-06 00:30:45 +0000473 PyMac_InitMenuBar();
474
Jack Jansen696c9581995-08-14 12:33:20 +0000475 Py_Initialize();
476
Jack Jansen0c6d0372000-05-05 23:11:14 +0000477 PyMac_InstallNavServicesForSF();
478
Jack Jansen696c9581995-08-14 12:33:20 +0000479 PySys_SetArgv(argc-1, argv+1);
480
481 if (filename == NULL && isatty((int)fileno(fp))) {
482 FILE *fp = fopen(STARTUP, "r");
483 if (fp != NULL) {
484 (void) PyRun_SimpleFile(fp, STARTUP);
485 PyErr_Clear();
486 fclose(fp);
487 }
488 }
489 sts = PyRun_AnyFile(
490 fp, filename == NULL ? "<stdin>" : filename) != 0;
491 if (filename != NULL)
492 fclose(fp);
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000493
494 if ( filename != NULL || command != NULL )
495 sts = (run_inspect() || sts);
Jack Jansen696c9581995-08-14 12:33:20 +0000496
497 Py_Exit(sts);
498 /*NOTREACHED*/
499}
500
Jack Jansen0168f271995-10-27 13:32:30 +0000501/*
502** Terminate application
503*/
Jack Jansen76ceece1996-08-19 11:18:24 +0000504void
Jack Jansen0168f271995-10-27 13:32:30 +0000505PyMac_Exit(status)
506 int status;
507{
508 int keep;
Jack Jansen8c693211997-01-07 16:19:42 +0000509
510#if __profile__ == 1
511 ProfilerDump("\pPython Profiler Results");
512 ProfilerTerm();
513#endif
Jack Jansen0168f271995-10-27 13:32:30 +0000514 if ( status )
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000515 keep = options.keep_error;
Jack Jansen0168f271995-10-27 13:32:30 +0000516 else
Jack Jansen7d5f9e81996-09-07 17:09:31 +0000517 keep = options.keep_normal;
Jack Jansen0168f271995-10-27 13:32:30 +0000518
Jack Jansen1e8557a1995-11-10 14:51:26 +0000519#ifdef USE_SIOUX
520 if (keep) {
521 SIOUXSettings.standalone = 1;
522 SIOUXSettings.autocloseonquit = 0;
Jack Jansen415571c1996-03-25 15:46:03 +0000523 SIOUXSetTitle("\p\307terminated\310");
Jack Jansencaa7c461997-06-12 10:49:13 +0000524 PyMac_RestoreMenuBar();
Jack Jansene44545f1997-05-07 15:48:54 +0000525#ifdef USE_MSL
526 /*
527 ** Temporary workaround: autocloseonquit clearing does not
528 ** currently work for the MSL/GUSI combo.
529 */
530 while(getchar() > 0);
531#endif
Jack Jansen1e8557a1995-11-10 14:51:26 +0000532 }
Jack Jansen0168f271995-10-27 13:32:30 +0000533 else
534 SIOUXSettings.autocloseonquit = 1;
Jack Jansenf6865f71996-09-04 15:24:59 +0000535#endif /* USE_SIOUX */
Jack Jansen0168f271995-10-27 13:32:30 +0000536
537 exit(status);
538}
Jack Jansen696c9581995-08-14 12:33:20 +0000539
540/* Return the program name -- some code out there needs this. */
Jack Jansena39f1b01997-05-23 15:35:14 +0000541char *
542Py_GetProgramFullPath()
543{
Jack Jansen7330b391997-08-08 14:56:41 +0000544 return orig_argv[0];
Jack Jansena39f1b01997-05-23 15:35:14 +0000545}
546
Jack Jansen696c9581995-08-14 12:33:20 +0000547
548/* Make the *original* argc/argv available to other modules.
549 This is rare, but it is needed by the secureware extension. */
550
551void
Jack Jansen1d2f8631996-08-02 15:16:16 +0000552Py_GetArgcArgv(argc,argv)
Jack Jansen696c9581995-08-14 12:33:20 +0000553 int *argc;
554 char ***argv;
555{
556 *argc = orig_argc;
557 *argv = orig_argv;
Guido van Rossumb0f3c821994-08-23 13:34:25 +0000558}
Jack Jansen1d2f8631996-08-02 15:16:16 +0000559
560/* More cruft that shouldn't really be here, used in sysmodule.c */
561
562char *
563Py_GetPrefix()
564{
Jack Jansenac625691997-09-08 13:22:22 +0000565 return PyMac_GetPythonDir();
Jack Jansen1d2f8631996-08-02 15:16:16 +0000566}
567
568char *
569Py_GetExecPrefix()
570{
Jack Jansenac625691997-09-08 13:22:22 +0000571 return PyMac_GetPythonDir();
Jack Jansen1d2f8631996-08-02 15:16:16 +0000572}