blob: e547f9238a0c11599127780a286723855f80e699 [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 */
205 fclose(fp);
206 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 Rossum3165fe61992-09-25 21:59:05 +0000245 object *exception, *v, *f;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000246 err_get(&exception, &v);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000247 if (exception == NULL) {
248 fprintf(stderr, "print_error called but no exception\n");
249 abort();
250 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000251 if (exception == SystemExit) {
252 if (v == NULL || v == None)
253 goaway(0);
254 if (is_intobject(v))
255 goaway((int)getintvalue(v));
256 else {
Guido van Rossum3165fe61992-09-25 21:59:05 +0000257 /* OK to use real stderr here */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000258 printobject(v, stderr, PRINT_RAW);
259 fprintf(stderr, "\n");
260 goaway(1);
261 }
262 }
263 sysset("last_type", exception);
264 sysset("last_value", v);
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 Rossum6ac258d1993-05-12 08:24:20 +0000269 printtraceback(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) {
289 while (*text == ' ' || *text == '\t') {
290 text++;
291 offset--;
292 }
293 writestring(" ", f);
294 writestring(text, f);
295 if (*text == '\0' ||
296 text[strlen(text)-1] != '\n')
297 writestring("\n", f);
298 writestring(" ", f);
299 offset--;
300 while (offset > 0) {
301 writestring(" ", f);
302 offset--;
303 }
304 writestring("^\n", f);
305 }
306 INCREF(message);
307 DECREF(v);
308 v = message;
309 }
310 }
Guido van Rossum3165fe61992-09-25 21:59:05 +0000311 if (writeobject(exception, f, PRINT_RAW) != 0)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000312 err_clear();
Guido van Rossum3165fe61992-09-25 21:59:05 +0000313 if (v != NULL && v != None) {
314 writestring(": ", f);
315 if (writeobject(v, f, PRINT_RAW) != 0)
316 err_clear();
317 }
318 writestring("\n", f);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000319 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000320 XDECREF(exception);
321 XDECREF(v);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000322}
323
324object *
325run_string(str, start, globals, locals)
326 char *str;
327 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000328 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000329{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000330 return run_err_node(parse_string(str, start),
331 "<string>", globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000332}
333
334object *
335run_file(fp, filename, start, globals, locals)
336 FILE *fp;
337 char *filename;
338 int start;
Guido van Rossum5b722181993-03-30 17:46:03 +0000339 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000340{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000341 return run_err_node(parse_file(fp, filename, start),
342 filename, globals, locals);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000343}
344
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000345static object *
Guido van Rossuma110aa61994-08-29 12:50:44 +0000346run_err_node(n, filename, globals, locals)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000347 node *n;
348 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000349 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000350{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000351 if (n == NULL)
352 return NULL;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000353 return run_node(n, filename, globals, locals);
354}
355
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000356static object *
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000357run_node(n, filename, globals, locals)
358 node *n;
359 char *filename;
Guido van Rossum5b722181993-03-30 17:46:03 +0000360 object *globals, *locals;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000361{
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000362 codeobject *co;
363 object *v;
364 co = compile(n, filename);
365 freetree(n);
366 if (co == NULL)
367 return NULL;
Guido van Rossum81daa321993-05-20 14:24:46 +0000368 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000369 DECREF(co);
370 return v;
371}
372
Guido van Rossum5b722181993-03-30 17:46:03 +0000373object *
Guido van Rossumfdef2711994-09-14 13:31:04 +0000374run_pyc_file(fp, filename, globals, locals)
375 FILE *fp;
376 char *filename;
377 object *globals, *locals;
378{
379 codeobject *co;
380 object *v;
381 long magic;
382 long get_pyc_magic();
383
384 magic = rd_long(fp);
385 if (magic != get_pyc_magic()) {
386 err_setstr(RuntimeError,
387 "Bad magic number in .pyc file");
388 return NULL;
389 }
390 (void) rd_long(fp);
391 v = rd_object(fp);
392 fclose(fp);
393 if (v == NULL || !is_codeobject(v)) {
394 XDECREF(v);
395 err_setstr(RuntimeError,
396 "Bad code object in .pyc file");
397 return NULL;
398 }
399 co = (codeobject *)v;
400 v = eval_code(co, globals, locals, (object *)NULL, (object *)NULL);
401 DECREF(co);
402 return v;
403}
404
405object *
Guido van Rossum5b722181993-03-30 17:46:03 +0000406compile_string(str, filename, start)
407 char *str;
408 char *filename;
409 int start;
410{
411 node *n;
412 int err;
413 codeobject *co;
Guido van Rossuma110aa61994-08-29 12:50:44 +0000414 n = parse_string(str, start);
415 if (n == NULL)
Guido van Rossum5b722181993-03-30 17:46:03 +0000416 return NULL;
Guido van Rossum5b722181993-03-30 17:46:03 +0000417 co = compile(n, filename);
418 freetree(n);
419 return (object *)co;
420}
421
Guido van Rossuma110aa61994-08-29 12:50:44 +0000422/* Simplified interface to parsefile -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000423
Guido van Rossuma110aa61994-08-29 12:50:44 +0000424node *
425parse_file(fp, filename, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000426 FILE *fp;
427 char *filename;
428 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000429{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000430 node *n;
431 perrdetail err;
Guido van Rossumff4949e1992-08-05 19:58:53 +0000432 BGN_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000433 n = parsefile(fp, filename, &gram, start,
434 (char *)0, (char *)0, &err);
Guido van Rossumff4949e1992-08-05 19:58:53 +0000435 END_SAVE
Guido van Rossuma110aa61994-08-29 12:50:44 +0000436 if (n == NULL)
437 err_input(&err);
438 return n;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000439}
440
Guido van Rossuma110aa61994-08-29 12:50:44 +0000441/* Simplified interface to parsestring -- return node or set exception */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000442
Guido van Rossuma110aa61994-08-29 12:50:44 +0000443node *
444parse_string(str, start)
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000445 char *str;
446 int start;
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000447{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000448 node *n;
449 perrdetail err;
450 n = parsestring(str, &gram, start, &err);
451 if (n == NULL)
452 err_input(&err);
453 return n;
454}
455
456/* Set the error appropriate to the given input error code (see errcode.h) */
457
458static void
459err_input(err)
460 perrdetail *err;
461{
462 object *v, *w;
463 char *msg = NULL;
464 v = mkvalue("(ziiz)", err->filename,
465 err->lineno, err->offset, err->text);
466 if (err->text != NULL) {
467 free(err->text);
468 err->text = NULL;
469 }
470 switch (err->error) {
471 case E_SYNTAX:
472 msg = "invalid syntax";
473 break;
474 case E_TOKEN:
475 msg = "invalid token";
476
477 break;
478 case E_INTR:
479 err_set(KeyboardInterrupt);
480 return;
481 case E_NOMEM:
482 err_nomem();
483 return;
484 case E_EOF:
485 msg = "unexpected EOF while parsing";
486 break;
487 default:
488 fprintf(stderr, "error=%d\n", err->error);
489 msg = "unknown parsing error";
490 break;
491 }
492 w = mkvalue("(sO)", msg, v);
493 XDECREF(v);
494 err_setval(SyntaxError, w);
495 XDECREF(w);
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000496}
497
498/* Print fatal error message and abort */
499
500void
501fatal(msg)
502 char *msg;
503{
504 fprintf(stderr, "Fatal error: %s\n", msg);
505 abort();
506}
507
508/* Clean up and exit */
509
Guido van Rossuma110aa61994-08-29 12:50:44 +0000510#ifdef WITH_THREAD
511#include "thread.h"
512int threads_started = 0; /* Set by threadmodule.c and maybe others */
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000513#endif
514
Guido van Rossum1662dd51994-09-07 14:38:28 +0000515#define NEXITFUNCS 32
516static void (*exitfuncs[NEXITFUNCS])();
517static int nexitfuncs = 0;
518
519int Py_AtExit(func)
520 void (*func) PROTO((void));
521{
522 if (nexitfuncs >= NEXITFUNCS)
523 return -1;
524 exitfuncs[nexitfuncs++] = func;
525 return 0;
526}
527
Guido van Rossuma110aa61994-08-29 12:50:44 +0000528void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000529cleanup()
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000530{
Guido van Rossum59bff391992-09-03 20:28:00 +0000531 object *exitfunc = sysget("exitfunc");
532
533 if (exitfunc) {
534 object *arg;
535 object *res;
536 sysset("exitfunc", (object *)NULL);
537 arg = newtupleobject(0);
538 if (arg == NULL)
539 res = NULL;
540 else {
541 res = call_object(exitfunc, arg);
542 DECREF(arg);
543 }
544 if (res == NULL) {
545 fprintf(stderr, "Error in sys.exitfunc:\n");
546 print_error();
547 }
548 }
549
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000550 flushline();
Guido van Rossum1662dd51994-09-07 14:38:28 +0000551
552 while (nexitfuncs > 0)
553 (*exitfuncs[--nexitfuncs])();
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000554}
555
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000556#ifdef COUNT_ALLOCS
557extern void dump_counts PROTO((void));
558#endif
559
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000560void
561goaway(sts)
562 int sts;
563{
564 cleanup();
Guido van Rossumff4949e1992-08-05 19:58:53 +0000565
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000566#ifdef COUNT_ALLOCS
567 dump_counts();
568#endif
569
Guido van Rossuma110aa61994-08-29 12:50:44 +0000570#ifdef WITH_THREAD
Guido van Rossumff4949e1992-08-05 19:58:53 +0000571
572 /* Other threads may still be active, so skip most of the
573 cleanup actions usually done (these are mostly for
574 debugging anyway). */
575
Guido van Rossumdf72a651992-08-12 15:27:32 +0000576 (void) save_thread();
Guido van Rossuma110aa61994-08-29 12:50:44 +0000577#ifndef NO_EXIT_PROG
Guido van Rossumf9f2e821992-08-17 08:59:08 +0000578 if (threads_started)
579 _exit_prog(sts);
580 else
581 exit_prog(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000582#else /* !NO_EXIT_PROG */
583 if (threads_started)
584 _exit(sts);
585 else
586 exit(sts);
587#endif /* !NO_EXIT_PROG */
Guido van Rossumff4949e1992-08-05 19:58:53 +0000588
Guido van Rossuma110aa61994-08-29 12:50:44 +0000589#else /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000590
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000591 doneimport();
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000592
593 err_clear();
594
595#ifdef REF_DEBUG
596 fprintf(stderr, "[%ld refs]\n", ref_total);
597#endif
598
599#ifdef TRACE_REFS
600 if (askyesno("Print left references?")) {
601 printrefs(stderr);
602 }
603#endif /* TRACE_REFS */
604
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000605 exit(sts);
Guido van Rossuma110aa61994-08-29 12:50:44 +0000606#endif /* WITH_THREAD */
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000607 /*NOTREACHED*/
608}
609
Guido van Rossuma110aa61994-08-29 12:50:44 +0000610#ifdef HAVE_SIGNAL_H
611static RETSIGTYPE
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000612sighandler(sig)
613 int sig;
614{
615 signal(sig, SIG_DFL); /* Don't catch recursive signals */
616 cleanup(); /* Do essential clean-up */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000617#ifdef HAVE_GETPID
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000618 kill(getpid(), sig); /* Pretend the signal killed us */
Guido van Rossuma110aa61994-08-29 12:50:44 +0000619#else
620 exit(1);
621#endif
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000622 /*NOTREACHED*/
623}
624#endif
625
Guido van Rossumf1dc5661993-07-05 10:31:29 +0000626static void
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000627initsigs()
628{
Guido van Rossuma110aa61994-08-29 12:50:44 +0000629 RETSIGTYPE (*t)();
630#ifdef HAVE_SIGNAL_H
631#ifdef SIGPIPE
632 signal(SIGPIPE, SIG_IGN);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000633#endif
Guido van Rossuma110aa61994-08-29 12:50:44 +0000634#ifdef SIGHUP
635 t = signal(SIGHUP, SIG_IGN);
636 if (t == SIG_DFL)
637 signal(SIGHUP, sighandler);
638 else
639 signal(SIGHUP, t);
640#endif
641#ifdef SIGTERM
642 t = signal(SIGTERM, SIG_IGN);
643 if (t == SIG_DFL)
644 signal(SIGTERM, sighandler);
645 else
646 signal(SIGTERM, t);
647#endif
648#endif /* HAVE_SIGNAL_H */
649 initintr(); /* May imply initsignal() */
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000650}
651
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000652#ifdef TRACE_REFS
653/* Ask a yes/no question */
654
Guido van Rossum59bff391992-09-03 20:28:00 +0000655int
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000656askyesno(prompt)
657 char *prompt;
658{
659 char buf[256];
660
661 printf("%s [ny] ", prompt);
662 if (fgets(buf, sizeof buf, stdin) == NULL)
663 return 0;
664 return buf[0] == 'y' || buf[0] == 'Y';
665}
666#endif
667
Guido van Rossuma110aa61994-08-29 12:50:44 +0000668#ifdef MPW
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000669
670/* Check for file descriptor connected to interactive device.
671 Pretend that stdin is always interactive, other files never. */
672
673int
674isatty(fd)
675 int fd;
676{
677 return fd == fileno(stdin);
678}
679
680#endif