blob: 22cb86bdca9b49975cd8926858417bc59c342e33 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum1984f1e1992-08-04 12:41:02 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum1984f1e1992-08-04 12:41:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum1984f1e1992-08-04 12:41:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000029
30******************************************************************/
31
32/* Python interpreter top-level routines, including init/exit */
33
Guido van Rossum82598051997-03-05 00:20:32 +000034#include "Python.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000035
36#include "grammar.h"
37#include "node.h"
38#include "parsetok.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000039#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000041#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000042#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000043
Guido van Rossum80bb9651996-12-05 23:27:02 +000044#ifdef HAVE_UNISTD_H
45#include <unistd.h>
46#endif
47
Guido van Rossuma110aa61994-08-29 12:50:44 +000048#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000049#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000050#endif
51
Guido van Rossum9b38a141996-09-11 23:12:24 +000052#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000053#undef BYTE
54#include "windows.h"
55#endif
56
Guido van Rossum82598051997-03-05 00:20:32 +000057extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058
Guido van Rossum82598051997-03-05 00:20:32 +000059extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060
Guido van Rossumb73cc041993-11-01 16:28:59 +000061/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000062static void initmain Py_PROTO((void));
63static PyObject *run_err_node Py_PROTO((node *n, char *filename,
64 PyObject *globals, PyObject *locals));
65static PyObject *run_node Py_PROTO((node *n, char *filename,
66 PyObject *globals, PyObject *locals));
67static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
68 PyObject *globals, PyObject *locals));
69static void err_input Py_PROTO((perrdetail *));
70static void initsigs Py_PROTO((void));
Guido van Rossum25ce5661997-08-02 03:10:38 +000071static void finisigs Py_PROTO((void));
Guido van Rossumcc283f51997-08-05 02:22:03 +000072static void call_sys_exitfunc Py_PROTO((void));
73static void call_ll_exitfuncs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000074
Guido van Rossum82598051997-03-05 00:20:32 +000075int Py_DebugFlag; /* Needed by parser.c */
76int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000077int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
Guido van Rossum25ce5661997-08-02 03:10:38 +000079static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000080
Guido van Rossume3c0d5e1997-08-22 04:20:13 +000081/* API to access the initialized flag -- useful for eroteric use */
82
83int
84Py_IsInitialized()
85{
86 return initialized;
87}
88
Guido van Rossum25ce5661997-08-02 03:10:38 +000089/* Global initializations. Can be undone by Py_Finalize(). Don't
90 call this twice without an intervening Py_Finalize() call. When
91 initializations fail, a fatal error is issued and the function does
92 not return. On return, the first thread and interpreter state have
93 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000094
Guido van Rossum25ce5661997-08-02 03:10:38 +000095 Locking: you must hold the interpreter lock while calling this.
96 (If the lock has not yet been initialized, that's equivalent to
97 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000098
Guido van Rossum25ce5661997-08-02 03:10:38 +000099*/
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100
101void
102Py_Initialize()
103{
Guido van Rossuma027efa1997-05-05 20:56:21 +0000104 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000105 PyThreadState *tstate;
106 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000107 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000108
Guido van Rossumaa615051997-08-20 22:40:18 +0000109 if (++initialized > 1)
110 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
113 Py_DebugFlag = 1;
114 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
115 Py_VerboseFlag = 1;
116
Guido van Rossuma027efa1997-05-05 20:56:21 +0000117 interp = PyInterpreterState_New();
118 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000119 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000120
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121 tstate = PyThreadState_New(interp);
122 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000123 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000124 (void) PyThreadState_Swap(tstate);
125
Guido van Rossum25ce5661997-08-02 03:10:38 +0000126 interp->modules = PyDict_New();
127 if (interp->modules == NULL)
128 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000129
Guido van Rossum25ce5661997-08-02 03:10:38 +0000130 bimod = _PyBuiltin_Init();
131 if (bimod == NULL)
132 Py_FatalError("Py_Initialize: can't initialize __builtin__");
133 interp->builtins = PyModule_GetDict(bimod);
134 Py_INCREF(interp->builtins);
135 _PyImport_FixupExtension("__builtin__", "__builtin__");
136
137 sysmod = _PySys_Init();
138 if (sysmod == NULL)
139 Py_FatalError("Py_Initialize: can't initialize sys");
140 interp->sysdict = PyModule_GetDict(sysmod);
141 Py_INCREF(interp->sysdict);
142 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000143 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000144 PyDict_SetItemString(interp->sysdict, "modules",
145 interp->modules);
146
147 _PyImport_Init();
148
149 initsigs(); /* Signal handling stuff, including initintr() */
150
151 initmain(); /* Module __main__ */
152}
153
154/* Undo the effect of Py_Initialize().
155
156 Beware: if multiple interpreter and/or thread states exist, these
157 are not wiped out; only the current thread and interpreter state
158 are deleted. But since everything else is deleted, those other
159 interpreter and thread states should no longer be used.
160
161 (XXX We should do better, e.g. wipe out all interpreters and
162 threads.)
163
164 Locking: as above.
165
166*/
167
168void
169Py_Finalize()
170{
171 PyInterpreterState *interp;
172 PyThreadState *tstate;
173
Guido van Rossumcc283f51997-08-05 02:22:03 +0000174 call_sys_exitfunc();
175
Guido van Rossumaa615051997-08-20 22:40:18 +0000176 if (--initialized > 0)
177 return;
178 if (initialized < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000179 Py_FatalError("Py_Finalize: not initialized");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000180
181 tstate = PyThreadState_Get();
182 interp = tstate->interp;
183
184 PyImport_Cleanup();
185 PyInterpreterState_Clear(interp);
186 PyThreadState_Swap(NULL);
187 PyInterpreterState_Delete(interp);
188
189 finisigs();
190 _PyImport_Fini();
191 _PyBuiltin_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000192 PyMethod_Fini();
193 PyFrame_Fini();
194 PyCFunction_Fini();
195 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000196 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000197 PyInt_Fini();
198 PyFloat_Fini();
199
200 /* XXX Still allocated:
201 - various static ad-hoc pointers to interned strings
202 - int and float free list blocks
203 - whatever various modules and libraries allocate
204 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000205
206 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000207
208 call_ll_exitfuncs();
209
210#ifdef COUNT_ALLOCS
211 dump_counts();
212#endif
213
214#ifdef Py_REF_DEBUG
215 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
216#endif
217
218#ifdef Py_TRACE_REFS
219 if (_Py_AskYesNo("Print left references?")) {
220 _Py_PrintReferences(stderr);
221 }
222 _Py_ResetReferences();
223#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000224}
225
226/* Create and initialize a new interpreter and thread, and return the
227 new thread. This requires that Py_Initialize() has been called
228 first.
229
230 Unsuccessful initialization yields a NULL pointer. Note that *no*
231 exception information is available even in this case -- the
232 exception information is held in the thread, and there is no
233 thread.
234
235 Locking: as above.
236
237*/
238
239PyThreadState *
240Py_NewInterpreter()
241{
242 PyInterpreterState *interp;
243 PyThreadState *tstate, *save_tstate;
244 PyObject *bimod, *sysmod;
245
246 if (!initialized)
247 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
248
249 interp = PyInterpreterState_New();
250 if (interp == NULL)
251 return NULL;
252
253 tstate = PyThreadState_New(interp);
254 if (tstate == NULL) {
255 PyInterpreterState_Delete(interp);
256 return NULL;
257 }
258
259 save_tstate = PyThreadState_Swap(tstate);
260
261 /* XXX The following is lax in error checking */
262
263 interp->modules = PyDict_New();
264
265 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
266 if (bimod != NULL) {
267 interp->builtins = PyModule_GetDict(bimod);
268 Py_INCREF(interp->builtins);
269 }
270 sysmod = _PyImport_FindExtension("sys", "sys");
271 if (bimod != NULL && sysmod != NULL) {
272 interp->sysdict = PyModule_GetDict(sysmod);
273 Py_INCREF(interp->sysdict);
274 PySys_SetPath(Py_GetPath());
275 PyDict_SetItemString(interp->sysdict, "modules",
276 interp->modules);
277 initmain();
278 }
279
280 if (!PyErr_Occurred())
281 return tstate;
282
283 /* Oops, it didn't work. Undo it all. */
284
285 PyErr_Print();
286 PyThreadState_Clear(tstate);
287 PyThreadState_Swap(save_tstate);
288 PyThreadState_Delete(tstate);
289 PyInterpreterState_Delete(interp);
290
291 return NULL;
292}
293
294/* Delete an interpreter and its last thread. This requires that the
295 given thread state is current, that the thread has no remaining
296 frames, and that it is its interpreter's only remaining thread.
297 It is a fatal error to violate these constraints.
298
299 (Py_Finalize() doesn't have these constraints -- it zaps
300 everything, regardless.)
301
302 Locking: as above.
303
304*/
305
306void
307Py_EndInterpreter(tstate)
308 PyThreadState *tstate;
309{
310 PyInterpreterState *interp = tstate->interp;
311
312 if (tstate != PyThreadState_Get())
313 Py_FatalError("Py_EndInterpreter: thread is not current");
314 if (tstate->frame != NULL)
315 Py_FatalError("Py_EndInterpreter: thread still has a frame");
316 if (tstate != interp->tstate_head || tstate->next != NULL)
317 Py_FatalError("Py_EndInterpreter: not the last thread");
318
319 PyImport_Cleanup();
320 PyInterpreterState_Clear(interp);
321 PyThreadState_Swap(NULL);
322 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000323}
324
325static char *progname = "python";
326
327void
328Py_SetProgramName(pn)
329 char *pn;
330{
331 if (pn && *pn)
332 progname = pn;
333}
334
335char *
336Py_GetProgramName()
337{
338 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000339}
340
Guido van Rossum6135a871995-01-09 17:53:26 +0000341/* Create __main__ module */
342
343static void
344initmain()
345{
Guido van Rossum82598051997-03-05 00:20:32 +0000346 PyObject *m, *d;
347 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000348 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000349 Py_FatalError("can't create __main__ module");
350 d = PyModule_GetDict(m);
351 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
352 if (PyDict_SetItemString(d, "__builtins__",
353 PyEval_GetBuiltins()))
354 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000355 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356}
357
358/* Parse input from a file and execute it */
359
360int
Guido van Rossum82598051997-03-05 00:20:32 +0000361PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000362 FILE *fp;
363 char *filename;
364{
365 if (filename == NULL)
366 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000367 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000368 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369 else
Guido van Rossum82598051997-03-05 00:20:32 +0000370 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371}
372
373int
Guido van Rossum82598051997-03-05 00:20:32 +0000374PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000375 FILE *fp;
376 char *filename;
377{
Guido van Rossum82598051997-03-05 00:20:32 +0000378 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000379 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000380 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000382 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
383 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000384 }
Guido van Rossum82598051997-03-05 00:20:32 +0000385 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000386 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000387 PySys_SetObject("ps2", v = PyString_FromString("... "));
388 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000389 }
390 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000391 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000392#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000393 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000394#endif
395 if (ret == E_EOF)
396 return 0;
397 /*
398 if (ret == E_NOMEM)
399 return -1;
400 */
401 }
402}
403
404int
Guido van Rossum82598051997-03-05 00:20:32 +0000405PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000406 FILE *fp;
407 char *filename;
408{
Guido van Rossum82598051997-03-05 00:20:32 +0000409 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000411 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000412 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000413 v = PySys_GetObject("ps1");
414 w = PySys_GetObject("ps2");
415 if (v != NULL && PyString_Check(v)) {
416 Py_INCREF(v);
417 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 }
419 else {
420 v = NULL;
421 ps1 = "";
422 }
Guido van Rossum82598051997-03-05 00:20:32 +0000423 if (w != NULL && PyString_Check(w)) {
424 Py_INCREF(w);
425 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 }
427 else {
428 w = NULL;
429 ps2 = "";
430 }
Guido van Rossum82598051997-03-05 00:20:32 +0000431 Py_BEGIN_ALLOW_THREADS
432 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000433 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000434 Py_END_ALLOW_THREADS
435 Py_XDECREF(v);
436 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000437 if (n == NULL) {
438 if (err.error == E_EOF) {
439 if (err.text)
440 free(err.text);
441 return E_EOF;
442 }
443 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000444 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000445 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446 }
Guido van Rossum82598051997-03-05 00:20:32 +0000447 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000448 if (m == NULL)
449 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000450 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000452 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000453 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454 return -1;
455 }
Guido van Rossum82598051997-03-05 00:20:32 +0000456 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000457 if (Py_FlushLine())
458 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459 return 0;
460}
461
462int
Guido van Rossum82598051997-03-05 00:20:32 +0000463PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000464 FILE *fp;
465 char *filename;
466{
Guido van Rossum82598051997-03-05 00:20:32 +0000467 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000468 char *ext;
469
Guido van Rossum82598051997-03-05 00:20:32 +0000470 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471 if (m == NULL)
472 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000473 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000474 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000475 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000476#ifdef macintosh
477 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000478 || getfiletype(filename) == 'PYC '
479 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000480#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000481 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000482 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000483 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000484 if( (fp = fopen(filename, "rb")) == NULL ) {
485 fprintf(stderr, "python: Can't reopen .pyc file\n");
486 return -1;
487 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000488 /* Turn on optimization if a .pyo file is given */
489 if (strcmp(ext, ".pyo") == 0)
490 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000491 v = run_pyc_file(fp, filename, d, d);
492 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000493 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000494 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000495 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000496 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497 return -1;
498 }
Guido van Rossum82598051997-03-05 00:20:32 +0000499 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000500 if (Py_FlushLine())
501 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 return 0;
503}
504
505int
Guido van Rossum82598051997-03-05 00:20:32 +0000506PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 char *command;
508{
Guido van Rossum82598051997-03-05 00:20:32 +0000509 PyObject *m, *d, *v;
510 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000511 if (m == NULL)
512 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000513 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000514 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000516 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517 return -1;
518 }
Guido van Rossum82598051997-03-05 00:20:32 +0000519 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000520 if (Py_FlushLine())
521 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000522 return 0;
523}
524
525void
Guido van Rossum82598051997-03-05 00:20:32 +0000526PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000527{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000528 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000529 PyObject *exception, *v, *tb, *f;
530 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000532 return;
Guido van Rossum82598051997-03-05 00:20:32 +0000533 if (exception == PyExc_SystemExit) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000534 err = Py_FlushLine();
535 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000536 if (v == NULL || v == Py_None)
537 Py_Exit(0);
538 if (PyInt_Check(v))
539 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000540 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000541 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000542 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000543 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000544 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000545 }
546 }
Guido van Rossum82598051997-03-05 00:20:32 +0000547 PySys_SetObject("last_type", exception);
548 PySys_SetObject("last_value", v);
549 PySys_SetObject("last_traceback", tb);
550 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000551 if (f == NULL)
552 fprintf(stderr, "lost sys.stderr\n");
553 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000554 err = Py_FlushLine();
555 fflush(stdout);
556 if (err == 0)
557 err = PyTraceBack_Print(tb, f);
558 if (err == 0 && exception == PyExc_SyntaxError) {
Guido van Rossum82598051997-03-05 00:20:32 +0000559 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000560 char *filename, *text;
561 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000562 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000563 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000564 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000565 else {
566 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000567 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000568 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000569 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570 else
Guido van Rossum82598051997-03-05 00:20:32 +0000571 PyFile_WriteString(filename, f);
572 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000573 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000574 PyFile_WriteString(buf, f);
575 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000576 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000577 char *nl;
578 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000579 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000580 offset--;
581 for (;;) {
582 nl = strchr(text, '\n');
583 if (nl == NULL ||
584 nl-text >= offset)
585 break;
586 offset -= (nl+1-text);
587 text = nl+1;
588 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000589 while (*text == ' ' || *text == '\t') {
590 text++;
591 offset--;
592 }
Guido van Rossum82598051997-03-05 00:20:32 +0000593 PyFile_WriteString(" ", f);
594 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000595 if (*text == '\0' ||
596 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000597 PyFile_WriteString("\n", f);
598 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000599 offset--;
600 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000601 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000602 offset--;
603 }
Guido van Rossum82598051997-03-05 00:20:32 +0000604 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000605 }
Guido van Rossum82598051997-03-05 00:20:32 +0000606 Py_INCREF(message);
607 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000608 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000609 /* Can't be bothered to check all those
610 PyFile_WriteString() calls */
611 if (PyErr_Occurred())
612 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000613 }
614 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000615 if (err) {
616 /* Don't do anything else */
617 }
618 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000619 PyObject* className =
620 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000621 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000622 err = PyFile_WriteString("<unknown>", f);
623 else
624 err = PyFile_WriteObject(className, f,
625 Py_PRINT_RAW);
626 }
627 else
628 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
629 if (err == 0) {
630 if (v != NULL && v != Py_None) {
631 err = PyFile_WriteString(": ", f);
632 if (err == 0)
633 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000634 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000635 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000636 if (err == 0)
637 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638 }
Guido van Rossum82598051997-03-05 00:20:32 +0000639 Py_XDECREF(exception);
640 Py_XDECREF(v);
641 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000642 /* If an error happened here, don't show it.
643 XXX This is wrong, but too many callers rely on this behavior. */
644 if (err != 0)
645 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646}
647
Guido van Rossum82598051997-03-05 00:20:32 +0000648PyObject *
649PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650 char *str;
651 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000652 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000653{
Guido van Rossum82598051997-03-05 00:20:32 +0000654 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000655 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656}
657
Guido van Rossum82598051997-03-05 00:20:32 +0000658PyObject *
659PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660 FILE *fp;
661 char *filename;
662 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000663 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664{
Guido van Rossum82598051997-03-05 00:20:32 +0000665 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000666 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667}
668
Guido van Rossum82598051997-03-05 00:20:32 +0000669static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000670run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000671 node *n;
672 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000673 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000674{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000675 if (n == NULL)
676 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677 return run_node(n, filename, globals, locals);
678}
679
Guido van Rossum82598051997-03-05 00:20:32 +0000680static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681run_node(n, filename, globals, locals)
682 node *n;
683 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000684 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000685{
Guido van Rossum82598051997-03-05 00:20:32 +0000686 PyCodeObject *co;
687 PyObject *v;
688 co = PyNode_Compile(n, filename);
689 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000690 if (co == NULL)
691 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000692 v = PyEval_EvalCode(co, globals, locals);
693 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000694 return v;
695}
696
Guido van Rossum82598051997-03-05 00:20:32 +0000697static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000698run_pyc_file(fp, filename, globals, locals)
699 FILE *fp;
700 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000701 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000702{
Guido van Rossum82598051997-03-05 00:20:32 +0000703 PyCodeObject *co;
704 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000705 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000706 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000707
Guido van Rossum82598051997-03-05 00:20:32 +0000708 magic = PyMarshal_ReadLongFromFile(fp);
709 if (magic != PyImport_GetMagicNumber()) {
710 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000711 "Bad magic number in .pyc file");
712 return NULL;
713 }
Guido van Rossum82598051997-03-05 00:20:32 +0000714 (void) PyMarshal_ReadLongFromFile(fp);
715 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000716 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000717 if (v == NULL || !PyCode_Check(v)) {
718 Py_XDECREF(v);
719 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000720 "Bad code object in .pyc file");
721 return NULL;
722 }
Guido van Rossum82598051997-03-05 00:20:32 +0000723 co = (PyCodeObject *)v;
724 v = PyEval_EvalCode(co, globals, locals);
725 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000726 return v;
727}
728
Guido van Rossum82598051997-03-05 00:20:32 +0000729PyObject *
730Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000731 char *str;
732 char *filename;
733 int start;
734{
735 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000736 PyCodeObject *co;
737 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000738 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000739 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000740 co = PyNode_Compile(n, filename);
741 PyNode_Free(n);
742 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000743}
744
Guido van Rossuma110aa61994-08-29 12:50:44 +0000745/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000746
Guido van Rossuma110aa61994-08-29 12:50:44 +0000747node *
Guido van Rossum82598051997-03-05 00:20:32 +0000748PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000749 FILE *fp;
750 char *filename;
751 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000752{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000753 node *n;
754 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000755 Py_BEGIN_ALLOW_THREADS
756 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000757 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000758 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000759 if (n == NULL)
760 err_input(&err);
761 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000762}
763
Guido van Rossuma110aa61994-08-29 12:50:44 +0000764/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000765
Guido van Rossuma110aa61994-08-29 12:50:44 +0000766node *
Guido van Rossum82598051997-03-05 00:20:32 +0000767PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000768 char *str;
769 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000770{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000771 node *n;
772 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000773 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774 if (n == NULL)
775 err_input(&err);
776 return n;
777}
778
779/* Set the error appropriate to the given input error code (see errcode.h) */
780
781static void
782err_input(err)
783 perrdetail *err;
784{
Guido van Rossum82598051997-03-05 00:20:32 +0000785 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000786 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000787 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000788 err->lineno, err->offset, err->text);
789 if (err->text != NULL) {
790 free(err->text);
791 err->text = NULL;
792 }
793 switch (err->error) {
794 case E_SYNTAX:
795 msg = "invalid syntax";
796 break;
797 case E_TOKEN:
798 msg = "invalid token";
799
800 break;
801 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000802 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000803 return;
804 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000805 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000806 return;
807 case E_EOF:
808 msg = "unexpected EOF while parsing";
809 break;
810 default:
811 fprintf(stderr, "error=%d\n", err->error);
812 msg = "unknown parsing error";
813 break;
814 }
Guido van Rossum82598051997-03-05 00:20:32 +0000815 w = Py_BuildValue("(sO)", msg, v);
816 Py_XDECREF(v);
817 PyErr_SetObject(PyExc_SyntaxError, w);
818 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000819}
820
821/* Print fatal error message and abort */
822
823void
Guido van Rossum82598051997-03-05 00:20:32 +0000824Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000825 char *msg;
826{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000827 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000828#ifdef macintosh
829 for (;;);
830#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000831#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000832 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000833 OutputDebugString(msg);
834 OutputDebugString("\n");
835#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836 abort();
837}
838
839/* Clean up and exit */
840
Guido van Rossuma110aa61994-08-29 12:50:44 +0000841#ifdef WITH_THREAD
842#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000843int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000844#endif
845
Guido van Rossum1662dd51994-09-07 14:38:28 +0000846#define NEXITFUNCS 32
847static void (*exitfuncs[NEXITFUNCS])();
848static int nexitfuncs = 0;
849
850int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000851 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000852{
853 if (nexitfuncs >= NEXITFUNCS)
854 return -1;
855 exitfuncs[nexitfuncs++] = func;
856 return 0;
857}
858
Guido van Rossumcc283f51997-08-05 02:22:03 +0000859static void
860call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000861{
Guido van Rossum82598051997-03-05 00:20:32 +0000862 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000863
864 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000865 PyObject *res;
866 Py_INCREF(exitfunc);
867 PySys_SetObject("exitfunc", (PyObject *)NULL);
868 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000869 if (res == NULL) {
870 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000871 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000872 }
Guido van Rossum82598051997-03-05 00:20:32 +0000873 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000874 }
875
Guido van Rossum82598051997-03-05 00:20:32 +0000876 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000877}
Guido van Rossum1662dd51994-09-07 14:38:28 +0000878
Guido van Rossumcc283f51997-08-05 02:22:03 +0000879static void
880call_ll_exitfuncs()
881{
Guido van Rossum1662dd51994-09-07 14:38:28 +0000882 while (nexitfuncs > 0)
883 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000884
885 fflush(stdout);
886 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000887}
888
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000889#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000890extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000891#endif
892
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000893void
Guido van Rossum82598051997-03-05 00:20:32 +0000894Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000895 int sts;
896{
Guido van Rossumcc283f51997-08-05 02:22:03 +0000897 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000898
Jack Jansen66a89771995-10-27 13:22:14 +0000899#ifdef macintosh
900 PyMac_Exit(sts);
901#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000902 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000903#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000904}
905
Guido van Rossuma110aa61994-08-29 12:50:44 +0000906#ifdef HAVE_SIGNAL_H
907static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000908sighandler(sig)
909 int sig;
910{
911 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000912 /* Do essential exit processing only */
913 call_sys_exitfunc();
914 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +0000915#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000916 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917#else
918 exit(1);
919#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000920 /*NOTREACHED*/
921}
922#endif
923
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000924static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000925initsigs()
926{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000927 RETSIGTYPE (*t)();
928#ifdef HAVE_SIGNAL_H
929#ifdef SIGPIPE
930 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000931#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000932#ifdef SIGHUP
933 t = signal(SIGHUP, SIG_IGN);
934 if (t == SIG_DFL)
935 signal(SIGHUP, sighandler);
936 else
937 signal(SIGHUP, t);
938#endif
939#ifdef SIGTERM
940 t = signal(SIGTERM, SIG_IGN);
941 if (t == SIG_DFL)
942 signal(SIGTERM, sighandler);
943 else
944 signal(SIGTERM, t);
945#endif
946#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000947 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000948}
949
Guido van Rossum25ce5661997-08-02 03:10:38 +0000950static void
951finisigs()
952{
953 PyOS_FiniInterrupts(); /* May imply finisignal() */
954}
955
Guido van Rossumaae0d321996-05-22 16:35:33 +0000956#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000957/* Ask a yes/no question */
958
Guido van Rossum59bff391992-09-03 20:28:00 +0000959int
Guido van Rossum82598051997-03-05 00:20:32 +0000960_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000961 char *prompt;
962{
963 char buf[256];
964
965 printf("%s [ny] ", prompt);
966 if (fgets(buf, sizeof buf, stdin) == NULL)
967 return 0;
968 return buf[0] == 'y' || buf[0] == 'Y';
969}
970#endif
971
Guido van Rossuma110aa61994-08-29 12:50:44 +0000972#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000973
974/* Check for file descriptor connected to interactive device.
975 Pretend that stdin is always interactive, other files never. */
976
977int
978isatty(fd)
979 int fd;
980{
981 return fd == fileno(stdin);
982}
983
984#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000985
986/*
987 * The file descriptor fd is considered ``interactive'' if either
988 * a) isatty(fd) is TRUE, or
989 * b) the -i flag was given, and the filename associated with
990 * the descriptor is NULL or "<stdin>" or "???".
991 */
992int
993Py_FdIsInteractive(fp, filename)
994 FILE *fp;
995 char *filename;
996{
997 if (isatty((int)fileno(fp)))
998 return 1;
999 if (!Py_InteractiveFlag)
1000 return 0;
1001 return (filename == NULL) ||
1002 (strcmp(filename, "<stdin>") == 0) ||
1003 (strcmp(filename, "???") == 0);
1004}