blob: caa0a4cce5c7d21d082a2f9a7a6ecfb758c02c36 [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 Rossumbefa14f1995-09-18 21:42:42 +000039#undef argument /* Avoid conflict on Mac */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000040#include "errcode.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000042#include "eval.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000043#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000044
Guido van Rossum80bb9651996-12-05 23:27:02 +000045#ifdef HAVE_UNISTD_H
46#include <unistd.h>
47#endif
48
Guido van Rossuma110aa61994-08-29 12:50:44 +000049#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000050#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000051#endif
52
Guido van Rossum9b38a141996-09-11 23:12:24 +000053#ifdef MS_WIN32
Guido van Rossuma44823b1995-03-14 15:01:17 +000054#undef BYTE
Guido van Rossum4f1c59b1996-04-09 02:37:03 +000055#undef arglist
Guido van Rossuma44823b1995-03-14 15:01:17 +000056#include "windows.h"
57#endif
58
Guido van Rossum82598051997-03-05 00:20:32 +000059extern char *Py_GetPath();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000060
Guido van Rossum82598051997-03-05 00:20:32 +000061extern grammar _PyParser_Grammar; /* From graminit.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000062
Guido van Rossumb73cc041993-11-01 16:28:59 +000063/* Forward */
Guido van Rossum82598051997-03-05 00:20:32 +000064static void initmain Py_PROTO((void));
65static PyObject *run_err_node Py_PROTO((node *n, char *filename,
66 PyObject *globals, PyObject *locals));
67static PyObject *run_node Py_PROTO((node *n, char *filename,
68 PyObject *globals, PyObject *locals));
69static PyObject *run_pyc_file Py_PROTO((FILE *fp, char *filename,
70 PyObject *globals, PyObject *locals));
71static void err_input Py_PROTO((perrdetail *));
72static void initsigs Py_PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000073
Guido van Rossum82598051997-03-05 00:20:32 +000074int Py_DebugFlag; /* Needed by parser.c */
75int Py_VerboseFlag; /* Needed by import.c */
Guido van Rossum7433b121997-02-14 19:45:36 +000076int Py_InteractiveFlag; /* Needed by Py_FdIsInteractive() below */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000077
Guido van Rossuma027efa1997-05-05 20:56:21 +000078/* Initialize the current interpreter; pass in the Python path. */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000079
80void
Guido van Rossuma027efa1997-05-05 20:56:21 +000081Py_Setup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082{
Guido van Rossum82598051997-03-05 00:20:32 +000083 PyImport_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000084
Guido van Rossuma110aa61994-08-29 12:50:44 +000085 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086 they are needed by random bits of the interpreter.
87 All other modules are optional and are initialized
88 when they are first imported. */
89
Guido van Rossum82598051997-03-05 00:20:32 +000090 PyBuiltin_Init(); /* Also initializes builtin exceptions */
91 PySys_Init();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000092
Guido van Rossum82598051997-03-05 00:20:32 +000093 PySys_SetPath(Py_GetPath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000094
95 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum6135a871995-01-09 17:53:26 +000096
97 initmain();
98}
99
Guido van Rossuma027efa1997-05-05 20:56:21 +0000100/* Create and interpreter and thread state and initialize them;
101 if we already have an interpreter and thread, do nothing.
102 Fatal error if the creation fails. */
103
104void
105Py_Initialize()
106{
107 PyThreadState *tstate;
108 PyInterpreterState *interp;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000109 char *p;
110
Guido van Rossuma027efa1997-05-05 20:56:21 +0000111 if (PyThreadState_Get())
112 return;
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000113
114 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
115 Py_DebugFlag = 1;
116 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
117 Py_VerboseFlag = 1;
118
Guido van Rossuma027efa1997-05-05 20:56:21 +0000119 interp = PyInterpreterState_New();
120 if (interp == NULL)
121 Py_FatalError("PyInterpreterState_New() failed");
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000122
Guido van Rossuma027efa1997-05-05 20:56:21 +0000123 tstate = PyThreadState_New(interp);
124 if (tstate == NULL)
125 Py_FatalError("PyThreadState_New() failed");
126 (void) PyThreadState_Swap(tstate);
127
128 Py_Setup();
129
130 PySys_SetPath(Py_GetPath());
Guido van Rossumad6dfda1997-07-19 19:17:22 +0000131 /* XXX Who should set the path -- Setup or Initialize? */
132}
133
134static char *progname = "python";
135
136void
137Py_SetProgramName(pn)
138 char *pn;
139{
140 if (pn && *pn)
141 progname = pn;
142}
143
144char *
145Py_GetProgramName()
146{
147 return progname;
Guido van Rossuma027efa1997-05-05 20:56:21 +0000148}
149
150/*
151 Py_Initialize()
152 -- do everything, no-op on second call, call fatal on failure, set path
153
154 #2
155 -- create new interp+tstate & make it current, return NULL on failure,
156 make it current, do all setup, set path
157
158 #3
159 -- #2 without set path
160
161 #4
162 -- is there any point to #3 for caller-provided current interp+tstate?
163
164*/
165
Guido van Rossum6135a871995-01-09 17:53:26 +0000166/* Create __main__ module */
167
168static void
169initmain()
170{
Guido van Rossum82598051997-03-05 00:20:32 +0000171 PyObject *m, *d;
172 m = PyImport_AddModule("__main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000173 if (m == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000174 Py_FatalError("can't create __main__ module");
175 d = PyModule_GetDict(m);
176 if (PyDict_GetItemString(d, "__builtins__") == NULL) {
177 if (PyDict_SetItemString(d, "__builtins__",
178 PyEval_GetBuiltins()))
179 Py_FatalError("can't add __builtins__ to __main__");
Guido van Rossum6135a871995-01-09 17:53:26 +0000180 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181}
182
183/* Parse input from a file and execute it */
184
185int
Guido van Rossum82598051997-03-05 00:20:32 +0000186PyRun_AnyFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187 FILE *fp;
188 char *filename;
189{
190 if (filename == NULL)
191 filename = "???";
Guido van Rossum7433b121997-02-14 19:45:36 +0000192 if (Py_FdIsInteractive(fp, filename))
Guido van Rossum82598051997-03-05 00:20:32 +0000193 return PyRun_InteractiveLoop(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000194 else
Guido van Rossum82598051997-03-05 00:20:32 +0000195 return PyRun_SimpleFile(fp, filename);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000196}
197
198int
Guido van Rossum82598051997-03-05 00:20:32 +0000199PyRun_InteractiveLoop(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000200 FILE *fp;
201 char *filename;
202{
Guido van Rossum82598051997-03-05 00:20:32 +0000203 PyObject *v;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000204 int ret;
Guido van Rossum82598051997-03-05 00:20:32 +0000205 v = PySys_GetObject("ps1");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000206 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000207 PySys_SetObject("ps1", v = PyString_FromString(">>> "));
208 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000209 }
Guido van Rossum82598051997-03-05 00:20:32 +0000210 v = PySys_GetObject("ps2");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000211 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000212 PySys_SetObject("ps2", v = PyString_FromString("... "));
213 Py_XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000214 }
215 for (;;) {
Guido van Rossum82598051997-03-05 00:20:32 +0000216 ret = PyRun_InteractiveOne(fp, filename);
Guido van Rossumaae0d321996-05-22 16:35:33 +0000217#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000218 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000219#endif
220 if (ret == E_EOF)
221 return 0;
222 /*
223 if (ret == E_NOMEM)
224 return -1;
225 */
226 }
227}
228
229int
Guido van Rossum82598051997-03-05 00:20:32 +0000230PyRun_InteractiveOne(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000231 FILE *fp;
232 char *filename;
233{
Guido van Rossum82598051997-03-05 00:20:32 +0000234 PyObject *m, *d, *v, *w;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000235 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000236 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000237 char *ps1, *ps2;
Guido van Rossum82598051997-03-05 00:20:32 +0000238 v = PySys_GetObject("ps1");
239 w = PySys_GetObject("ps2");
240 if (v != NULL && PyString_Check(v)) {
241 Py_INCREF(v);
242 ps1 = PyString_AsString(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000243 }
244 else {
245 v = NULL;
246 ps1 = "";
247 }
Guido van Rossum82598051997-03-05 00:20:32 +0000248 if (w != NULL && PyString_Check(w)) {
249 Py_INCREF(w);
250 ps2 = PyString_AsString(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251 }
252 else {
253 w = NULL;
254 ps2 = "";
255 }
Guido van Rossum82598051997-03-05 00:20:32 +0000256 Py_BEGIN_ALLOW_THREADS
257 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar,
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000258 Py_single_input, ps1, ps2, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000259 Py_END_ALLOW_THREADS
260 Py_XDECREF(v);
261 Py_XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000262 if (n == NULL) {
263 if (err.error == E_EOF) {
264 if (err.text)
265 free(err.text);
266 return E_EOF;
267 }
268 err_input(&err);
Guido van Rossum82598051997-03-05 00:20:32 +0000269 PyErr_Print();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000270 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000271 }
Guido van Rossum82598051997-03-05 00:20:32 +0000272 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000273 if (m == NULL)
274 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000275 d = PyModule_GetDict(m);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000276 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000277 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000278 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000279 return -1;
280 }
Guido van Rossum82598051997-03-05 00:20:32 +0000281 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000282 if (Py_FlushLine())
283 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000284 return 0;
285}
286
287int
Guido van Rossum82598051997-03-05 00:20:32 +0000288PyRun_SimpleFile(fp, filename)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000289 FILE *fp;
290 char *filename;
291{
Guido van Rossum82598051997-03-05 00:20:32 +0000292 PyObject *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000293 char *ext;
294
Guido van Rossum82598051997-03-05 00:20:32 +0000295 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000296 if (m == NULL)
297 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000298 d = PyModule_GetDict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000299 ext = filename + strlen(filename) - 4;
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000300 if (strcmp(ext, ".pyc") == 0 || strcmp(ext, ".pyo") == 0
Jack Jansenbd06e961995-02-13 11:44:56 +0000301#ifdef macintosh
302 /* On a mac, we also assume a pyc file for types 'PYC ' and 'APPL' */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000303 || getfiletype(filename) == 'PYC '
304 || getfiletype(filename) == 'APPL'
Jack Jansenbd06e961995-02-13 11:44:56 +0000305#endif /* macintosh */
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000306 ) {
Guido van Rossumfdef2711994-09-14 13:31:04 +0000307 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000308 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000309 if( (fp = fopen(filename, "rb")) == NULL ) {
310 fprintf(stderr, "python: Can't reopen .pyc file\n");
311 return -1;
312 }
Guido van Rossum2a7f58d1997-04-02 05:28:38 +0000313 /* Turn on optimization if a .pyo file is given */
314 if (strcmp(ext, ".pyo") == 0)
315 Py_OptimizeFlag = 1;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000316 v = run_pyc_file(fp, filename, d, d);
317 } else {
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000318 v = PyRun_File(fp, filename, Py_file_input, d, d);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000319 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000320 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000321 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322 return -1;
323 }
Guido van Rossum82598051997-03-05 00:20:32 +0000324 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000325 if (Py_FlushLine())
326 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000327 return 0;
328}
329
330int
Guido van Rossum82598051997-03-05 00:20:32 +0000331PyRun_SimpleString(command)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332 char *command;
333{
Guido van Rossum82598051997-03-05 00:20:32 +0000334 PyObject *m, *d, *v;
335 m = PyImport_AddModule("__main__");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000336 if (m == NULL)
337 return -1;
Guido van Rossum82598051997-03-05 00:20:32 +0000338 d = PyModule_GetDict(m);
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000339 v = PyRun_String(command, Py_file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340 if (v == NULL) {
Guido van Rossum82598051997-03-05 00:20:32 +0000341 PyErr_Print();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342 return -1;
343 }
Guido van Rossum82598051997-03-05 00:20:32 +0000344 Py_DECREF(v);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000345 if (Py_FlushLine())
346 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347 return 0;
348}
349
350void
Guido van Rossum82598051997-03-05 00:20:32 +0000351PyErr_Print()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000352{
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000353 int err = 0;
Guido van Rossum82598051997-03-05 00:20:32 +0000354 PyObject *exception, *v, *tb, *f;
355 PyErr_Fetch(&exception, &v, &tb);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000356 if (exception == NULL)
Guido van Rossum296b4751997-05-23 00:19:20 +0000357 return;
Guido van Rossum82598051997-03-05 00:20:32 +0000358 if (exception == PyExc_SystemExit) {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000359 err = Py_FlushLine();
360 fflush(stdout);
Guido van Rossum82598051997-03-05 00:20:32 +0000361 if (v == NULL || v == Py_None)
362 Py_Exit(0);
363 if (PyInt_Check(v))
364 Py_Exit((int)PyInt_AsLong(v));
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000366 /* OK to use real stderr here */
Guido van Rossum82598051997-03-05 00:20:32 +0000367 PyObject_Print(v, stderr, Py_PRINT_RAW);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000368 fprintf(stderr, "\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000369 Py_Exit(1);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000370 }
371 }
Guido van Rossum82598051997-03-05 00:20:32 +0000372 PySys_SetObject("last_type", exception);
373 PySys_SetObject("last_value", v);
374 PySys_SetObject("last_traceback", tb);
375 f = PySys_GetObject("stderr");
Guido van Rossum3165fe61992-09-25 21:59:05 +0000376 if (f == NULL)
377 fprintf(stderr, "lost sys.stderr\n");
378 else {
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000379 err = Py_FlushLine();
380 fflush(stdout);
381 if (err == 0)
382 err = PyTraceBack_Print(tb, f);
383 if (err == 0 && exception == PyExc_SyntaxError) {
Guido van Rossum82598051997-03-05 00:20:32 +0000384 PyObject *message;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000385 char *filename, *text;
386 int lineno, offset;
Guido van Rossum82598051997-03-05 00:20:32 +0000387 if (!PyArg_Parse(v, "(O(ziiz))", &message,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000388 &filename, &lineno, &offset, &text))
Guido van Rossum82598051997-03-05 00:20:32 +0000389 PyErr_Clear();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000390 else {
391 char buf[10];
Guido van Rossum82598051997-03-05 00:20:32 +0000392 PyFile_WriteString(" File \"", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000393 if (filename == NULL)
Guido van Rossum82598051997-03-05 00:20:32 +0000394 PyFile_WriteString("<string>", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000395 else
Guido van Rossum82598051997-03-05 00:20:32 +0000396 PyFile_WriteString(filename, f);
397 PyFile_WriteString("\", line ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000398 sprintf(buf, "%d", lineno);
Guido van Rossum82598051997-03-05 00:20:32 +0000399 PyFile_WriteString(buf, f);
400 PyFile_WriteString("\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000401 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000402 char *nl;
403 if (offset > 0 &&
Guido van Rossum478e7181997-05-06 15:24:59 +0000404 offset == (int)strlen(text))
Guido van Rossum798199d1994-09-19 08:08:50 +0000405 offset--;
406 for (;;) {
407 nl = strchr(text, '\n');
408 if (nl == NULL ||
409 nl-text >= offset)
410 break;
411 offset -= (nl+1-text);
412 text = nl+1;
413 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000414 while (*text == ' ' || *text == '\t') {
415 text++;
416 offset--;
417 }
Guido van Rossum82598051997-03-05 00:20:32 +0000418 PyFile_WriteString(" ", f);
419 PyFile_WriteString(text, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000420 if (*text == '\0' ||
421 text[strlen(text)-1] != '\n')
Guido van Rossum82598051997-03-05 00:20:32 +0000422 PyFile_WriteString("\n", f);
423 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000424 offset--;
425 while (offset > 0) {
Guido van Rossum82598051997-03-05 00:20:32 +0000426 PyFile_WriteString(" ", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000427 offset--;
428 }
Guido van Rossum82598051997-03-05 00:20:32 +0000429 PyFile_WriteString("^\n", f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000430 }
Guido van Rossum82598051997-03-05 00:20:32 +0000431 Py_INCREF(message);
432 Py_DECREF(v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000433 v = message;
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000434 /* Can't be bothered to check all those
435 PyFile_WriteString() calls */
436 if (PyErr_Occurred())
437 err = -1;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000438 }
439 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000440 if (err) {
441 /* Don't do anything else */
442 }
443 else if (PyClass_Check(exception)) {
Guido van Rossum82598051997-03-05 00:20:32 +0000444 PyObject* className =
445 ((PyClassObject*)exception)->cl_name;
Guido van Rossum262e1241995-02-07 15:30:45 +0000446 if (className == NULL)
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000447 err = PyFile_WriteString("<unknown>", f);
448 else
449 err = PyFile_WriteObject(className, f,
450 Py_PRINT_RAW);
451 }
452 else
453 err = PyFile_WriteObject(exception, f, Py_PRINT_RAW);
454 if (err == 0) {
455 if (v != NULL && v != Py_None) {
456 err = PyFile_WriteString(": ", f);
457 if (err == 0)
458 err = PyFile_WriteObject(v, f, Py_PRINT_RAW);
Guido van Rossum262e1241995-02-07 15:30:45 +0000459 }
Guido van Rossum262e1241995-02-07 15:30:45 +0000460 }
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000461 if (err == 0)
462 err = PyFile_WriteString("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000463 }
Guido van Rossum82598051997-03-05 00:20:32 +0000464 Py_XDECREF(exception);
465 Py_XDECREF(v);
466 Py_XDECREF(tb);
Guido van Rossum78a1ed31997-05-22 22:35:04 +0000467 /* If an error happened here, don't show it.
468 XXX This is wrong, but too many callers rely on this behavior. */
469 if (err != 0)
470 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000471}
472
Guido van Rossum82598051997-03-05 00:20:32 +0000473PyObject *
474PyRun_String(str, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000475 char *str;
476 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000477 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000478{
Guido van Rossum82598051997-03-05 00:20:32 +0000479 return run_err_node(PyParser_SimpleParseString(str, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000480 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000481}
482
Guido van Rossum82598051997-03-05 00:20:32 +0000483PyObject *
484PyRun_File(fp, filename, start, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000485 FILE *fp;
486 char *filename;
487 int start;
Guido van Rossum82598051997-03-05 00:20:32 +0000488 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000489{
Guido van Rossum82598051997-03-05 00:20:32 +0000490 return run_err_node(PyParser_SimpleParseFile(fp, filename, start),
Guido van Rossuma110aa61994-08-29 12:50:44 +0000491 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000492}
493
Guido van Rossum82598051997-03-05 00:20:32 +0000494static PyObject *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000495run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496 node *n;
497 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000498 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000499{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000500 if (n == NULL)
501 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000502 return run_node(n, filename, globals, locals);
503}
504
Guido van Rossum82598051997-03-05 00:20:32 +0000505static PyObject *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000506run_node(n, filename, globals, locals)
507 node *n;
508 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000509 PyObject *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000510{
Guido van Rossum82598051997-03-05 00:20:32 +0000511 PyCodeObject *co;
512 PyObject *v;
513 co = PyNode_Compile(n, filename);
514 PyNode_Free(n);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000515 if (co == NULL)
516 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000517 v = PyEval_EvalCode(co, globals, locals);
518 Py_DECREF(co);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000519 return v;
520}
521
Guido van Rossum82598051997-03-05 00:20:32 +0000522static PyObject *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000523run_pyc_file(fp, filename, globals, locals)
524 FILE *fp;
525 char *filename;
Guido van Rossum82598051997-03-05 00:20:32 +0000526 PyObject *globals, *locals;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000527{
Guido van Rossum82598051997-03-05 00:20:32 +0000528 PyCodeObject *co;
529 PyObject *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000530 long magic;
Guido van Rossum82598051997-03-05 00:20:32 +0000531 long PyImport_GetMagicNumber();
Guido van Rossumfdef2711994-09-14 13:31:04 +0000532
Guido van Rossum82598051997-03-05 00:20:32 +0000533 magic = PyMarshal_ReadLongFromFile(fp);
534 if (magic != PyImport_GetMagicNumber()) {
535 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000536 "Bad magic number in .pyc file");
537 return NULL;
538 }
Guido van Rossum82598051997-03-05 00:20:32 +0000539 (void) PyMarshal_ReadLongFromFile(fp);
540 v = PyMarshal_ReadObjectFromFile(fp);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000541 fclose(fp);
Guido van Rossum82598051997-03-05 00:20:32 +0000542 if (v == NULL || !PyCode_Check(v)) {
543 Py_XDECREF(v);
544 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossumfdef2711994-09-14 13:31:04 +0000545 "Bad code object in .pyc file");
546 return NULL;
547 }
Guido van Rossum82598051997-03-05 00:20:32 +0000548 co = (PyCodeObject *)v;
549 v = PyEval_EvalCode(co, globals, locals);
550 Py_DECREF(co);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000551 return v;
552}
553
Guido van Rossum82598051997-03-05 00:20:32 +0000554PyObject *
555Py_CompileString(str, filename, start)
Guido van Rossum5b722181993-03-30 17:46:03 +0000556 char *str;
557 char *filename;
558 int start;
559{
560 node *n;
Guido van Rossum82598051997-03-05 00:20:32 +0000561 PyCodeObject *co;
562 n = PyParser_SimpleParseString(str, start);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000563 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000564 return NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000565 co = PyNode_Compile(n, filename);
566 PyNode_Free(n);
567 return (PyObject *)co;
Guido van Rossum5b722181993-03-30 17:46:03 +0000568}
569
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000571
Guido van Rossuma110aa61994-08-29 12:50:44 +0000572node *
Guido van Rossum82598051997-03-05 00:20:32 +0000573PyParser_SimpleParseFile(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000574 FILE *fp;
575 char *filename;
576 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000577{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000578 node *n;
579 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000580 Py_BEGIN_ALLOW_THREADS
581 n = PyParser_ParseFile(fp, filename, &_PyParser_Grammar, start,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000582 (char *)0, (char *)0, &err);
Guido van Rossum82598051997-03-05 00:20:32 +0000583 Py_END_ALLOW_THREADS
Guido van Rossuma110aa61994-08-29 12:50:44 +0000584 if (n == NULL)
585 err_input(&err);
586 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000587}
588
Guido van Rossuma110aa61994-08-29 12:50:44 +0000589/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590
Guido van Rossuma110aa61994-08-29 12:50:44 +0000591node *
Guido van Rossum82598051997-03-05 00:20:32 +0000592PyParser_SimpleParseString(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000593 char *str;
594 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000595{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000596 node *n;
597 perrdetail err;
Guido van Rossum82598051997-03-05 00:20:32 +0000598 n = PyParser_ParseString(str, &_PyParser_Grammar, start, &err);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000599 if (n == NULL)
600 err_input(&err);
601 return n;
602}
603
604/* Set the error appropriate to the given input error code (see errcode.h) */
605
606static void
607err_input(err)
608 perrdetail *err;
609{
Guido van Rossum82598051997-03-05 00:20:32 +0000610 PyObject *v, *w;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000611 char *msg = NULL;
Guido van Rossum82598051997-03-05 00:20:32 +0000612 v = Py_BuildValue("(ziiz)", err->filename,
Guido van Rossuma110aa61994-08-29 12:50:44 +0000613 err->lineno, err->offset, err->text);
614 if (err->text != NULL) {
615 free(err->text);
616 err->text = NULL;
617 }
618 switch (err->error) {
619 case E_SYNTAX:
620 msg = "invalid syntax";
621 break;
622 case E_TOKEN:
623 msg = "invalid token";
624
625 break;
626 case E_INTR:
Guido van Rossum82598051997-03-05 00:20:32 +0000627 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000628 return;
629 case E_NOMEM:
Guido van Rossum82598051997-03-05 00:20:32 +0000630 PyErr_NoMemory();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000631 return;
632 case E_EOF:
633 msg = "unexpected EOF while parsing";
634 break;
635 default:
636 fprintf(stderr, "error=%d\n", err->error);
637 msg = "unknown parsing error";
638 break;
639 }
Guido van Rossum82598051997-03-05 00:20:32 +0000640 w = Py_BuildValue("(sO)", msg, v);
641 Py_XDECREF(v);
642 PyErr_SetObject(PyExc_SyntaxError, w);
643 Py_XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000644}
645
646/* Print fatal error message and abort */
647
648void
Guido van Rossum82598051997-03-05 00:20:32 +0000649Py_FatalError(msg)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000650 char *msg;
651{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000652 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum8ae87c01995-01-26 00:40:38 +0000653#ifdef macintosh
654 for (;;);
655#endif
Guido van Rossum9b38a141996-09-11 23:12:24 +0000656#ifdef MS_WIN32
Guido van Rossum23c94461997-05-22 20:21:30 +0000657 OutputDebugString("Fatal Python error: ");
Guido van Rossuma44823b1995-03-14 15:01:17 +0000658 OutputDebugString(msg);
659 OutputDebugString("\n");
660#endif
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000661 abort();
662}
663
664/* Clean up and exit */
665
Guido van Rossuma110aa61994-08-29 12:50:44 +0000666#ifdef WITH_THREAD
667#include "thread.h"
Guido van Rossum82598051997-03-05 00:20:32 +0000668int _PyThread_Started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000669#endif
670
Guido van Rossum1662dd51994-09-07 14:38:28 +0000671#define NEXITFUNCS 32
672static void (*exitfuncs[NEXITFUNCS])();
673static int nexitfuncs = 0;
674
675int Py_AtExit(func)
Guido van Rossum82598051997-03-05 00:20:32 +0000676 void (*func) Py_PROTO((void));
Guido van Rossum1662dd51994-09-07 14:38:28 +0000677{
678 if (nexitfuncs >= NEXITFUNCS)
679 return -1;
680 exitfuncs[nexitfuncs++] = func;
681 return 0;
682}
683
Guido van Rossuma110aa61994-08-29 12:50:44 +0000684void
Guido van Rossum82598051997-03-05 00:20:32 +0000685Py_Cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000686{
Guido van Rossum82598051997-03-05 00:20:32 +0000687 PyObject *exitfunc = PySys_GetObject("exitfunc");
Guido van Rossum59bff391992-09-03 20:28:00 +0000688
689 if (exitfunc) {
Guido van Rossum82598051997-03-05 00:20:32 +0000690 PyObject *res;
691 Py_INCREF(exitfunc);
692 PySys_SetObject("exitfunc", (PyObject *)NULL);
693 res = PyEval_CallObject(exitfunc, (PyObject *)NULL);
Guido van Rossum59bff391992-09-03 20:28:00 +0000694 if (res == NULL) {
695 fprintf(stderr, "Error in sys.exitfunc:\n");
Guido van Rossum82598051997-03-05 00:20:32 +0000696 PyErr_Print();
Guido van Rossum59bff391992-09-03 20:28:00 +0000697 }
Guido van Rossum82598051997-03-05 00:20:32 +0000698 Py_DECREF(exitfunc);
Guido van Rossum59bff391992-09-03 20:28:00 +0000699 }
700
Guido van Rossum82598051997-03-05 00:20:32 +0000701 Py_FlushLine();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000702
703 while (nexitfuncs > 0)
704 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000705}
706
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000707#ifdef COUNT_ALLOCS
Guido van Rossum82598051997-03-05 00:20:32 +0000708extern void dump_counts Py_PROTO((void));
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000709#endif
710
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000711void
Guido van Rossum82598051997-03-05 00:20:32 +0000712Py_Exit(sts)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000713 int sts;
714{
Guido van Rossum82598051997-03-05 00:20:32 +0000715 Py_Cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000716
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000717#ifdef COUNT_ALLOCS
718 dump_counts();
719#endif
720
Guido van Rossuma110aa61994-08-29 12:50:44 +0000721#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000722
723 /* Other threads may still be active, so skip most of the
724 cleanup actions usually done (these are mostly for
725 debugging anyway). */
726
Guido van Rossum82598051997-03-05 00:20:32 +0000727 (void) PyEval_SaveThread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000728#ifndef NO_EXIT_PROG
Guido van Rossum82598051997-03-05 00:20:32 +0000729 if (_PyThread_Started)
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000730 _exit_prog(sts);
731 else
732 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000733#else /* !NO_EXIT_PROG */
Guido van Rossum82598051997-03-05 00:20:32 +0000734 if (_PyThread_Started)
Guido van Rossuma110aa61994-08-29 12:50:44 +0000735 _exit(sts);
736 else
737 exit(sts);
738#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000739
Guido van Rossuma110aa61994-08-29 12:50:44 +0000740#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000741
Guido van Rossum82598051997-03-05 00:20:32 +0000742 PyImport_Cleanup();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000743
Guido van Rossum82598051997-03-05 00:20:32 +0000744 PyErr_Clear();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000745
Guido van Rossumaae0d321996-05-22 16:35:33 +0000746#ifdef Py_REF_DEBUG
Guido van Rossum6f9e4331995-03-29 16:57:48 +0000747 fprintf(stderr, "[%ld refs]\n", _Py_RefTotal);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000748#endif
749
Guido van Rossumaae0d321996-05-22 16:35:33 +0000750#ifdef Py_TRACE_REFS
Guido van Rossum82598051997-03-05 00:20:32 +0000751 if (_Py_AskYesNo("Print left references?")) {
Guido van Rossumded690f1996-05-24 20:48:31 +0000752 _Py_PrintReferences(stderr);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000753 }
Guido van Rossumaae0d321996-05-22 16:35:33 +0000754#endif /* Py_TRACE_REFS */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000755
Jack Jansen66a89771995-10-27 13:22:14 +0000756#ifdef macintosh
757 PyMac_Exit(sts);
758#else
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000759 exit(sts);
Jack Jansen66a89771995-10-27 13:22:14 +0000760#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000761#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000762 /*NOTREACHED*/
763}
764
Guido van Rossuma110aa61994-08-29 12:50:44 +0000765#ifdef HAVE_SIGNAL_H
766static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000767sighandler(sig)
768 int sig;
769{
770 signal(sig, SIG_DFL); /* Don't catch recursive signals */
Guido van Rossum82598051997-03-05 00:20:32 +0000771 Py_Cleanup(); /* Do essential clean-up */
Guido van Rossum478e7181997-05-06 15:24:59 +0000772#ifdef HAVE_KILL
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000773 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000774#else
775 exit(1);
776#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000777 /*NOTREACHED*/
778}
779#endif
780
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000781static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000782initsigs()
783{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000784 RETSIGTYPE (*t)();
785#ifdef HAVE_SIGNAL_H
786#ifdef SIGPIPE
787 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000788#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000789#ifdef SIGHUP
790 t = signal(SIGHUP, SIG_IGN);
791 if (t == SIG_DFL)
792 signal(SIGHUP, sighandler);
793 else
794 signal(SIGHUP, t);
795#endif
796#ifdef SIGTERM
797 t = signal(SIGTERM, SIG_IGN);
798 if (t == SIG_DFL)
799 signal(SIGTERM, sighandler);
800 else
801 signal(SIGTERM, t);
802#endif
803#endif /* HAVE_SIGNAL_H */
Guido van Rossum82598051997-03-05 00:20:32 +0000804 PyOS_InitInterrupts(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000805}
806
Guido van Rossumaae0d321996-05-22 16:35:33 +0000807#ifdef Py_TRACE_REFS
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000808/* Ask a yes/no question */
809
Guido van Rossum59bff391992-09-03 20:28:00 +0000810int
Guido van Rossum82598051997-03-05 00:20:32 +0000811_Py_AskYesNo(prompt)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000812 char *prompt;
813{
814 char buf[256];
815
816 printf("%s [ny] ", prompt);
817 if (fgets(buf, sizeof buf, stdin) == NULL)
818 return 0;
819 return buf[0] == 'y' || buf[0] == 'Y';
820}
821#endif
822
Guido van Rossuma110aa61994-08-29 12:50:44 +0000823#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000824
825/* Check for file descriptor connected to interactive device.
826 Pretend that stdin is always interactive, other files never. */
827
828int
829isatty(fd)
830 int fd;
831{
832 return fd == fileno(stdin);
833}
834
835#endif
Guido van Rossum7433b121997-02-14 19:45:36 +0000836
837/*
838 * The file descriptor fd is considered ``interactive'' if either
839 * a) isatty(fd) is TRUE, or
840 * b) the -i flag was given, and the filename associated with
841 * the descriptor is NULL or "<stdin>" or "???".
842 */
843int
844Py_FdIsInteractive(fp, filename)
845 FILE *fp;
846 char *filename;
847{
848 if (isatty((int)fileno(fp)))
849 return 1;
850 if (!Py_InteractiveFlag)
851 return 0;
852 return (filename == NULL) ||
853 (strcmp(filename, "<stdin>") == 0) ||
854 (strcmp(filename, "???") == 0);
855}