blob: ccf5bcd4c15fd08e593331db3edae07bf0e71319 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
2Copyright 1991 by Stichting Mathematisch Centrum, Amsterdam, The
3Netherlands.
4
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
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Python interpreter main program */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000029#include "grammar.h"
30#include "node.h"
31#include "parsetok.h"
32#include "graminit.h"
33#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034#include "sysmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035#include "compile.h"
36#include "ceval.h"
37#include "pythonrun.h"
38#include "import.h"
39
40extern char *getpythonpath();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
42extern grammar gram; /* From graminit.c */
43
Guido van Rossum3f5da241990-12-20 15:06:42 +000044#ifdef DEBUG
45int debugging; /* Needed by parser.c */
46#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000047
Guido van Rossum689e7011991-06-07 13:59:53 +000048/* Interface to getopt(): */
49extern int optind;
50extern char *optarg;
51extern int getopt PROTO((int, char **, char *));
52
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000053main(argc, argv)
54 int argc;
55 char **argv;
56{
Guido van Rossum689e7011991-06-07 13:59:53 +000057 int c;
58 int sts;
59 char *command = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060 char *filename = NULL;
61 FILE *fp = stdin;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062
Guido van Rossum689e7011991-06-07 13:59:53 +000063 initargs(&argc, &argv); /* Defined in config*.c */
64
65 while ((c = getopt(argc, argv, "c:")) != EOF) {
Guido van Rossum46b16381992-01-02 16:16:18 +000066 if (c == 'c') {
67 /* -c is the last option; following arguments
68 that look like options are left for the
69 the command to interpret. */
70 command = malloc(strlen(optarg) + 2);
71 /* Ignore malloc errors this early... */
72 strcpy(command, optarg);
73 strcat(command, "\n");
74 break;
75 }
76
Guido van Rossum689e7011991-06-07 13:59:53 +000077 switch (c) {
78
Guido van Rossum46b16381992-01-02 16:16:18 +000079 /* This space reserved for other options */
80
Guido van Rossum689e7011991-06-07 13:59:53 +000081 default:
82 fprintf(stderr,
83 "usage: %s [-c cmd | file | -] [arg] ...\n",
84 argv[0]);
85 exit(2);
86 /*NOTREACHED*/
87
Guido van Rossum689e7011991-06-07 13:59:53 +000088 }
89 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000090
Guido van Rossum689e7011991-06-07 13:59:53 +000091 if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
92 filename = argv[optind];
Guido van Rossum3f5da241990-12-20 15:06:42 +000093
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000094 if (filename != NULL) {
95 if ((fp = fopen(filename, "r")) == NULL) {
Guido van Rossum689e7011991-06-07 13:59:53 +000096 fprintf(stderr, "%s: can't open file '%s'\n",
97 argv[0], filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098 exit(2);
99 }
100 }
101
Guido van Rossum689e7011991-06-07 13:59:53 +0000102 initall(); /* Defined in config*.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000103
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000104 setpythonpath(getpythonpath());
Guido van Rossum689e7011991-06-07 13:59:53 +0000105 if (command != NULL) {
106 /* Backup optind and force sys.argv[0] = '-c' */
107 optind--;
108 argv[optind] = "-c";
109 }
110 setpythonargv(argc-optind, argv+optind);
111
112 if (command) {
113 sts = run_command(command) != 0;
114 }
115 else {
116 sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
117 }
118
119 goaway(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120 /*NOTREACHED*/
121}
122
Guido van Rossum3f5da241990-12-20 15:06:42 +0000123/* Initialize all */
124
125void
126initall()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000127{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000128 static int inited;
129
130 if (inited)
131 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000132 inited = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000133
134 initimport();
135
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000136 /* Modules 'builtin' and 'sys' are initialized here,
137 they are needed by random bits of the interpreter.
138 All other modules are optional and should be initialized
139 by the initcalls() of a specific configuration. */
140
Guido van Rossum3f5da241990-12-20 15:06:42 +0000141 initbuiltin(); /* Also initializes builtin exceptions */
142 initsys();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143
144 initcalls(); /* Configuration-dependent initializations */
145
146 initintr(); /* For intrcheck() */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000147}
148
149/* Parse input from a file and execute it */
150
Guido van Rossum3f5da241990-12-20 15:06:42 +0000151int
152run(fp, filename)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 FILE *fp;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000154 char *filename;
155{
156 if (filename == NULL)
157 filename = "???";
158 if (isatty(fileno(fp)))
159 return run_tty_loop(fp, filename);
160 else
161 return run_script(fp, filename);
162}
163
164int
165run_tty_loop(fp, filename)
166 FILE *fp;
167 char *filename;
168{
169 object *v;
170 int ret;
171 v = sysget("ps1");
172 if (v == NULL) {
173 sysset("ps1", v = newstringobject(">>> "));
174 XDECREF(v);
175 }
176 v = sysget("ps2");
177 if (v == NULL) {
178 sysset("ps2", v = newstringobject("... "));
179 XDECREF(v);
180 }
181 for (;;) {
182 ret = run_tty_1(fp, filename);
183#ifdef REF_DEBUG
184 fprintf(stderr, "[%ld refs]\n", ref_total);
185#endif
186 if (ret == E_EOF)
187 return 0;
188 /*
189 if (ret == E_NOMEM)
190 return -1;
191 */
192 }
193}
194
195int
196run_tty_1(fp, filename)
197 FILE *fp;
198 char *filename;
199{
200 object *m, *d, *v, *w;
201 node *n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 char *ps1, *ps2;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000203 int err;
204 v = sysget("ps1");
205 w = sysget("ps2");
206 if (v != NULL && is_stringobject(v)) {
207 INCREF(v);
208 ps1 = getstringvalue(v);
209 }
210 else {
211 v = NULL;
212 ps1 = "";
213 }
214 if (w != NULL && is_stringobject(w)) {
215 INCREF(w);
216 ps2 = getstringvalue(w);
217 }
218 else {
219 w = NULL;
220 ps2 = "";
221 }
222 err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n);
223 XDECREF(v);
224 XDECREF(w);
225 if (err == E_EOF)
226 return E_EOF;
227 if (err != E_DONE) {
228 err_input(err);
229 print_error();
230 return err;
231 }
232 m = add_module("__main__");
233 if (m == NULL)
234 return -1;
235 d = getmoduledict(m);
236 v = run_node(n, filename, d, d);
237 flushline();
238 if (v == NULL) {
239 print_error();
240 return -1;
241 }
242 DECREF(v);
243 return 0;
244}
245
246int
247run_script(fp, filename)
248 FILE *fp;
249 char *filename;
250{
251 object *m, *d, *v;
252 m = add_module("__main__");
253 if (m == NULL)
254 return -1;
255 d = getmoduledict(m);
256 v = run_file(fp, filename, file_input, d, d);
257 flushline();
258 if (v == NULL) {
259 print_error();
260 return -1;
261 }
262 DECREF(v);
263 return 0;
264}
265
Guido van Rossum689e7011991-06-07 13:59:53 +0000266int
267run_command(command)
268 char *command;
269{
270 object *m, *d, *v;
271 m = add_module("__main__");
272 if (m == NULL)
273 return -1;
274 d = getmoduledict(m);
275 v = run_string(command, file_input, d, d);
276 flushline();
277 if (v == NULL) {
278 print_error();
279 return -1;
280 }
281 DECREF(v);
282 return 0;
283}
284
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285void
286print_error()
287{
288 object *exception, *v;
289 err_get(&exception, &v);
Guido van Rossuma534ed31991-12-31 13:14:48 +0000290 if (exception == SystemExit) {
291 if (v == NULL || v == None)
292 goaway(0);
293 if (is_intobject(v))
294 goaway((int)getintvalue(v));
295 else {
296 printobject(v, stderr, PRINT_RAW);
297 fprintf(stderr, "\n");
298 goaway(1);
299 }
300 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000301 fprintf(stderr, "Unhandled exception: ");
Guido van Rossumd783a461991-06-07 22:35:42 +0000302 if (printobject(exception, stderr, PRINT_RAW) != 0)
303 err_clear();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 if (v != NULL && v != None) {
305 fprintf(stderr, ": ");
Guido van Rossumd783a461991-06-07 22:35:42 +0000306 if (printobject(v, stderr, PRINT_RAW) != 0)
307 err_clear();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 }
309 fprintf(stderr, "\n");
310 XDECREF(exception);
311 XDECREF(v);
312 printtraceback(stderr);
313}
314
315object *
316run_string(str, start, globals, locals)
317 char *str;
318 int start;
319 /*dict*/object *globals, *locals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320{
321 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000322 int err;
323 err = parse_string(str, start, &n);
324 return run_err_node(err, n, "<string>", globals, locals);
325}
326
327object *
328run_file(fp, filename, start, globals, locals)
329 FILE *fp;
330 char *filename;
331 int start;
332 /*dict*/object *globals, *locals;
333{
334 node *n;
335 int err;
336 err = parse_file(fp, filename, start, &n);
337 return run_err_node(err, n, filename, globals, locals);
338}
339
340object *
341run_err_node(err, n, filename, globals, locals)
342 int err;
343 node *n;
344 char *filename;
345 /*dict*/object *globals, *locals;
346{
347 if (err != E_DONE) {
348 err_input(err);
349 return NULL;
350 }
351 return run_node(n, filename, globals, locals);
352}
353
354object *
355run_node(n, filename, globals, locals)
356 node *n;
357 char *filename;
358 /*dict*/object *globals, *locals;
359{
360 if (globals == NULL) {
361 globals = getglobals();
362 if (locals == NULL)
363 locals = getlocals();
364 }
365 else {
366 if (locals == NULL)
367 locals = globals;
368 }
369 return eval_node(n, filename, globals, locals);
370}
371
372object *
373eval_node(n, filename, globals, locals)
374 node *n;
375 char *filename;
376 object *globals;
377 object *locals;
378{
379 codeobject *co;
380 object *v;
381 co = compile(n, filename);
382 freetree(n);
383 if (co == NULL)
384 return NULL;
385 v = eval_code(co, globals, locals, (object *)NULL);
386 DECREF(co);
387 return v;
388}
389
390/* Simplified interface to parsefile */
391
392int
393parse_file(fp, filename, start, n_ret)
394 FILE *fp;
395 char *filename;
396 int start;
397 node **n_ret;
398{
399 return parsefile(fp, filename, &gram, start,
400 (char *)0, (char *)0, n_ret);
401}
402
403/* Simplified interface to parsestring */
404
405int
406parse_string(str, start, n_ret)
407 char *str;
408 int start;
409 node **n_ret;
410{
411 int err = parsestring(str, &gram, start, n_ret);
412 /* Don't confuse early end of string with early end of input */
413 if (err == E_EOF)
414 err = E_SYNTAX;
415 return err;
416}
417
418/* Print fatal error message and abort */
419
420void
421fatal(msg)
422 char *msg;
423{
424 fprintf(stderr, "Fatal error: %s\n", msg);
425 abort();
426}
427
428/* Clean up and exit */
429
430void
431goaway(sts)
432 int sts;
433{
434 flushline();
435
436 /* XXX Call doneimport() before donecalls(), since donecalls()
437 calls wdone(), and doneimport() may close windows */
438 doneimport();
439 donecalls();
440
441 err_clear();
442
443#ifdef REF_DEBUG
444 fprintf(stderr, "[%ld refs]\n", ref_total);
445#endif
446
Guido van Rossum3f5da241990-12-20 15:06:42 +0000447#ifdef TRACE_REFS
448 if (askyesno("Print left references?")) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449 printrefs(stderr);
450 }
451#endif /* TRACE_REFS */
452
453 exit(sts);
454 /*NOTREACHED*/
455}
456
457static
458finaloutput()
459{
460#ifdef TRACE_REFS
461 if (!askyesno("Print left references?"))
462 return;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000463 printrefs(stderr);
464#endif /* TRACE_REFS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000465}
466
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000467/* Ask a yes/no question */
468
Guido van Rossum3f5da241990-12-20 15:06:42 +0000469static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470askyesno(prompt)
471 char *prompt;
472{
473 char buf[256];
474
475 printf("%s [ny] ", prompt);
476 if (fgets(buf, sizeof buf, stdin) == NULL)
477 return 0;
478 return buf[0] == 'y' || buf[0] == 'Y';
479}
480
Guido van Rossum2cfd3561991-06-04 19:38:58 +0000481#ifdef applec /* MPW (also usable for Think C 3.0) */
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000482
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000483/* Check for file descriptor connected to interactive device.
484 Pretend that stdin is always interactive, other files never. */
485
486int
487isatty(fd)
488 int fd;
489{
490 return fd == fileno(stdin);
491}
492
Guido van Rossume6c67a71991-04-04 10:47:59 +0000493#endif