blob: d0fe2fc8d7f80c499282ed0b332c4830536ee60f [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 Rossuma9e7dc11992-10-18 18:53:57 +000072
Guido van Rossum82598051997-03-05 00:20:32 +000073int Py_DebugFlag; /* Needed by parser.c */
74int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000075int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000076
Guido van Rossum25ce5661997-08-02 03:10:38 +000077static int initialized = 0;
Guido van Rossum1984f1e1992-08-04 12:41:02 +000078
Guido van Rossum25ce5661997-08-02 03:10:38 +000079/* Global initializations. Can be undone by Py_Finalize(). Don't
80 call this twice without an intervening Py_Finalize() call. When
81 initializations fail, a fatal error is issued and the function does
82 not return. On return, the first thread and interpreter state have
83 been created.
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084
Guido van Rossum25ce5661997-08-02 03:10:38 +000085 Locking: you must hold the interpreter lock while calling this.
86 (If the lock has not yet been initialized, that's equivalent to
87 having the lock, but you cannot use multiple threads.)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000088
Guido van Rossum25ce5661997-08-02 03:10:38 +000089*/
Guido van Rossuma027efa1997-05-05 20:56:21 +000090
91void
92Py_Initialize()
93{
Guido van Rossuma027efa1997-05-05 20:56:21 +000094 PyInterpreterState *interp;
Guido van Rossum25ce5661997-08-02 03:10:38 +000095 PyThreadState *tstate;
96 PyObject *bimod, *sysmod;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000097 char *p;
Guido van Rossumad6dfda1997-07-19 19:17:22 +000098
Guido van Rossum25ce5661997-08-02 03:10:38 +000099 if (initialized)
100 Py_FatalError("Py_Initialize: already initialized");
101 initialized = 1;
102
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000103 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
104 Py_DebugFlag = 1;
105 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
106 Py_VerboseFlag = 1;
107
Guido van Rossuma027efa1997-05-05 20:56:21 +0000108 interp = PyInterpreterState_New();
109 if (interp == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000110 Py_FatalError("Py_Initialize: can't make first interpreter");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000111
Guido van Rossuma027efa1997-05-05 20:56:21 +0000112 tstate = PyThreadState_New(interp);
113 if (tstate == NULL)
Guido van Rossum25ce5661997-08-02 03:10:38 +0000114 Py_FatalError("Py_Initialize: can't make first thread");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000115 (void) PyThreadState_Swap(tstate);
116
Guido van Rossum25ce5661997-08-02 03:10:38 +0000117 interp->modules = PyDict_New();
118 if (interp->modules == NULL)
119 Py_FatalError("Py_Initialize: can't make modules dictionary");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000120
Guido van Rossum25ce5661997-08-02 03:10:38 +0000121 bimod = _PyBuiltin_Init();
122 if (bimod == NULL)
123 Py_FatalError("Py_Initialize: can't initialize __builtin__");
124 interp->builtins = PyModule_GetDict(bimod);
125 Py_INCREF(interp->builtins);
126 _PyImport_FixupExtension("__builtin__", "__builtin__");
127
128 sysmod = _PySys_Init();
129 if (sysmod == NULL)
130 Py_FatalError("Py_Initialize: can't initialize sys");
131 interp->sysdict = PyModule_GetDict(sysmod);
132 Py_INCREF(interp->sysdict);
133 _PyImport_FixupExtension("sys", "sys");
Guido van Rossuma027efa1997-05-05 20:56:21 +0000134 PySys_SetPath(Py_GetPath());
Guido van Rossum25ce5661997-08-02 03:10:38 +0000135 PyDict_SetItemString(interp->sysdict, "modules",
136 interp->modules);
137
138 _PyImport_Init();
139
140 initsigs(); /* Signal handling stuff, including initintr() */
141
142 initmain(); /* Module __main__ */
143}
144
145/* Undo the effect of Py_Initialize().
146
147 Beware: if multiple interpreter and/or thread states exist, these
148 are not wiped out; only the current thread and interpreter state
149 are deleted. But since everything else is deleted, those other
150 interpreter and thread states should no longer be used.
151
152 (XXX We should do better, e.g. wipe out all interpreters and
153 threads.)
154
155 Locking: as above.
156
157*/
158
159void
160Py_Finalize()
161{
162 PyInterpreterState *interp;
163 PyThreadState *tstate;
164
165 if (!initialized)
166 Py_FatalError("Py_Finalize: not initialized");
167 initialized = 0;
168
169 tstate = PyThreadState_Get();
170 interp = tstate->interp;
171
172 PyImport_Cleanup();
173 PyInterpreterState_Clear(interp);
174 PyThreadState_Swap(NULL);
175 PyInterpreterState_Delete(interp);
176
177 finisigs();
178 _PyImport_Fini();
179 _PyBuiltin_Fini();
180 PyString_Fini();
181
182 PyGrammar_RemoveAccelerators(&_PyParser_Grammar);
183}
184
185/* Create and initialize a new interpreter and thread, and return the
186 new thread. This requires that Py_Initialize() has been called
187 first.
188
189 Unsuccessful initialization yields a NULL pointer. Note that *no*
190 exception information is available even in this case -- the
191 exception information is held in the thread, and there is no
192 thread.
193
194 Locking: as above.
195
196*/
197
198PyThreadState *
199Py_NewInterpreter()
200{
201 PyInterpreterState *interp;
202 PyThreadState *tstate, *save_tstate;
203 PyObject *bimod, *sysmod;
204
205 if (!initialized)
206 Py_FatalError("Py_NewInterpreter: call Py_Initialize first");
207
208 interp = PyInterpreterState_New();
209 if (interp == NULL)
210 return NULL;
211
212 tstate = PyThreadState_New(interp);
213 if (tstate == NULL) {
214 PyInterpreterState_Delete(interp);
215 return NULL;
216 }
217
218 save_tstate = PyThreadState_Swap(tstate);
219
220 /* XXX The following is lax in error checking */
221
222 interp->modules = PyDict_New();
223
224 bimod = _PyImport_FindExtension("__builtin__", "__builtin__");
225 if (bimod != NULL) {
226 interp->builtins = PyModule_GetDict(bimod);
227 Py_INCREF(interp->builtins);
228 }
229 sysmod = _PyImport_FindExtension("sys", "sys");
230 if (bimod != NULL && sysmod != NULL) {
231 interp->sysdict = PyModule_GetDict(sysmod);
232 Py_INCREF(interp->sysdict);
233 PySys_SetPath(Py_GetPath());
234 PyDict_SetItemString(interp->sysdict, "modules",
235 interp->modules);
236 initmain();
237 }
238
239 if (!PyErr_Occurred())
240 return tstate;
241
242 /* Oops, it didn't work. Undo it all. */
243
244 PyErr_Print();
245 PyThreadState_Clear(tstate);
246 PyThreadState_Swap(save_tstate);
247 PyThreadState_Delete(tstate);
248 PyInterpreterState_Delete(interp);
249
250 return NULL;
251}
252
253/* Delete an interpreter and its last thread. This requires that the
254 given thread state is current, that the thread has no remaining
255 frames, and that it is its interpreter's only remaining thread.
256 It is a fatal error to violate these constraints.
257
258 (Py_Finalize() doesn't have these constraints -- it zaps
259 everything, regardless.)
260
261 Locking: as above.
262
263*/
264
265void
266Py_EndInterpreter(tstate)
267 PyThreadState *tstate;
268{
269 PyInterpreterState *interp = tstate->interp;
270
271 if (tstate != PyThreadState_Get())
272 Py_FatalError("Py_EndInterpreter: thread is not current");
273 if (tstate->frame != NULL)
274 Py_FatalError("Py_EndInterpreter: thread still has a frame");
275 if (tstate != interp->tstate_head || tstate->next != NULL)
276 Py_FatalError("Py_EndInterpreter: not the last thread");
277
278 PyImport_Cleanup();
279 PyInterpreterState_Clear(interp);
280 PyThreadState_Swap(NULL);
281 PyInterpreterState_Delete(interp);
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000282}
283
284static char *progname = "python";
285
286void
287Py_SetProgramName(pn)
288 char *pn;
289{
290 if (pn && *pn)
291 progname = pn;
292}
293
294char *
295Py_GetProgramName()
296{
297 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000298}
299
300/*
301 Py_Initialize()
302 -- do everything, no-op on second call, call fatal on failure, set path
303
304 #2
305 -- create new interp+tstate & make it current, return NULL on failure,
306 make it current, do all setup, set path
307
308 #3
309 -- #2 without set path
310
311 #4
312 -- is there any point to #3 for caller-provided current interp+tstate?
313
314*/
315
Guido van Rossum6135a871995-01-09 17:53:26 +0000316/* Create __main__ module */
317
318static void
319initmain()
320{
Guido van Rossum82598051997-03-05 00:20:32 +0000321 PyObject *m, *d;
322 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000323 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000324 Py_FatalError("can't create __main__ module");
325 d = PyModule_GetDict(m);
326 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
327 if (PyDict_SetItemString(d, "__builtins__",
328 PyEval_GetBuiltins()))
329 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000330 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331}
332
333/* Parse input from a file and execute it */
334
335int
Guido van Rossum82598051997-03-05 00:20:32 +0000336PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000337 FILE *fp;
338 char *filename;
339{
340 if (filename == NULL)
341 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000342 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000343 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344 else
Guido van Rossum82598051997-03-05 00:20:32 +0000345 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000346}
347
348int
Guido van Rossum82598051997-03-05 00:20:32 +0000349PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000350 FILE *fp;
351 char *filename;
352{
Guido van Rossum82598051997-03-05 00:20:32 +0000353 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000354 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000355 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000357 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
358 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000359 }
Guido van Rossum82598051997-03-05 00:20:32 +0000360 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000362 PySys_SetObject("ps2", v = PyString_FromString("... "));
363 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000364 }
365 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000366 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000367#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000368 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369#endif
370 if (ret == E_EOF)
371 return 0;
372 /*
373 if (ret == E_NOMEM)
374 return -1;
375 */
376 }
377}
378
379int
Guido van Rossum82598051997-03-05 00:20:32 +0000380PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381 FILE *fp;
382 char *filename;
383{
Guido van Rossum82598051997-03-05 00:20:32 +0000384 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000385 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000386 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000387 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000388 v = PySys_GetObject("ps1");
389 w = PySys_GetObject("ps2");
390 if (v != NULL && PyString_Check(v)) {
391 Py_INCREF(v);
392 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000393 }
394 else {
395 v = NULL;
396 ps1 = "";
397 }
Guido van Rossum82598051997-03-05 00:20:32 +0000398 if (w != NULL && PyString_Check(w)) {
399 Py_INCREF(w);
400 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000401 }
402 else {
403 w = NULL;
404 ps2 = "";
405 }
Guido van Rossum82598051997-03-05 00:20:32 +0000406 Py_BEGIN_ALLOW_THREADS
407 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000408 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000409 Py_END_ALLOW_THREADS
410 Py_XDECREF(v);
411 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000412 if (n == NULL) {
413 if (err.error == E_EOF) {
414 if (err.text)
415 free(err.text);
416 return E_EOF;
417 }
418 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000419 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000420 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000421 }
Guido van Rossum82598051997-03-05 00:20:32 +0000422 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000423 if (m == NULL)
424 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000425 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000427 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000428 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000429 return -1;
430 }
Guido van Rossum82598051997-03-05 00:20:32 +0000431 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000432 if (Py_FlushLine())
433 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434 return 0;
435}
436
437int
Guido van Rossum82598051997-03-05 00:20:32 +0000438PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439 FILE *fp;
440 char *filename;
441{
Guido van Rossum82598051997-03-05 00:20:32 +0000442 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000443 char *ext;
444
Guido van Rossum82598051997-03-05 00:20:32 +0000445 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000446 if (m == NULL)
447 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000448 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000449 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000450 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000451#ifdef macintosh
452 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000453 || getfiletype(filename) == 'PYC '
454 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000455#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000456 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000457 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000458 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000459 if( (fp = fopen(filename, "rb")) == NULL ) {
460 fprintf(stderr, "python: Can't reopen .pyc file\n");
461 return -1;
462 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000463 /* Turn on optimization if a .pyo file is given */
464 if (strcmp(ext, ".pyo") == 0)
465 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000466 v = run_pyc_file(fp, filename, d, d);
467 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000468 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000469 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000470 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000471 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000472 return -1;
473 }
Guido van Rossum82598051997-03-05 00:20:32 +0000474 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000475 if (Py_FlushLine())
476 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000477 return 0;
478}
479
480int
Guido van Rossum82598051997-03-05 00:20:32 +0000481PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000482 char *command;
483{
Guido van Rossum82598051997-03-05 00:20:32 +0000484 PyObject *m, *d, *v;
485 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000486 if (m == NULL)
487 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000488 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000489 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000490 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000491 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000492 return -1;
493 }
Guido van Rossum82598051997-03-05 00:20:32 +0000494 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000495 if (Py_FlushLine())
496 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000497 return 0;
498}
499
500void
Guido van Rossum82598051997-03-05 00:20:32 +0000501PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000503 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000504 PyObject *exception, *v, *tb, *f;
505 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000507 return;
Guido van Rossum82598051997-03-05 00:20:32 +0000508 if (exception == PyExc_SystemExit) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000509 err = Py_FlushLine();
510 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000511 if (v == NULL || v == Py_None)
512 Py_Exit(0);
513 if (PyInt_Check(v))
514 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000516 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000517 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000518 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000519 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000520 }
521 }
Guido van Rossum82598051997-03-05 00:20:32 +0000522 PySys_SetObject("last_type", exception);
523 PySys_SetObject("last_value", v);
524 PySys_SetObject("last_traceback", tb);
525 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000526 if (f == NULL)
527 fprintf(stderr, "lost sys.stderr\n");
528 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000529 err = Py_FlushLine();
530 fflush(stdout);
531 if (err == 0)
532 err = PyTraceBack_Print(tb, f);
533 if (err == 0 && exception == PyExc_SyntaxError) {
Guido van Rossum82598051997-03-05 00:20:32 +0000534 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000535 char *filename, *text;
536 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000537 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000538 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000539 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000540 else {
541 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000542 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000543 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000544 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000545 else
Guido van Rossum82598051997-03-05 00:20:32 +0000546 PyFile_WriteString(filename, f);
547 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000548 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000549 PyFile_WriteString(buf, f);
550 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000551 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000552 char *nl;
553 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000554 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000555 offset--;
556 for (;;) {
557 nl = strchr(text, '\n');
558 if (nl == NULL ||
559 nl-text >= offset)
560 break;
561 offset -= (nl+1-text);
562 text = nl+1;
563 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000564 while (*text == ' ' || *text == '\t') {
565 text++;
566 offset--;
567 }
Guido van Rossum82598051997-03-05 00:20:32 +0000568 PyFile_WriteString(" ", f);
569 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570 if (*text == '\0' ||
571 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000572 PyFile_WriteString("\n", f);
573 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000574 offset--;
575 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000576 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000577 offset--;
578 }
Guido van Rossum82598051997-03-05 00:20:32 +0000579 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000580 }
Guido van Rossum82598051997-03-05 00:20:32 +0000581 Py_INCREF(message);
582 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000583 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000584 /* Can't be bothered to check all those
585 PyFile_WriteString() calls */
586 if (PyErr_Occurred())
587 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000588 }
589 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000590 if (err) {
591 /* Don't do anything else */
592 }
593 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000594 PyObject* className =
595 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000596 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000597 err = PyFile_WriteString("<unknown>", f);
598 else
599 err = PyFile_WriteObject(className, f,
600 Py_PRINT_RAW);
601 }
602 else
603 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
604 if (err == 0) {
605 if (v != NULL && v != Py_None) {
606 err = PyFile_WriteString(": ", f);
607 if (err == 0)
608 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000609 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000610 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000611 if (err == 0)
612 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000613 }
Guido van Rossum82598051997-03-05 00:20:32 +0000614 Py_XDECREF(exception);
615 Py_XDECREF(v);
616 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000617 /* If an error happened here, don't show it.
618 XXX This is wrong, but too many callers rely on this behavior. */
619 if (err != 0)
620 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000621}
622
Guido van Rossum82598051997-03-05 00:20:32 +0000623PyObject *
624PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000625 char *str;
626 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000627 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000628{
Guido van Rossum82598051997-03-05 00:20:32 +0000629 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000630 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000631}
632
Guido van Rossum82598051997-03-05 00:20:32 +0000633PyObject *
634PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000635 FILE *fp;
636 char *filename;
637 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000638 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000639{
Guido van Rossum82598051997-03-05 00:20:32 +0000640 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000641 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000642}
643
Guido van Rossum82598051997-03-05 00:20:32 +0000644static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000645run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000646 node *n;
647 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000648 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000649{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000650 if (n == NULL)
651 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652 return run_node(n, filename, globals, locals);
653}
654
Guido van Rossum82598051997-03-05 00:20:32 +0000655static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656run_node(n, filename, globals, locals)
657 node *n;
658 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000659 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000660{
Guido van Rossum82598051997-03-05 00:20:32 +0000661 PyCodeObject *co;
662 PyObject *v;
663 co = PyNode_Compile(n, filename);
664 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000665 if (co == NULL)
666 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000667 v = PyEval_EvalCode(co, globals, locals);
668 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669 return v;
670}
671
Guido van Rossum82598051997-03-05 00:20:32 +0000672static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000673run_pyc_file(fp, filename, globals, locals)
674 FILE *fp;
675 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000676 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000677{
Guido van Rossum82598051997-03-05 00:20:32 +0000678 PyCodeObject *co;
679 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000680 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000681 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000682
Guido van Rossum82598051997-03-05 00:20:32 +0000683 magic = PyMarshal_ReadLongFromFile(fp);
684 if (magic != PyImport_GetMagicNumber()) {
685 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000686 "Bad magic number in .pyc file");
687 return NULL;
688 }
Guido van Rossum82598051997-03-05 00:20:32 +0000689 (void) PyMarshal_ReadLongFromFile(fp);
690 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000691 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000692 if (v == NULL || !PyCode_Check(v)) {
693 Py_XDECREF(v);
694 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000695 "Bad code object in .pyc file");
696 return NULL;
697 }
Guido van Rossum82598051997-03-05 00:20:32 +0000698 co = (PyCodeObject *)v;
699 v = PyEval_EvalCode(co, globals, locals);
700 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000701 return v;
702}
703
Guido van Rossum82598051997-03-05 00:20:32 +0000704PyObject *
705Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000706 char *str;
707 char *filename;
708 int start;
709{
710 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000711 PyCodeObject *co;
712 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000713 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000714 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000715 co = PyNode_Compile(n, filename);
716 PyNode_Free(n);
717 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000718}
719
Guido van Rossuma110aa61994-08-29 12:50:44 +0000720/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000721
Guido van Rossuma110aa61994-08-29 12:50:44 +0000722node *
Guido van Rossum82598051997-03-05 00:20:32 +0000723PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000724 FILE *fp;
725 char *filename;
726 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000727{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000728 node *n;
729 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000730 Py_BEGIN_ALLOW_THREADS
731 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000732 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000733 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000734 if (n == NULL)
735 err_input(&err);
736 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000737}
738
Guido van Rossuma110aa61994-08-29 12:50:44 +0000739/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000740
Guido van Rossuma110aa61994-08-29 12:50:44 +0000741node *
Guido van Rossum82598051997-03-05 00:20:32 +0000742PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000743 char *str;
744 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000745{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000746 node *n;
747 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000748 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000749 if (n == NULL)
750 err_input(&err);
751 return n;
752}
753
754/* Set the error appropriate to the given input error code (see errcode.h) */
755
756static void
757err_input(err)
758 perrdetail *err;
759{
Guido van Rossum82598051997-03-05 00:20:32 +0000760 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000762 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000763 err->lineno, err->offset, err->text);
764 if (err->text != NULL) {
765 free(err->text);
766 err->text = NULL;
767 }
768 switch (err->error) {
769 case E_SYNTAX:
770 msg = "invalid syntax";
771 break;
772 case E_TOKEN:
773 msg = "invalid token";
774
775 break;
776 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000777 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000778 return;
779 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000780 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000781 return;
782 case E_EOF:
783 msg = "unexpected EOF while parsing";
784 break;
785 default:
786 fprintf(stderr, "error=%d\n", err->error);
787 msg = "unknown parsing error";
788 break;
789 }
Guido van Rossum82598051997-03-05 00:20:32 +0000790 w = Py_BuildValue("(sO)", msg, v);
791 Py_XDECREF(v);
792 PyErr_SetObject(PyExc_SyntaxError, w);
793 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000794}
795
796/* Print fatal error message and abort */
797
798void
Guido van Rossum82598051997-03-05 00:20:32 +0000799Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000800 char *msg;
801{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000802 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000803#ifdef macintosh
804 for (;;);
805#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000806#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000807 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000808 OutputDebugString(msg);
809 OutputDebugString("\n");
810#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000811 abort();
812}
813
814/* Clean up and exit */
815
Guido van Rossuma110aa61994-08-29 12:50:44 +0000816#ifdef WITH_THREAD
817#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000818int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000819#endif
820
Guido van Rossum1662dd51994-09-07 14:38:28 +0000821#define NEXITFUNCS 32
822static void (*exitfuncs[NEXITFUNCS])();
823static int nexitfuncs = 0;
824
825int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000826 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000827{
828 if (nexitfuncs >= NEXITFUNCS)
829 return -1;
830 exitfuncs[nexitfuncs++] = func;
831 return 0;
832}
833
Guido van Rossuma110aa61994-08-29 12:50:44 +0000834void
Guido van Rossum82598051997-03-05 00:20:32 +0000835Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000836{
Guido van Rossum82598051997-03-05 00:20:32 +0000837 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000838
839 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000840 PyObject *res;
841 Py_INCREF(exitfunc);
842 PySys_SetObject("exitfunc", (PyObject *)NULL);
843 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000844 if (res == NULL) {
845 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000846 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000847 }
Guido van Rossum82598051997-03-05 00:20:32 +0000848 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000849 }
850
Guido van Rossum82598051997-03-05 00:20:32 +0000851 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000852
Guido van Rossum25ce5661997-08-02 03:10:38 +0000853 Py_Finalize();
854
Guido van Rossum1662dd51994-09-07 14:38:28 +0000855 while (nexitfuncs > 0)
856 (*exitfuncs[--nexitfuncs])();
Guido van Rossum25ce5661997-08-02 03:10:38 +0000857
858 fflush(stdout);
859 fflush(stderr);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000860}
861
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000862#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000863extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000864#endif
865
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000866void
Guido van Rossum82598051997-03-05 00:20:32 +0000867Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000868 int sts;
869{
Guido van Rossum82598051997-03-05 00:20:32 +0000870 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000871
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000872#ifdef COUNT_ALLOCS
873 dump_counts();
874#endif
875
Guido van Rossumaae0d321996-05-22 16:35:33 +0000876#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000877 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000878#endif
879
Guido van Rossumaae0d321996-05-22 16:35:33 +0000880#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000881 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000882 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000883 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000884#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000885
Jack Jansen66a89771995-10-27 13:22:14 +0000886#ifdef macintosh
887 PyMac_Exit(sts);
888#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000889 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000890#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000891}
892
Guido van Rossuma110aa61994-08-29 12:50:44 +0000893#ifdef HAVE_SIGNAL_H
894static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000895sighandler(sig)
896 int sig;
897{
898 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000899 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossum478e7181997-05-06 15:24:59 +0000900#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000901 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000902#else
903 exit(1);
904#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000905 /*NOTREACHED*/
906}
907#endif
908
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000909static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000910initsigs()
911{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000912 RETSIGTYPE (*t)();
913#ifdef HAVE_SIGNAL_H
914#ifdef SIGPIPE
915 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000916#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000917#ifdef SIGHUP
918 t = signal(SIGHUP, SIG_IGN);
919 if (t == SIG_DFL)
920 signal(SIGHUP, sighandler);
921 else
922 signal(SIGHUP, t);
923#endif
924#ifdef SIGTERM
925 t = signal(SIGTERM, SIG_IGN);
926 if (t == SIG_DFL)
927 signal(SIGTERM, sighandler);
928 else
929 signal(SIGTERM, t);
930#endif
931#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000932 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000933}
934
Guido van Rossum25ce5661997-08-02 03:10:38 +0000935static void
936finisigs()
937{
938 PyOS_FiniInterrupts(); /* May imply finisignal() */
939}
940
Guido van Rossumaae0d321996-05-22 16:35:33 +0000941#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000942/* Ask a yes/no question */
943
Guido van Rossum59bff391992-09-03 20:28:00 +0000944int
Guido van Rossum82598051997-03-05 00:20:32 +0000945_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000946 char *prompt;
947{
948 char buf[256];
949
950 printf("%s [ny] ", prompt);
951 if (fgets(buf, sizeof buf, stdin) == NULL)
952 return 0;
953 return buf[0] == 'y' || buf[0] == 'Y';
954}
955#endif
956
Guido van Rossuma110aa61994-08-29 12:50:44 +0000957#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000958
959/* Check for file descriptor connected to interactive device.
960 Pretend that stdin is always interactive, other files never. */
961
962int
963isatty(fd)
964 int fd;
965{
966 return fd == fileno(stdin);
967}
968
969#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000970
971/*
972 * The file descriptor fd is considered ``interactive'' if either
973 * a) isatty(fd) is TRUE, or
974 * b) the -i flag was given, and the filename associated with
975 * the descriptor is NULL or "<stdin>" or "???".
976 */
977int
978Py_FdIsInteractive(fp, filename)
979 FILE *fp;
980 char *filename;
981{
982 if (isatty((int)fileno(fp)))
983 return 1;
984 if (!Py_InteractiveFlag)
985 return 0;
986 return (filename == NULL) ||
987 (strcmp(filename, "<stdin>") == 0) ||
988 (strcmp(filename, "???") == 0);
989}