blob: f66c8d738ad059ec9ae66ea84bec6f1f0f7facb3 [file] [log] [blame]
Guido van Rossum1984f1e1992-08-04 12:41:02 +00001/***********************************************************
Guido van Rossuma110aa61994-08-29 12:50:44 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum9bfef441993-03-29 10:43:31 +00003Amsterdam, The 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);
181 flushline();
182 if (v == NULL) {
183 print_error();
184 return -1;
185 }
186 DECREF(v);
187 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 flushline();
215 if (v == NULL) {
216 print_error();
217 return -1;
218 }
219 DECREF(v);
220 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);
233 flushline();
234 if (v == NULL) {
235 print_error();
236 return -1;
237 }
238 DECREF(v);
239 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);
247 if (exception == NULL)
248 fatal("print_error called but no exception");
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000249 if (exception == SystemExit) {
250 if (v == NULL || v == None)
251 goaway(0);
252 if (is_intobject(v))
253 goaway((int)getintvalue(v));
254 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000255 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000256 printobject(v, stderr, PRINT_RAW);
257 fprintf(stderr, "\n");
258 goaway(1);
259 }
260 }
261 sysset("last_type", exception);
262 sysset("last_value", v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000263 sysset("last_traceback", tb);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000264 f = sysget("stderr");
265 if (f == NULL)
266 fprintf(stderr, "lost sys.stderr\n");
267 else {
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000268 tb_print(tb, f);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000269 if (exception == SyntaxError) {
270 object *message;
271 char *filename, *text;
272 int lineno, offset;
273 if (!getargs(v, "(O(ziiz))", &message,
274 &filename, &lineno, &offset, &text))
275 err_clear();
276 else {
277 char buf[10];
278 writestring(" File \"", f);
279 if (filename == NULL)
280 writestring("<string>", f);
281 else
282 writestring(filename, f);
283 writestring("\", line ", f);
284 sprintf(buf, "%d", lineno);
285 writestring(buf, f);
286 writestring("\n", f);
287 if (text != NULL) {
Guido van Rossum798199d1994-09-19 08:08:50 +0000288 char *nl;
289 if (offset > 0 &&
290 offset == strlen(text))
291 offset--;
292 for (;;) {
293 nl = strchr(text, '\n');
294 if (nl == NULL ||
295 nl-text >= offset)
296 break;
297 offset -= (nl+1-text);
298 text = nl+1;
299 }
Guido van Rossuma110aa61994-08-29 12:50:44 +0000300 while (*text == ' ' || *text == '\t') {
301 text++;
302 offset--;
303 }
304 writestring(" ", f);
305 writestring(text, f);
306 if (*text == '\0' ||
307 text[strlen(text)-1] != '\n')
308 writestring("\n", f);
309 writestring(" ", f);
310 offset--;
311 while (offset > 0) {
312 writestring(" ", f);
313 offset--;
314 }
315 writestring("^\n", f);
316 }
317 INCREF(message);
318 DECREF(v);
319 v = message;
320 }
321 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000322 if (writeobject(exception, f, PRINT_RAW) != 0)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000323 err_clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000324 if (v != NULL && v != None) {
325 writestring(": ", f);
326 if (writeobject(v, f, PRINT_RAW) != 0)
327 err_clear();
328 }
329 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000330 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000331 XDECREF(exception);
332 XDECREF(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000333 XDECREF(tb);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000334}
335
336object *
337run_string(str, start, globals, locals)
338 char *str;
339 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000340 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000341{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000342 return run_err_node(parse_string(str, start),
343 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000344}
345
346object *
347run_file(fp, filename, start, globals, locals)
348 FILE *fp;
349 char *filename;
350 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000351 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000352{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000353 return run_err_node(parse_file(fp, filename, start),
354 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000355}
356
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000357static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000358run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000359 node *n;
360 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000361 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000362{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000363 if (n == NULL)
364 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000365 return run_node(n, filename, globals, locals);
366}
367
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000368static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369run_node(n, filename, globals, locals)
370 node *n;
371 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000372 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000373{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000374 codeobject *co;
375 object *v;
376 co = compile(n, filename);
377 freetree(n);
378 if (co == NULL)
379 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000380 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000381 DECREF(co);
382 return v;
383}
384
Guido van Rossum5b722181993-03-30 17:46:03 +0000385object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000386run_pyc_file(fp, filename, globals, locals)
387 FILE *fp;
388 char *filename;
389 object *globals, *locals;
390{
391 codeobject *co;
392 object *v;
393 long magic;
394 long get_pyc_magic();
395
396 magic = rd_long(fp);
397 if (magic != get_pyc_magic()) {
398 err_setstr(RuntimeError,
399 "Bad magic number in .pyc file");
400 return NULL;
401 }
402 (void) rd_long(fp);
403 v = rd_object(fp);
404 fclose(fp);
405 if (v == NULL || !is_codeobject(v)) {
406 XDECREF(v);
407 err_setstr(RuntimeError,
408 "Bad code object in .pyc file");
409 return NULL;
410 }
411 co = (codeobject *)v;
412 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
413 DECREF(co);
414 return v;
415}
416
417object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000418compile_string(str, filename, start)
419 char *str;
420 char *filename;
421 int start;
422{
423 node *n;
Guido van Rossum5b722181993-03-30 17:46:03 +0000424 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000425 n = parse_string(str, start);
426 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000427 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000428 co = compile(n, filename);
429 freetree(n);
430 return (object *)co;
431}
432
Guido van Rossuma110aa61994-08-29 12:50:44 +0000433/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000434
Guido van Rossuma110aa61994-08-29 12:50:44 +0000435node *
436parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000437 FILE *fp;
438 char *filename;
439 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000440{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000441 node *n;
442 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000443 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000444 n = parsefile(fp, filename, &gram, start,
445 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000446 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000447 if (n == NULL)
448 err_input(&err);
449 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000450}
451
Guido van Rossuma110aa61994-08-29 12:50:44 +0000452/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000453
Guido van Rossuma110aa61994-08-29 12:50:44 +0000454node *
455parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000456 char *str;
457 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000458{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000459 node *n;
460 perrdetail err;
461 n = parsestring(str, &gram, start, &err);
462 if (n == NULL)
463 err_input(&err);
464 return n;
465}
466
467/* Set the error appropriate to the given input error code (see errcode.h) */
468
469static void
470err_input(err)
471 perrdetail *err;
472{
473 object *v, *w;
474 char *msg = NULL;
475 v = mkvalue("(ziiz)", err->filename,
476 err->lineno, err->offset, err->text);
477 if (err->text != NULL) {
478 free(err->text);
479 err->text = NULL;
480 }
481 switch (err->error) {
482 case E_SYNTAX:
483 msg = "invalid syntax";
484 break;
485 case E_TOKEN:
486 msg = "invalid token";
487
488 break;
489 case E_INTR:
490 err_set(KeyboardInterrupt);
491 return;
492 case E_NOMEM:
493 err_nomem();
494 return;
495 case E_EOF:
496 msg = "unexpected EOF while parsing";
497 break;
498 default:
499 fprintf(stderr, "error=%d\n", err->error);
500 msg = "unknown parsing error";
501 break;
502 }
503 w = mkvalue("(sO)", msg, v);
504 XDECREF(v);
505 err_setval(SyntaxError, w);
506 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000507}
508
509/* Print fatal error message and abort */
510
511void
512fatal(msg)
513 char *msg;
514{
Guido van Rossum83dd6c31994-09-29 09:38:33 +0000515 fprintf(stderr, "Fatal Python error: %s\n", msg);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000516 abort();
517}
518
519/* Clean up and exit */
520
Guido van Rossuma110aa61994-08-29 12:50:44 +0000521#ifdef WITH_THREAD
522#include "thread.h"
523int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000524#endif
525
Guido van Rossum1662dd51994-09-07 14:38:28 +0000526#define NEXITFUNCS 32
527static void (*exitfuncs[NEXITFUNCS])();
528static int nexitfuncs = 0;
529
530int Py_AtExit(func)
531 void (*func) PROTO((void));
532{
533 if (nexitfuncs >= NEXITFUNCS)
534 return -1;
535 exitfuncs[nexitfuncs++] = func;
536 return 0;
537}
538
Guido van Rossuma110aa61994-08-29 12:50:44 +0000539void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000540cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000541{
Guido van Rossum59bff391992-09-03 20:28:00 +0000542 object *exitfunc = sysget("exitfunc");
543
544 if (exitfunc) {
545 object *arg;
546 object *res;
547 sysset("exitfunc", (object *)NULL);
548 arg = newtupleobject(0);
549 if (arg == NULL)
550 res = NULL;
551 else {
552 res = call_object(exitfunc, arg);
553 DECREF(arg);
554 }
555 if (res == NULL) {
556 fprintf(stderr, "Error in sys.exitfunc:\n");
557 print_error();
558 }
559 }
560
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000561 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000562
563 while (nexitfuncs > 0)
564 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000565}
566
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000567#ifdef COUNT_ALLOCS
568extern void dump_counts PROTO((void));
569#endif
570
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000571void
572goaway(sts)
573 int sts;
574{
575 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000576
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000577#ifdef COUNT_ALLOCS
578 dump_counts();
579#endif
580
Guido van Rossuma110aa61994-08-29 12:50:44 +0000581#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000582
583 /* Other threads may still be active, so skip most of the
584 cleanup actions usually done (these are mostly for
585 debugging anyway). */
586
Guido van Rossumdf72a651992-08-12 15:27:32 +0000587 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000588#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000589 if (threads_started)
590 _exit_prog(sts);
591 else
592 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000593#else /* !NO_EXIT_PROG */
594 if (threads_started)
595 _exit(sts);
596 else
597 exit(sts);
598#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000599
Guido van Rossuma110aa61994-08-29 12:50:44 +0000600#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000601
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000602 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000603
604 err_clear();
605
606#ifdef REF_DEBUG
607 fprintf(stderr, "[%ld refs]\n", ref_total);
608#endif
609
610#ifdef TRACE_REFS
611 if (askyesno("Print left references?")) {
612 printrefs(stderr);
613 }
614#endif /* TRACE_REFS */
615
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000616 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000617#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000618 /*NOTREACHED*/
619}
620
Guido van Rossuma110aa61994-08-29 12:50:44 +0000621#ifdef HAVE_SIGNAL_H
622static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000623sighandler(sig)
624 int sig;
625{
626 signal(sig, SIG_DFL); /* Don't catch recursive signals */
627 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000628#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000629 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000630#else
631 exit(1);
632#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000633 /*NOTREACHED*/
634}
635#endif
636
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000637static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000638initsigs()
639{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000640 RETSIGTYPE (*t)();
641#ifdef HAVE_SIGNAL_H
642#ifdef SIGPIPE
643 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000644#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000645#ifdef SIGHUP
646 t = signal(SIGHUP, SIG_IGN);
647 if (t == SIG_DFL)
648 signal(SIGHUP, sighandler);
649 else
650 signal(SIGHUP, t);
651#endif
652#ifdef SIGTERM
653 t = signal(SIGTERM, SIG_IGN);
654 if (t == SIG_DFL)
655 signal(SIGTERM, sighandler);
656 else
657 signal(SIGTERM, t);
658#endif
659#endif /* HAVE_SIGNAL_H */
660 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000661}
662
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000663#ifdef TRACE_REFS
664/* Ask a yes/no question */
665
Guido van Rossum59bff391992-09-03 20:28:00 +0000666int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000667askyesno(prompt)
668 char *prompt;
669{
670 char buf[256];
671
672 printf("%s [ny] ", prompt);
673 if (fgets(buf, sizeof buf, stdin) == NULL)
674 return 0;
675 return buf[0] == 'y' || buf[0] == 'Y';
676}
677#endif
678
Guido van Rossuma110aa61994-08-29 12:50:44 +0000679#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000680
681/* Check for file descriptor connected to interactive device.
682 Pretend that stdin is always interactive, other files never. */
683
684int
685isatty(fd)
686 int fd;
687{
688 return fd == fileno(stdin);
689}
690
691#endif