blob: 36f13f0a9cd3fd05f5a76a5e018abdd9fbad2fe7 [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 +000044int debugging; /* Needed by parser.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045
Guido van Rossum689e7011991-06-07 13:59:53 +000046/* Interface to getopt(): */
47extern int optind;
48extern char *optarg;
49extern int getopt PROTO((int, char **, char *));
50
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051main(argc, argv)
52 int argc;
53 char **argv;
54{
Guido van Rossum689e7011991-06-07 13:59:53 +000055 int c;
56 int sts;
57 char *command = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000058 char *filename = NULL;
59 FILE *fp = stdin;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000060
Guido van Rossum689e7011991-06-07 13:59:53 +000061 initargs(&argc, &argv); /* Defined in config*.c */
62
Guido van Rossum8401e561992-01-19 16:48:36 +000063 while ((c = getopt(argc, argv, "c:d")) != EOF) {
Guido van Rossum46b16381992-01-02 16:16:18 +000064 if (c == 'c') {
65 /* -c is the last option; following arguments
66 that look like options are left for the
67 the command to interpret. */
68 command = malloc(strlen(optarg) + 2);
69 /* Ignore malloc errors this early... */
70 strcpy(command, optarg);
71 strcat(command, "\n");
72 break;
73 }
74
Guido van Rossum689e7011991-06-07 13:59:53 +000075 switch (c) {
76
Guido van Rossum8401e561992-01-19 16:48:36 +000077 case 'd':
78 debugging++;
79 break;
80
Guido van Rossum46b16381992-01-02 16:16:18 +000081 /* This space reserved for other options */
82
Guido van Rossum689e7011991-06-07 13:59:53 +000083 default:
84 fprintf(stderr,
85 "usage: %s [-c cmd | file | -] [arg] ...\n",
86 argv[0]);
87 exit(2);
88 /*NOTREACHED*/
89
Guido van Rossum689e7011991-06-07 13:59:53 +000090 }
91 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092
Guido van Rossum689e7011991-06-07 13:59:53 +000093 if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
94 filename = argv[optind];
Guido van Rossum3f5da241990-12-20 15:06:42 +000095
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000096 if (filename != NULL) {
97 if ((fp = fopen(filename, "r")) == NULL) {
Guido van Rossum689e7011991-06-07 13:59:53 +000098 fprintf(stderr, "%s: can't open file '%s'\n",
99 argv[0], filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 exit(2);
101 }
102 }
103
Guido van Rossum689e7011991-06-07 13:59:53 +0000104 initall(); /* Defined in config*.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000106 setpythonpath(getpythonpath());
Guido van Rossum689e7011991-06-07 13:59:53 +0000107 if (command != NULL) {
108 /* Backup optind and force sys.argv[0] = '-c' */
109 optind--;
110 argv[optind] = "-c";
111 }
112 setpythonargv(argc-optind, argv+optind);
113
114 if (command) {
115 sts = run_command(command) != 0;
116 }
117 else {
118 sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
119 }
120
121 goaway(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 /*NOTREACHED*/
123}
124
Guido van Rossum3f5da241990-12-20 15:06:42 +0000125/* Initialize all */
126
127void
128initall()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000129{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000130 static int inited;
131
132 if (inited)
133 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000134 inited = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135
136 initimport();
137
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000138 /* Modules 'builtin' and 'sys' are initialized here,
139 they are needed by random bits of the interpreter.
140 All other modules are optional and should be initialized
141 by the initcalls() of a specific configuration. */
142
Guido van Rossum3f5da241990-12-20 15:06:42 +0000143 initbuiltin(); /* Also initializes builtin exceptions */
144 initsys();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000145
146 initcalls(); /* Configuration-dependent initializations */
147
148 initintr(); /* For intrcheck() */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000149}
150
151/* Parse input from a file and execute it */
152
Guido van Rossum3f5da241990-12-20 15:06:42 +0000153int
154run(fp, filename)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 FILE *fp;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000156 char *filename;
157{
158 if (filename == NULL)
159 filename = "???";
160 if (isatty(fileno(fp)))
161 return run_tty_loop(fp, filename);
162 else
163 return run_script(fp, filename);
164}
165
166int
167run_tty_loop(fp, filename)
168 FILE *fp;
169 char *filename;
170{
171 object *v;
172 int ret;
173 v = sysget("ps1");
174 if (v == NULL) {
175 sysset("ps1", v = newstringobject(">>> "));
176 XDECREF(v);
177 }
178 v = sysget("ps2");
179 if (v == NULL) {
180 sysset("ps2", v = newstringobject("... "));
181 XDECREF(v);
182 }
183 for (;;) {
184 ret = run_tty_1(fp, filename);
185#ifdef REF_DEBUG
186 fprintf(stderr, "[%ld refs]\n", ref_total);
187#endif
188 if (ret == E_EOF)
189 return 0;
190 /*
191 if (ret == E_NOMEM)
192 return -1;
193 */
194 }
195}
196
197int
198run_tty_1(fp, filename)
199 FILE *fp;
200 char *filename;
201{
202 object *m, *d, *v, *w;
203 node *n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000204 char *ps1, *ps2;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000205 int err;
206 v = sysget("ps1");
207 w = sysget("ps2");
208 if (v != NULL && is_stringobject(v)) {
209 INCREF(v);
210 ps1 = getstringvalue(v);
211 }
212 else {
213 v = NULL;
214 ps1 = "";
215 }
216 if (w != NULL && is_stringobject(w)) {
217 INCREF(w);
218 ps2 = getstringvalue(w);
219 }
220 else {
221 w = NULL;
222 ps2 = "";
223 }
224 err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n);
225 XDECREF(v);
226 XDECREF(w);
227 if (err == E_EOF)
228 return E_EOF;
229 if (err != E_DONE) {
230 err_input(err);
231 print_error();
232 return err;
233 }
234 m = add_module("__main__");
235 if (m == NULL)
236 return -1;
237 d = getmoduledict(m);
238 v = run_node(n, filename, d, d);
239 flushline();
240 if (v == NULL) {
241 print_error();
242 return -1;
243 }
244 DECREF(v);
245 return 0;
246}
247
248int
249run_script(fp, filename)
250 FILE *fp;
251 char *filename;
252{
253 object *m, *d, *v;
254 m = add_module("__main__");
255 if (m == NULL)
256 return -1;
257 d = getmoduledict(m);
258 v = run_file(fp, filename, file_input, d, d);
259 flushline();
260 if (v == NULL) {
261 print_error();
262 return -1;
263 }
264 DECREF(v);
265 return 0;
266}
267
Guido van Rossum689e7011991-06-07 13:59:53 +0000268int
269run_command(command)
270 char *command;
271{
272 object *m, *d, *v;
273 m = add_module("__main__");
274 if (m == NULL)
275 return -1;
276 d = getmoduledict(m);
277 v = run_string(command, file_input, d, d);
278 flushline();
279 if (v == NULL) {
280 print_error();
281 return -1;
282 }
283 DECREF(v);
284 return 0;
285}
286
Guido van Rossum3f5da241990-12-20 15:06:42 +0000287void
288print_error()
289{
290 object *exception, *v;
291 err_get(&exception, &v);
Guido van Rossuma534ed31991-12-31 13:14:48 +0000292 if (exception == SystemExit) {
293 if (v == NULL || v == None)
294 goaway(0);
295 if (is_intobject(v))
296 goaway((int)getintvalue(v));
297 else {
298 printobject(v, stderr, PRINT_RAW);
299 fprintf(stderr, "\n");
300 goaway(1);
301 }
302 }
Guido van Rossumcb4eedde1992-01-27 16:48:10 +0000303 /*
Guido van Rossum3f5da241990-12-20 15:06:42 +0000304 fprintf(stderr, "Unhandled exception: ");
Guido van Rossumcb4eedde1992-01-27 16:48:10 +0000305 */
Guido van Rossumd783a461991-06-07 22:35:42 +0000306 if (printobject(exception, stderr, PRINT_RAW) != 0)
307 err_clear();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000308 if (v != NULL && v != None) {
309 fprintf(stderr, ": ");
Guido van Rossumd783a461991-06-07 22:35:42 +0000310 if (printobject(v, stderr, PRINT_RAW) != 0)
311 err_clear();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000312 }
313 fprintf(stderr, "\n");
314 XDECREF(exception);
315 XDECREF(v);
316 printtraceback(stderr);
317}
318
319object *
320run_string(str, start, globals, locals)
321 char *str;
322 int start;
323 /*dict*/object *globals, *locals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324{
325 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000326 int err;
327 err = parse_string(str, start, &n);
328 return run_err_node(err, n, "<string>", globals, locals);
329}
330
331object *
332run_file(fp, filename, start, globals, locals)
333 FILE *fp;
334 char *filename;
335 int start;
336 /*dict*/object *globals, *locals;
337{
338 node *n;
339 int err;
340 err = parse_file(fp, filename, start, &n);
341 return run_err_node(err, n, filename, globals, locals);
342}
343
344object *
345run_err_node(err, n, filename, globals, locals)
346 int err;
347 node *n;
348 char *filename;
349 /*dict*/object *globals, *locals;
350{
351 if (err != E_DONE) {
352 err_input(err);
353 return NULL;
354 }
355 return run_node(n, filename, globals, locals);
356}
357
358object *
359run_node(n, filename, globals, locals)
360 node *n;
361 char *filename;
362 /*dict*/object *globals, *locals;
363{
364 if (globals == NULL) {
365 globals = getglobals();
366 if (locals == NULL)
367 locals = getlocals();
368 }
369 else {
370 if (locals == NULL)
371 locals = globals;
372 }
373 return eval_node(n, filename, globals, locals);
374}
375
376object *
377eval_node(n, filename, globals, locals)
378 node *n;
379 char *filename;
380 object *globals;
381 object *locals;
382{
383 codeobject *co;
384 object *v;
385 co = compile(n, filename);
386 freetree(n);
387 if (co == NULL)
388 return NULL;
389 v = eval_code(co, globals, locals, (object *)NULL);
390 DECREF(co);
391 return v;
392}
393
394/* Simplified interface to parsefile */
395
396int
397parse_file(fp, filename, start, n_ret)
398 FILE *fp;
399 char *filename;
400 int start;
401 node **n_ret;
402{
403 return parsefile(fp, filename, &gram, start,
404 (char *)0, (char *)0, n_ret);
405}
406
407/* Simplified interface to parsestring */
408
409int
410parse_string(str, start, n_ret)
411 char *str;
412 int start;
413 node **n_ret;
414{
415 int err = parsestring(str, &gram, start, n_ret);
416 /* Don't confuse early end of string with early end of input */
417 if (err == E_EOF)
418 err = E_SYNTAX;
419 return err;
420}
421
422/* Print fatal error message and abort */
423
424void
425fatal(msg)
426 char *msg;
427{
428 fprintf(stderr, "Fatal error: %s\n", msg);
429 abort();
430}
431
432/* Clean up and exit */
433
434void
435goaway(sts)
436 int sts;
437{
438 flushline();
439
440 /* XXX Call doneimport() before donecalls(), since donecalls()
441 calls wdone(), and doneimport() may close windows */
442 doneimport();
443 donecalls();
444
445 err_clear();
446
447#ifdef REF_DEBUG
448 fprintf(stderr, "[%ld refs]\n", ref_total);
449#endif
450
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451#ifdef TRACE_REFS
452 if (askyesno("Print left references?")) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000453 printrefs(stderr);
454 }
455#endif /* TRACE_REFS */
456
457 exit(sts);
458 /*NOTREACHED*/
459}
460
461static
462finaloutput()
463{
464#ifdef TRACE_REFS
465 if (!askyesno("Print left references?"))
466 return;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000467 printrefs(stderr);
468#endif /* TRACE_REFS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469}
470
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471/* Ask a yes/no question */
472
Guido van Rossum3f5da241990-12-20 15:06:42 +0000473static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000474askyesno(prompt)
475 char *prompt;
476{
477 char buf[256];
478
479 printf("%s [ny] ", prompt);
480 if (fgets(buf, sizeof buf, stdin) == NULL)
481 return 0;
482 return buf[0] == 'y' || buf[0] == 'Y';
483}
484
Guido van Rossum2cfd3561991-06-04 19:38:58 +0000485#ifdef applec /* MPW (also usable for Think C 3.0) */
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000486
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000487/* Check for file descriptor connected to interactive device.
488 Pretend that stdin is always interactive, other files never. */
489
490int
491isatty(fd)
492 int fd;
493{
494 return fd == fileno(stdin);
495}
496
Guido van Rossume6c67a71991-04-04 10:47:59 +0000497#endif