blob: c706081c68d3e02d4b7bcb8f12b3bad7ccf170e6 [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
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
25/* Python interpreter top-level routines, including init/exit */
26
27#include "allobjects.h"
28
29#include "grammar.h"
30#include "node.h"
31#include "parsetok.h"
32#include "graminit.h"
33#include "errcode.h"
34#include "sysmodule.h"
35#include "compile.h"
Guido van Rossumff4949e1992-08-05 19:58:53 +000036#include "eval.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000037#include "ceval.h"
38#include "pythonrun.h"
39#include "import.h"
Guido van Rossumfdef2711994-09-14 13:31:04 +000040#include "marshal.h"
Guido van Rossum1984f1e1992-08-04 12:41:02 +000041
Guido van Rossuma110aa61994-08-29 12:50:44 +000042#ifdef HAVE_SIGNAL_H
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000043#include <signal.h>
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000044#endif
45
Guido van Rossum1984f1e1992-08-04 12:41:02 +000046extern char *getpythonpath();
47
48extern grammar gram; /* From graminit.c */
49
Guido van Rossumb73cc041993-11-01 16:28:59 +000050/* Forward */
Guido van Rossuma110aa61994-08-29 12:50:44 +000051static object *run_err_node PROTO((node *n, char *filename,
Guido van Rossumb73cc041993-11-01 16:28:59 +000052 object *globals, object *locals));
53static object *run_node PROTO((node *n, char *filename,
54 object *globals, object *locals));
Guido van Rossuma110aa61994-08-29 12:50:44 +000055static void err_input PROTO((perrdetail *));
Guido van Rossumb376a4a1993-11-23 17:53:17 +000056static void initsigs PROTO((void));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000057
Guido van Rossum1984f1e1992-08-04 12:41:02 +000058int debugging; /* Needed by parser.c */
59int verbose; /* Needed by import.c */
Guido van Rossuma110aa61994-08-29 12:50:44 +000060int suppress_print; /* Needed by ceval.c */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000061
62/* Initialize all */
63
64void
65initall()
66{
67 static int inited;
68
69 if (inited)
70 return;
71 inited = 1;
72
73 initimport();
74
Guido van Rossuma110aa61994-08-29 12:50:44 +000075 /* Modules '__builtin__' and 'sys' are initialized here,
Guido van Rossum1984f1e1992-08-04 12:41:02 +000076 they are needed by random bits of the interpreter.
77 All other modules are optional and are initialized
78 when they are first imported. */
79
80 initbuiltin(); /* Also initializes builtin exceptions */
81 initsys();
Guido van Rossum1984f1e1992-08-04 12:41:02 +000082
83 setpythonpath(getpythonpath());
Guido van Rossuma9e7dc11992-10-18 18:53:57 +000084
85 initsigs(); /* Signal handling stuff, including initintr() */
Guido van Rossum1984f1e1992-08-04 12:41:02 +000086}
87
88/* Parse input from a file and execute it */
89
90int
91run(fp, filename)
92 FILE *fp;
93 char *filename;
94{
95 if (filename == NULL)
96 filename = "???";
97 if (isatty((int)fileno(fp)))
98 return run_tty_loop(fp, filename);
99 else
100 return run_script(fp, filename);
101}
102
103int
104run_tty_loop(fp, filename)
105 FILE *fp;
106 char *filename;
107{
108 object *v;
109 int ret;
110 v = sysget("ps1");
111 if (v == NULL) {
112 sysset("ps1", v = newstringobject(">>> "));
113 XDECREF(v);
114 }
115 v = sysget("ps2");
116 if (v == NULL) {
117 sysset("ps2", v = newstringobject("... "));
118 XDECREF(v);
119 }
120 for (;;) {
121 ret = run_tty_1(fp, filename);
122#ifdef REF_DEBUG
123 fprintf(stderr, "[%ld refs]\n", ref_total);
124#endif
125 if (ret == E_EOF)
126 return 0;
127 /*
128 if (ret == E_NOMEM)
129 return -1;
130 */
131 }
132}
133
134int
135run_tty_1(fp, filename)
136 FILE *fp;
137 char *filename;
138{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000139 object *m, *d, *v, *w;
140 node *n;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000141 perrdetail err;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000142 char *ps1, *ps2;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000143 v = sysget("ps1");
144 w = sysget("ps2");
145 if (v != NULL && is_stringobject(v)) {
146 INCREF(v);
147 ps1 = getstringvalue(v);
148 }
149 else {
150 v = NULL;
151 ps1 = "";
152 }
153 if (w != NULL && is_stringobject(w)) {
154 INCREF(w);
155 ps2 = getstringvalue(w);
156 }
157 else {
158 w = NULL;
159 ps2 = "";
160 }
Guido van Rossumff4949e1992-08-05 19:58:53 +0000161 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000162 n = parsefile(fp, filename, &gram, single_input, ps1, ps2, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000163 END_SAVE
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000164 XDECREF(v);
165 XDECREF(w);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000166 if (n == NULL) {
167 if (err.error == E_EOF) {
168 if (err.text)
169 free(err.text);
170 return E_EOF;
171 }
172 err_input(&err);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000173 print_error();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000174 return err.error;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000175 }
176 m = add_module("__main__");
177 if (m == NULL)
178 return -1;
179 d = getmoduledict(m);
180 v = run_node(n, filename, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000181 if (v == NULL) {
182 print_error();
183 return -1;
184 }
185 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000186 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000187 return 0;
188}
189
190int
191run_script(fp, filename)
192 FILE *fp;
193 char *filename;
194{
195 object *m, *d, *v;
Guido van Rossumfdef2711994-09-14 13:31:04 +0000196 char *ext;
197
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000198 m = add_module("__main__");
199 if (m == NULL)
200 return -1;
201 d = getmoduledict(m);
Guido van Rossumfdef2711994-09-14 13:31:04 +0000202 ext = filename + strlen(filename) - 4;
203 if ( strcmp(ext, ".pyc") == 0 ) {
204 /* Try to run a pyc file. First, re-open in binary */
Jack Jansene00637b1994-12-14 12:58:37 +0000205 /* Don't close, done in main: fclose(fp); */
Guido van Rossumfdef2711994-09-14 13:31:04 +0000206 if( (fp = fopen(filename, "rb")) == NULL ) {
207 fprintf(stderr, "python: Can't reopen .pyc file\n");
208 return -1;
209 }
210 v = run_pyc_file(fp, filename, d, d);
211 } else {
212 v = run_file(fp, filename, file_input, d, d);
213 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000214 if (v == NULL) {
215 print_error();
216 return -1;
217 }
218 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000219 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000220 return 0;
221}
222
223int
224run_command(command)
225 char *command;
226{
227 object *m, *d, *v;
228 m = add_module("__main__");
229 if (m == NULL)
230 return -1;
231 d = getmoduledict(m);
232 v = run_string(command, file_input, d, d);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000233 if (v == NULL) {
234 print_error();
235 return -1;
236 }
237 DECREF(v);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000238 flushline();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000239 return 0;
240}
241
242void
243print_error()
244{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000245 object *exception, *v, *tb, *f;
246 err_fetch(&exception, &v, &tb);
Guido van Rossum6d023c91995-01-04 19:12:13 +0000247 flushline();
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248 if (exception == NULL)
249 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000250 if (exception == SystemExit) {
251 if (v == NULL || v == None)
252 goaway(0);
253 if (is_intobject(v))
254 goaway((int)getintvalue(v));
255 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000256 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000257 printobject(v, stderr, PRINT_RAW);
258 fprintf(stderr, "\n");
259 goaway(1);
260 }
261 }
262 sysset("last_type", exception);
263 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000264 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000265 f = sysget("stderr");
266 if (f == NULL)
267 fprintf(stderr, "lost sys.stderr\n");
268 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000269 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000270 if (exception == SyntaxError) {
271 object *message;
272 char *filename, *text;
273 int lineno, offset;
274 if (!getargs(v, "(O(ziiz))", &message,
275 &filename, &lineno, &offset, &text))
276 err_clear();
277 else {
278 char buf[10];
279 writestring(" File \"", f);
280 if (filename == NULL)
281 writestring("<string>", f);
282 else
283 writestring(filename, f);
284 writestring("\", line ", f);
285 sprintf(buf, "%d", lineno);
286 writestring(buf, f);
287 writestring("\n", f);
288 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000289 char *nl;
290 if (offset > 0 &&
291 offset == strlen(text))
292 offset--;
293 for (;;) {
294 nl = strchr(text, '\n');
295 if (nl == NULL ||
296 nl-text >= offset)
297 break;
298 offset -= (nl+1-text);
299 text = nl+1;
300 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000301 while (*text == ' ' || *text == '\t') {
302 text++;
303 offset--;
304 }
305 writestring(" ", f);
306 writestring(text, f);
307 if (*text == '\0' ||
308 text[strlen(text)-1] != '\n')
309 writestring("\n", f);
310 writestring(" ", f);
311 offset--;
312 while (offset > 0) {
313 writestring(" ", f);
314 offset--;
315 }
316 writestring("^\n", f);
317 }
318 INCREF(message);
319 DECREF(v);
320 v = message;
321 }
322 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000323 if (writeobject(exception, f, PRINT_RAW) != 0)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000324 err_clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000325 if (v != NULL && v != None) {
326 writestring(": ", f);
327 if (writeobject(v, f, PRINT_RAW) != 0)
328 err_clear();
329 }
330 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332 XDECREF(exception);
333 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000334 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000335}
336
337object *
338run_string(str, start, globals, locals)
339 char *str;
340 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000341 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000342{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000343 return run_err_node(parse_string(str, start),
344 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000345}
346
347object *
348run_file(fp, filename, start, globals, locals)
349 FILE *fp;
350 char *filename;
351 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000352 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000353{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000354 return run_err_node(parse_file(fp, filename, start),
355 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000356}
357
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000358static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000359run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000360 node *n;
361 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000362 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000363{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000364 if (n == NULL)
365 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000366 return run_node(n, filename, globals, locals);
367}
368
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000369static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000370run_node(n, filename, globals, locals)
371 node *n;
372 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000373 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000374{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000375 codeobject *co;
376 object *v;
377 co = compile(n, filename);
378 freetree(n);
379 if (co == NULL)
380 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000381 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000382 DECREF(co);
383 return v;
384}
385
Guido van Rossum5b722181993-03-30 17:46:03 +0000386object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000387run_pyc_file(fp, filename, globals, locals)
388 FILE *fp;
389 char *filename;
390 object *globals, *locals;
391{
392 codeobject *co;
393 object *v;
394 long magic;
395 long get_pyc_magic();
396
397 magic = rd_long(fp);
398 if (magic != get_pyc_magic()) {
399 err_setstr(RuntimeError,
400 "Bad magic number in .pyc file");
401 return NULL;
402 }
403 (void) rd_long(fp);
404 v = rd_object(fp);
405 fclose(fp);
406 if (v == NULL || !is_codeobject(v)) {
407 XDECREF(v);
408 err_setstr(RuntimeError,
409 "Bad code object in .pyc file");
410 return NULL;
411 }
412 co = (codeobject *)v;
413 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
414 DECREF(co);
415 return v;
416}
417
418object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000419compile_string(str, filename, start)
420 char *str;
421 char *filename;
422 int start;
423{
424 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000425 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000426 n = parse_string(str, start);
427 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000428 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000429 co = compile(n, filename);
430 freetree(n);
431 return (object *)co;
432}
433
Guido van Rossuma110aa61994-08-29 12:50:44 +0000434/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000435
Guido van Rossuma110aa61994-08-29 12:50:44 +0000436node *
437parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000438 FILE *fp;
439 char *filename;
440 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000441{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000442 node *n;
443 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000444 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000445 n = parsefile(fp, filename, &gram, start,
446 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000447 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000448 if (n == NULL)
449 err_input(&err);
450 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000451}
452
Guido van Rossuma110aa61994-08-29 12:50:44 +0000453/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000454
Guido van Rossuma110aa61994-08-29 12:50:44 +0000455node *
456parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000457 char *str;
458 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000459{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000460 node *n;
461 perrdetail err;
462 n = parsestring(str, &gram, start, &err);
463 if (n == NULL)
464 err_input(&err);
465 return n;
466}
467
468/* Set the error appropriate to the given input error code (see errcode.h) */
469
470static void
471err_input(err)
472 perrdetail *err;
473{
474 object *v, *w;
475 char *msg = NULL;
476 v = mkvalue("(ziiz)", err->filename,
477 err->lineno, err->offset, err->text);
478 if (err->text != NULL) {
479 free(err->text);
480 err->text = NULL;
481 }
482 switch (err->error) {
483 case E_SYNTAX:
484 msg = "invalid syntax";
485 break;
486 case E_TOKEN:
487 msg = "invalid token";
488
489 break;
490 case E_INTR:
491 err_set(KeyboardInterrupt);
492 return;
493 case E_NOMEM:
494 err_nomem();
495 return;
496 case E_EOF:
497 msg = "unexpected EOF while parsing";
498 break;
499 default:
500 fprintf(stderr, "error=%d\n", err->error);
501 msg = "unknown parsing error";
502 break;
503 }
504 w = mkvalue("(sO)", msg, v);
505 XDECREF(v);
506 err_setval(SyntaxError, w);
507 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000508}
509
510/* Print fatal error message and abort */
511
512void
513fatal(msg)
514 char *msg;
515{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000516 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000517 abort();
518}
519
520/* Clean up and exit */
521
Guido van Rossuma110aa61994-08-29 12:50:44 +0000522#ifdef WITH_THREAD
523#include "thread.h"
524int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000525#endif
526
Guido van Rossum1662dd51994-09-07 14:38:28 +0000527#define NEXITFUNCS 32
528static void (*exitfuncs[NEXITFUNCS])();
529static int nexitfuncs = 0;
530
531int Py_AtExit(func)
532 void (*func) PROTO((void));
533{
534 if (nexitfuncs >= NEXITFUNCS)
535 return -1;
536 exitfuncs[nexitfuncs++] = func;
537 return 0;
538}
539
Guido van Rossuma110aa61994-08-29 12:50:44 +0000540void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000541cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000542{
Guido van Rossum59bff391992-09-03 20:28:00 +0000543 object *exitfunc = sysget("exitfunc");
544
545 if (exitfunc) {
546 object *arg;
547 object *res;
548 sysset("exitfunc", (object *)NULL);
549 arg = newtupleobject(0);
550 if (arg == NULL)
551 res = NULL;
552 else {
553 res = call_object(exitfunc, arg);
554 DECREF(arg);
555 }
556 if (res == NULL) {
557 fprintf(stderr, "Error in sys.exitfunc:\n");
558 print_error();
559 }
560 }
561
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000562 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000563
564 while (nexitfuncs > 0)
565 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000566}
567
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000568#ifdef COUNT_ALLOCS
569extern void dump_counts PROTO((void));
570#endif
571
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000572void
573goaway(sts)
574 int sts;
575{
576 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000577
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000578#ifdef COUNT_ALLOCS
579 dump_counts();
580#endif
581
Guido van Rossuma110aa61994-08-29 12:50:44 +0000582#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000583
584 /* Other threads may still be active, so skip most of the
585 cleanup actions usually done (these are mostly for
586 debugging anyway). */
587
Guido van Rossumdf72a651992-08-12 15:27:32 +0000588 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000589#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000590 if (threads_started)
591 _exit_prog(sts);
592 else
593 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000594#else /* !NO_EXIT_PROG */
595 if (threads_started)
596 _exit(sts);
597 else
598 exit(sts);
599#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000600
Guido van Rossuma110aa61994-08-29 12:50:44 +0000601#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000604
605 err_clear();
606
607#ifdef REF_DEBUG
608 fprintf(stderr, "[%ld refs]\n", ref_total);
609#endif
610
611#ifdef TRACE_REFS
612 if (askyesno("Print left references?")) {
613 printrefs(stderr);
614 }
615#endif /* TRACE_REFS */
616
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000617 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000618#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000619 /*NOTREACHED*/
620}
621
Guido van Rossuma110aa61994-08-29 12:50:44 +0000622#ifdef HAVE_SIGNAL_H
623static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000624sighandler(sig)
625 int sig;
626{
627 signal(sig, SIG_DFL); /* Don't catch recursive signals */
628 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000629#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000630 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000631#else
632 exit(1);
633#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000634 /*NOTREACHED*/
635}
636#endif
637
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000638static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000639initsigs()
640{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000641 RETSIGTYPE (*t)();
642#ifdef HAVE_SIGNAL_H
643#ifdef SIGPIPE
644 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000645#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000646#ifdef SIGHUP
647 t = signal(SIGHUP, SIG_IGN);
648 if (t == SIG_DFL)
649 signal(SIGHUP, sighandler);
650 else
651 signal(SIGHUP, t);
652#endif
653#ifdef SIGTERM
654 t = signal(SIGTERM, SIG_IGN);
655 if (t == SIG_DFL)
656 signal(SIGTERM, sighandler);
657 else
658 signal(SIGTERM, t);
659#endif
660#endif /* HAVE_SIGNAL_H */
661 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000662}
663
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000664#ifdef TRACE_REFS
665/* Ask a yes/no question */
666
Guido van Rossum59bff391992-09-03 20:28:00 +0000667int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000668askyesno(prompt)
669 char *prompt;
670{
671 char buf[256];
672
673 printf("%s [ny] ", prompt);
674 if (fgets(buf, sizeof buf, stdin) == NULL)
675 return 0;
676 return buf[0] == 'y' || buf[0] == 'Y';
677}
678#endif
679
Guido van Rossuma110aa61994-08-29 12:50:44 +0000680#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000681
682/* Check for file descriptor connected to interactive device.
683 Pretend that stdin is always interactive, other files never. */
684
685int
686isatty(fd)
687 int fd;
688{
689 return fd == fileno(stdin);
690}
691
692#endif