blob: 9f977f05b43247056aa25a667cc3c9127afe552d [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 Rossum25ce5661997-08-02 03:10:38 +000081/* Global initializations. Can be undone by Py_Finalize(). Don't
82 call this twice without an intervening Py_Finalize() call. When
83 initializations fail, a fatal error is issued and the function does
84 not return. On return, the first thread and interpreter state have
85 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086
Guido van Rossum25ce5661997-08-02 03:10:38 +000087 Locking: you must hold the interpreter lock while calling this.
88 (If the lock has not yet been initialized, that's equivalent to
89 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000090
Guido van Rossum25ce5661997-08-02 03:10:38 +000091*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000092
93void
94Py_Initialize()
95{
Guido van Rossuma027efa1997-05-05 20:56:21 +000096 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000097 PyThreadState *tstate;
98 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000099 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000100
Guido van Rossumaa615051997-08-20 22:40:18 +0000101 if (++initialized > 1)
102 return;
Guido van Rossum25ce5661997-08-02 03:10:38 +0000103
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000104 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
105 Py_DebugFlag = 1;
106 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
107 Py_VerboseFlag = 1;
108
Guido van Rossuma027efa1997-05-05 20:56:21 +0000109 interp = PyInterpreterState_New();
110 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000111 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000112
Guido van Rossuma027efa1997-05-05 20:56:21 +0000113 tstate = PyThreadState_New(interp);
114 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000115 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000116 (void) PyThreadState_Swap(tstate);
117
Guido van Rossum25ce5661997-08-02 03:10:38 +0000118 interp->modules = PyDict_New();
119 if (interp->modules == NULL)
120 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000121
Guido van Rossum25ce5661997-08-02 03:10:38 +0000122 bimod = _PyBuiltin_Init();
123 if (bimod == NULL)
124 Py_FatalError("Py_Initialize: can't initialize __builtin__");
125 interp->builtins = PyModule_GetDict(bimod);
126 Py_INCREF(interp->builtins);
127 _PyImport_FixupExtension("__builtin__", "__builtin__");
128
129 sysmod = _PySys_Init();
130 if (sysmod == NULL)
131 Py_FatalError("Py_Initialize: can't initialize sys");
132 interp->sysdict = PyModule_GetDict(sysmod);
133 Py_INCREF(interp->sysdict);
134 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000135 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000136 PyDict_SetItemString(interp->sysdict, "modules",
137 interp->modules);
138
139 _PyImport_Init();
140
141 initsigs(); /* Signal handling stuff, including initintr() */
142
143 initmain(); /* Module __main__ */
144}
145
146/* Undo the effect of Py_Initialize().
147
148 Beware: if multiple interpreter and/or thread states exist, these
149 are not wiped out; only the current thread and interpreter state
150 are deleted. But since everything else is deleted, those other
151 interpreter and thread states should no longer be used.
152
153 (XXX We should do better, e.g. wipe out all interpreters and
154 threads.)
155
156 Locking: as above.
157
158*/
159
160void
161Py_Finalize()
162{
163 PyInterpreterState *interp;
164 PyThreadState *tstate;
165
Guido van Rossumcc283f51997-08-05 02:22:03 +0000166 call_sys_exitfunc();
167
Guido van Rossumaa615051997-08-20 22:40:18 +0000168 if (--initialized > 0)
169 return;
170 if (initialized < 0)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000171 Py_FatalError("Py_Finalize: not initialized");
Guido van Rossum25ce5661997-08-02 03:10:38 +0000172
173 tstate = PyThreadState_Get();
174 interp = tstate->interp;
175
176 PyImport_Cleanup();
177 PyInterpreterState_Clear(interp);
178 PyThreadState_Swap(NULL);
179 PyInterpreterState_Delete(interp);
180
181 finisigs();
182 _PyImport_Fini();
183 _PyBuiltin_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000184 PyMethod_Fini();
185 PyFrame_Fini();
186 PyCFunction_Fini();
187 PyTuple_Fini();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000188 PyString_Fini();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000189 PyInt_Fini();
190 PyFloat_Fini();
191
192 /* XXX Still allocated:
193 - various static ad-hoc pointers to interned strings
194 - int and float free list blocks
195 - whatever various modules and libraries allocate
196 */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000197
198 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
Guido van Rossumcc283f51997-08-05 02:22:03 +0000199
200 call_ll_exitfuncs();
201
202#ifdef COUNT_ALLOCS
203 dump_counts();
204#endif
205
206#ifdef Py_REF_DEBUG
207 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
208#endif
209
210#ifdef Py_TRACE_REFS
211 if (_Py_AskYesNo("Print left references?")) {
212 _Py_PrintReferences(stderr);
213 }
214 _Py_ResetReferences();
215#endif /* Py_TRACE_REFS */
Guido van Rossum25ce5661997-08-02 03:10:38 +0000216}
217
218/* Create and initialize a new interpreter and thread, and return the
219 new thread. This requires that Py_Initialize() has been called
220 first.
221
222 Unsuccessful initialization yields a NULL pointer. Note that *no*
223 exception information is available even in this case -- the
224 exception information is held in the thread, and there is no
225 thread.
226
227 Locking: as above.
228
229*/
230
231PyThreadState *
232Py_NewInterpreter()
233{
234 PyInterpreterState *interp;
235 PyThreadState *tstate, *save_tstate;
236 PyObject *bimod, *sysmod;
237
238 if (!initialized)
239 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
240
241 interp = PyInterpreterState_New();
242 if (interp == NULL)
243 return NULL;
244
245 tstate = PyThreadState_New(interp);
246 if (tstate == NULL) {
247 PyInterpreterState_Delete(interp);
248 return NULL;
249 }
250
251 save_tstate = PyThreadState_Swap(tstate);
252
253 /* XXX The following is lax in error checking */
254
255 interp->modules = PyDict_New();
256
257 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
258 if (bimod != NULL) {
259 interp->builtins = PyModule_GetDict(bimod);
260 Py_INCREF(interp->builtins);
261 }
262 sysmod = _PyImport_FindExtension("sys", "sys");
263 if (bimod != NULL && sysmod != NULL) {
264 interp->sysdict = PyModule_GetDict(sysmod);
265 Py_INCREF(interp->sysdict);
266 PySys_SetPath(Py_GetPath());
267 PyDict_SetItemString(interp->sysdict, "modules",
268 interp->modules);
269 initmain();
270 }
271
272 if (!PyErr_Occurred())
273 return tstate;
274
275 /* Oops, it didn't work. Undo it all. */
276
277 PyErr_Print();
278 PyThreadState_Clear(tstate);
279 PyThreadState_Swap(save_tstate);
280 PyThreadState_Delete(tstate);
281 PyInterpreterState_Delete(interp);
282
283 return NULL;
284}
285
286/* Delete an interpreter and its last thread. This requires that the
287 given thread state is current, that the thread has no remaining
288 frames, and that it is its interpreter's only remaining thread.
289 It is a fatal error to violate these constraints.
290
291 (Py_Finalize() doesn't have these constraints -- it zaps
292 everything, regardless.)
293
294 Locking: as above.
295
296*/
297
298void
299Py_EndInterpreter(tstate)
300 PyThreadState *tstate;
301{
302 PyInterpreterState *interp = tstate->interp;
303
304 if (tstate != PyThreadState_Get())
305 Py_FatalError("Py_EndInterpreter: thread is not current");
306 if (tstate->frame != NULL)
307 Py_FatalError("Py_EndInterpreter: thread still has a frame");
308 if (tstate != interp->tstate_head || tstate->next != NULL)
309 Py_FatalError("Py_EndInterpreter: not the last thread");
310
311 PyImport_Cleanup();
312 PyInterpreterState_Clear(interp);
313 PyThreadState_Swap(NULL);
314 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000315}
316
317static char *progname = "python";
318
319void
320Py_SetProgramName(pn)
321 char *pn;
322{
323 if (pn && *pn)
324 progname = pn;
325}
326
327char *
328Py_GetProgramName()
329{
330 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000331}
332
Guido van Rossum6135a871995-01-09 17:53:26 +0000333/* Create __main__ module */
334
335static void
336initmain()
337{
Guido van Rossum82598051997-03-05 00:20:32 +0000338 PyObject *m, *d;
339 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000340 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000341 Py_FatalError("can't create __main__ module");
342 d = PyModule_GetDict(m);
343 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
344 if (PyDict_SetItemString(d, "__builtins__",
345 PyEval_GetBuiltins()))
346 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000347 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000348}
349
350/* Parse input from a file and execute it */
351
352int
Guido van Rossum82598051997-03-05 00:20:32 +0000353PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000354 FILE *fp;
355 char *filename;
356{
357 if (filename == NULL)
358 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000359 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000360 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361 else
Guido van Rossum82598051997-03-05 00:20:32 +0000362 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000363}
364
365int
Guido van Rossum82598051997-03-05 00:20:32 +0000366PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000367 FILE *fp;
368 char *filename;
369{
Guido van Rossum82598051997-03-05 00:20:32 +0000370 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000371 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000372 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000373 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000374 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
375 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000376 }
Guido van Rossum82598051997-03-05 00:20:32 +0000377 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000378 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000379 PySys_SetObject("ps2", v = PyString_FromString("... "));
380 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381 }
382 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000383 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000384#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000385 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000386#endif
387 if (ret == E_EOF)
388 return 0;
389 /*
390 if (ret == E_NOMEM)
391 return -1;
392 */
393 }
394}
395
396int
Guido van Rossum82598051997-03-05 00:20:32 +0000397PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000398 FILE *fp;
399 char *filename;
400{
Guido van Rossum82598051997-03-05 00:20:32 +0000401 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000402 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000403 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000404 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000405 v = PySys_GetObject("ps1");
406 w = PySys_GetObject("ps2");
407 if (v != NULL && PyString_Check(v)) {
408 Py_INCREF(v);
409 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000410 }
411 else {
412 v = NULL;
413 ps1 = "";
414 }
Guido van Rossum82598051997-03-05 00:20:32 +0000415 if (w != NULL && PyString_Check(w)) {
416 Py_INCREF(w);
417 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000418 }
419 else {
420 w = NULL;
421 ps2 = "";
422 }
Guido van Rossum82598051997-03-05 00:20:32 +0000423 Py_BEGIN_ALLOW_THREADS
424 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000425 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000426 Py_END_ALLOW_THREADS
427 Py_XDECREF(v);
428 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000429 if (n == NULL) {
430 if (err.error == E_EOF) {
431 if (err.text)
432 free(err.text);
433 return E_EOF;
434 }
435 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000436 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000437 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 }
Guido van Rossum82598051997-03-05 00:20:32 +0000439 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440 if (m == NULL)
441 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000442 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000443 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000444 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000445 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446 return -1;
447 }
Guido van Rossum82598051997-03-05 00:20:32 +0000448 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000449 if (Py_FlushLine())
450 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451 return 0;
452}
453
454int
Guido van Rossum82598051997-03-05 00:20:32 +0000455PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456 FILE *fp;
457 char *filename;
458{
Guido van Rossum82598051997-03-05 00:20:32 +0000459 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000460 char *ext;
461
Guido van Rossum82598051997-03-05 00:20:32 +0000462 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463 if (m == NULL)
464 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000465 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000466 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000467 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000468#ifdef macintosh
469 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000470 || getfiletype(filename) == 'PYC '
471 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000472#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000473 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000474 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000475 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000476 if( (fp = fopen(filename, "rb")) == NULL ) {
477 fprintf(stderr, "python: Can't reopen .pyc file\n");
478 return -1;
479 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000480 /* Turn on optimization if a .pyo file is given */
481 if (strcmp(ext, ".pyo") == 0)
482 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000483 v = run_pyc_file(fp, filename, d, d);
484 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000485 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000486 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000487 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000488 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000489 return -1;
490 }
Guido van Rossum82598051997-03-05 00:20:32 +0000491 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000492 if (Py_FlushLine())
493 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000494 return 0;
495}
496
497int
Guido van Rossum82598051997-03-05 00:20:32 +0000498PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499 char *command;
500{
Guido van Rossum82598051997-03-05 00:20:32 +0000501 PyObject *m, *d, *v;
502 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000503 if (m == NULL)
504 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000505 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000506 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000508 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000509 return -1;
510 }
Guido van Rossum82598051997-03-05 00:20:32 +0000511 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000512 if (Py_FlushLine())
513 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000514 return 0;
515}
516
517void
Guido van Rossum82598051997-03-05 00:20:32 +0000518PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000519{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000520 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000521 PyObject *exception, *v, *tb, *f;
522 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000523 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000524 return;
Guido van Rossum82598051997-03-05 00:20:32 +0000525 if (exception == PyExc_SystemExit) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000526 err = Py_FlushLine();
527 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000528 if (v == NULL || v == Py_None)
529 Py_Exit(0);
530 if (PyInt_Check(v))
531 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000532 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000533 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000534 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000535 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000536 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000537 }
538 }
Guido van Rossum82598051997-03-05 00:20:32 +0000539 PySys_SetObject("last_type", exception);
540 PySys_SetObject("last_value", v);
541 PySys_SetObject("last_traceback", tb);
542 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000543 if (f == NULL)
544 fprintf(stderr, "lost sys.stderr\n");
545 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000546 err = Py_FlushLine();
547 fflush(stdout);
548 if (err == 0)
549 err = PyTraceBack_Print(tb, f);
550 if (err == 0 && exception == PyExc_SyntaxError) {
Guido van Rossum82598051997-03-05 00:20:32 +0000551 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000552 char *filename, *text;
553 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000554 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000555 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000556 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000557 else {
558 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000559 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000560 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000561 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000562 else
Guido van Rossum82598051997-03-05 00:20:32 +0000563 PyFile_WriteString(filename, f);
564 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000565 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000566 PyFile_WriteString(buf, f);
567 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000568 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000569 char *nl;
570 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000571 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000572 offset--;
573 for (;;) {
574 nl = strchr(text, '\n');
575 if (nl == NULL ||
576 nl-text >= offset)
577 break;
578 offset -= (nl+1-text);
579 text = nl+1;
580 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000581 while (*text == ' ' || *text == '\t') {
582 text++;
583 offset--;
584 }
Guido van Rossum82598051997-03-05 00:20:32 +0000585 PyFile_WriteString(" ", f);
586 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000587 if (*text == '\0' ||
588 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000589 PyFile_WriteString("\n", f);
590 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000591 offset--;
592 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000593 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000594 offset--;
595 }
Guido van Rossum82598051997-03-05 00:20:32 +0000596 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000597 }
Guido van Rossum82598051997-03-05 00:20:32 +0000598 Py_INCREF(message);
599 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000600 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000601 /* Can't be bothered to check all those
602 PyFile_WriteString() calls */
603 if (PyErr_Occurred())
604 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000605 }
606 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000607 if (err) {
608 /* Don't do anything else */
609 }
610 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000611 PyObject* className =
612 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000613 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000614 err = PyFile_WriteString("<unknown>", f);
615 else
616 err = PyFile_WriteObject(className, f,
617 Py_PRINT_RAW);
618 }
619 else
620 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
621 if (err == 0) {
622 if (v != NULL && v != Py_None) {
623 err = PyFile_WriteString(": ", f);
624 if (err == 0)
625 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000626 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000627 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000628 if (err == 0)
629 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000630 }
Guido van Rossum82598051997-03-05 00:20:32 +0000631 Py_XDECREF(exception);
632 Py_XDECREF(v);
633 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000634 /* If an error happened here, don't show it.
635 XXX This is wrong, but too many callers rely on this behavior. */
636 if (err != 0)
637 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000638}
639
Guido van Rossum82598051997-03-05 00:20:32 +0000640PyObject *
641PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000642 char *str;
643 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000644 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000645{
Guido van Rossum82598051997-03-05 00:20:32 +0000646 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000647 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000648}
649
Guido van Rossum82598051997-03-05 00:20:32 +0000650PyObject *
651PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652 FILE *fp;
653 char *filename;
654 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000655 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656{
Guido van Rossum82598051997-03-05 00:20:32 +0000657 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000658 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000659}
660
Guido van Rossum82598051997-03-05 00:20:32 +0000661static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000662run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663 node *n;
664 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000665 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000666{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000667 if (n == NULL)
668 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 return run_node(n, filename, globals, locals);
670}
671
Guido van Rossum82598051997-03-05 00:20:32 +0000672static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000673run_node(n, filename, globals, locals)
674 node *n;
675 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000676 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000677{
Guido van Rossum82598051997-03-05 00:20:32 +0000678 PyCodeObject *co;
679 PyObject *v;
680 co = PyNode_Compile(n, filename);
681 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000682 if (co == NULL)
683 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000684 v = PyEval_EvalCode(co, globals, locals);
685 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686 return v;
687}
688
Guido van Rossum82598051997-03-05 00:20:32 +0000689static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000690run_pyc_file(fp, filename, globals, locals)
691 FILE *fp;
692 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000693 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000694{
Guido van Rossum82598051997-03-05 00:20:32 +0000695 PyCodeObject *co;
696 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000697 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000698 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000699
Guido van Rossum82598051997-03-05 00:20:32 +0000700 magic = PyMarshal_ReadLongFromFile(fp);
701 if (magic != PyImport_GetMagicNumber()) {
702 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000703 "Bad magic number in .pyc file");
704 return NULL;
705 }
Guido van Rossum82598051997-03-05 00:20:32 +0000706 (void) PyMarshal_ReadLongFromFile(fp);
707 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000708 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000709 if (v == NULL || !PyCode_Check(v)) {
710 Py_XDECREF(v);
711 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000712 "Bad code object in .pyc file");
713 return NULL;
714 }
Guido van Rossum82598051997-03-05 00:20:32 +0000715 co = (PyCodeObject *)v;
716 v = PyEval_EvalCode(co, globals, locals);
717 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000718 return v;
719}
720
Guido van Rossum82598051997-03-05 00:20:32 +0000721PyObject *
722Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000723 char *str;
724 char *filename;
725 int start;
726{
727 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000728 PyCodeObject *co;
729 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000730 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000731 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000732 co = PyNode_Compile(n, filename);
733 PyNode_Free(n);
734 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000735}
736
Guido van Rossuma110aa61994-08-29 12:50:44 +0000737/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000738
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739node *
Guido van Rossum82598051997-03-05 00:20:32 +0000740PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000741 FILE *fp;
742 char *filename;
743 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000744{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000745 node *n;
746 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000747 Py_BEGIN_ALLOW_THREADS
748 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000750 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000751 if (n == NULL)
752 err_input(&err);
753 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000754}
755
Guido van Rossuma110aa61994-08-29 12:50:44 +0000756/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000757
Guido van Rossuma110aa61994-08-29 12:50:44 +0000758node *
Guido van Rossum82598051997-03-05 00:20:32 +0000759PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000760 char *str;
761 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000762{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000763 node *n;
764 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000765 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000766 if (n == NULL)
767 err_input(&err);
768 return n;
769}
770
771/* Set the error appropriate to the given input error code (see errcode.h) */
772
773static void
774err_input(err)
775 perrdetail *err;
776{
Guido van Rossum82598051997-03-05 00:20:32 +0000777 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000779 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000780 err->lineno, err->offset, err->text);
781 if (err->text != NULL) {
782 free(err->text);
783 err->text = NULL;
784 }
785 switch (err->error) {
786 case E_SYNTAX:
787 msg = "invalid syntax";
788 break;
789 case E_TOKEN:
790 msg = "invalid token";
791
792 break;
793 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000794 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000795 return;
796 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000797 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000798 return;
799 case E_EOF:
800 msg = "unexpected EOF while parsing";
801 break;
802 default:
803 fprintf(stderr, "error=%d\n", err->error);
804 msg = "unknown parsing error";
805 break;
806 }
Guido van Rossum82598051997-03-05 00:20:32 +0000807 w = Py_BuildValue("(sO)", msg, v);
808 Py_XDECREF(v);
809 PyErr_SetObject(PyExc_SyntaxError, w);
810 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000811}
812
813/* Print fatal error message and abort */
814
815void
Guido van Rossum82598051997-03-05 00:20:32 +0000816Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000817 char *msg;
818{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000819 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000820#ifdef macintosh
821 for (;;);
822#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000823#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000824 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000825 OutputDebugString(msg);
826 OutputDebugString("\n");
827#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000828 abort();
829}
830
831/* Clean up and exit */
832
Guido van Rossuma110aa61994-08-29 12:50:44 +0000833#ifdef WITH_THREAD
834#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000835int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000836#endif
837
Guido van Rossum1662dd51994-09-07 14:38:28 +0000838#define NEXITFUNCS 32
839static void (*exitfuncs[NEXITFUNCS])();
840static int nexitfuncs = 0;
841
842int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000843 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000844{
845 if (nexitfuncs >= NEXITFUNCS)
846 return -1;
847 exitfuncs[nexitfuncs++] = func;
848 return 0;
849}
850
Guido van Rossumcc283f51997-08-05 02:22:03 +0000851static void
852call_sys_exitfunc()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000853{
Guido van Rossum82598051997-03-05 00:20:32 +0000854 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000855
856 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000857 PyObject *res;
858 Py_INCREF(exitfunc);
859 PySys_SetObject("exitfunc", (PyObject *)NULL);
860 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000861 if (res == NULL) {
862 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000863 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000864 }
Guido van Rossum82598051997-03-05 00:20:32 +0000865 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000866 }
867
Guido van Rossum82598051997-03-05 00:20:32 +0000868 Py_FlushLine();
Guido van Rossumcc283f51997-08-05 02:22:03 +0000869}
Guido van Rossum1662dd51994-09-07 14:38:28 +0000870
Guido van Rossumcc283f51997-08-05 02:22:03 +0000871static void
872call_ll_exitfuncs()
873{
Guido van Rossum1662dd51994-09-07 14:38:28 +0000874 while (nexitfuncs > 0)
875 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000876
877 fflush(stdout);
878 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000879}
880
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000881#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000882extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000883#endif
884
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000885void
Guido van Rossum82598051997-03-05 00:20:32 +0000886Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000887 int sts;
888{
Guido van Rossumcc283f51997-08-05 02:22:03 +0000889 Py_Finalize();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000890
Jack Jansen66a89771995-10-27 13:22:14 +0000891#ifdef macintosh
892 PyMac_Exit(sts);
893#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000894 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000895#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000896}
897
Guido van Rossuma110aa61994-08-29 12:50:44 +0000898#ifdef HAVE_SIGNAL_H
899static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000900sighandler(sig)
901 int sig;
902{
903 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossumcc283f51997-08-05 02:22:03 +0000904 /* Do essential exit processing only */
905 call_sys_exitfunc();
906 call_ll_exitfuncs();
Guido van Rossum478e7181997-05-06 15:24:59 +0000907#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000908 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000909#else
910 exit(1);
911#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000912 /*NOTREACHED*/
913}
914#endif
915
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000916static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000917initsigs()
918{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000919 RETSIGTYPE (*t)();
920#ifdef HAVE_SIGNAL_H
921#ifdef SIGPIPE
922 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000923#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000924#ifdef SIGHUP
925 t = signal(SIGHUP, SIG_IGN);
926 if (t == SIG_DFL)
927 signal(SIGHUP, sighandler);
928 else
929 signal(SIGHUP, t);
930#endif
931#ifdef SIGTERM
932 t = signal(SIGTERM, SIG_IGN);
933 if (t == SIG_DFL)
934 signal(SIGTERM, sighandler);
935 else
936 signal(SIGTERM, t);
937#endif
938#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000939 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000940}
941
Guido van Rossum25ce5661997-08-02 03:10:38 +0000942static void
943finisigs()
944{
945 PyOS_FiniInterrupts(); /* May imply finisignal() */
946}
947
Guido van Rossumaae0d321996-05-22 16:35:33 +0000948#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000949/* Ask a yes/no question */
950
Guido van Rossum59bff391992-09-03 20:28:00 +0000951int
Guido van Rossum82598051997-03-05 00:20:32 +0000952_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000953 char *prompt;
954{
955 char buf[256];
956
957 printf("%s [ny] ", prompt);
958 if (fgets(buf, sizeof buf, stdin) == NULL)
959 return 0;
960 return buf[0] == 'y' || buf[0] == 'Y';
961}
962#endif
963
Guido van Rossuma110aa61994-08-29 12:50:44 +0000964#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000965
966/* Check for file descriptor connected to interactive device.
967 Pretend that stdin is always interactive, other files never. */
968
969int
970isatty(fd)
971 int fd;
972{
973 return fd == fileno(stdin);
974}
975
976#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000977
978/*
979 * The file descriptor fd is considered ``interactive'' if either
980 * a) isatty(fd) is TRUE, or
981 * b) the -i flag was given, and the filename associated with
982 * the descriptor is NULL or "<stdin>" or "???".
983 */
984int
985Py_FdIsInteractive(fp, filename)
986 FILE *fp;
987 char *filename;
988{
989 if (isatty((int)fileno(fp)))
990 return 1;
991 if (!Py_InteractiveFlag)
992 return 0;
993 return (filename == NULL) ||
994 (strcmp(filename, "<stdin>") == 0) ||
995 (strcmp(filename, "???") == 0);
996}