blob: b8555207006ec08de36a1c28e9dd4f5805656e10 [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 Rossuma5900aa1991-04-16 08:42:06 +000029#include "patchlevel.h"
30
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000031#include "grammar.h"
32#include "node.h"
33#include "parsetok.h"
34#include "graminit.h"
35#include "errcode.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000036#include "sysmodule.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000037#include "compile.h"
38#include "ceval.h"
39#include "pythonrun.h"
40#include "import.h"
41
42extern char *getpythonpath();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
44extern grammar gram; /* From graminit.c */
45
Guido van Rossum3f5da241990-12-20 15:06:42 +000046#ifdef DEBUG
47int debugging; /* Needed by parser.c */
48#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000049
Guido van Rossum689e7011991-06-07 13:59:53 +000050/* Interface to getopt(): */
51extern int optind;
52extern char *optarg;
53extern int getopt PROTO((int, char **, char *));
54
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000055main(argc, argv)
56 int argc;
57 char **argv;
58{
Guido van Rossum689e7011991-06-07 13:59:53 +000059 int c;
60 int sts;
61 char *command = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000062 char *filename = NULL;
63 FILE *fp = stdin;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064
Guido van Rossum689e7011991-06-07 13:59:53 +000065 initargs(&argc, &argv); /* Defined in config*.c */
66
67 while ((c = getopt(argc, argv, "c:")) != EOF) {
68 switch (c) {
69
70 default:
71 fprintf(stderr,
72 "usage: %s [-c cmd | file | -] [arg] ...\n",
73 argv[0]);
74 exit(2);
75 /*NOTREACHED*/
76
77 case 'c':
78 if (command != NULL) {
79 fprintf(stderr, "%s: duplicate -c option\n",
80 argv[0]);
81 exit(2);
82 }
83 command = malloc(strlen(optarg) + 2);
84 /* Ignore malloc errors this early... */
85 strcpy(command, optarg);
86 strcat(command, "\n");
87 break;
88
89 }
90 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000091
Guido van Rossum689e7011991-06-07 13:59:53 +000092 if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
93 filename = argv[optind];
Guido van Rossum3f5da241990-12-20 15:06:42 +000094
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000095 if (filename != NULL) {
96 if ((fp = fopen(filename, "r")) == NULL) {
Guido van Rossum689e7011991-06-07 13:59:53 +000097 fprintf(stderr, "%s: can't open file '%s'\n",
98 argv[0], filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000099 exit(2);
100 }
101 }
102
Guido van Rossum689e7011991-06-07 13:59:53 +0000103 initall(); /* Defined in config*.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000105 setpythonpath(getpythonpath());
Guido van Rossum689e7011991-06-07 13:59:53 +0000106 if (command != NULL) {
107 /* Backup optind and force sys.argv[0] = '-c' */
108 optind--;
109 argv[optind] = "-c";
110 }
111 setpythonargv(argc-optind, argv+optind);
112
113 if (command) {
114 sts = run_command(command) != 0;
115 }
116 else {
117 sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
118 }
119
120 goaway(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000121 /*NOTREACHED*/
122}
123
Guido van Rossum3f5da241990-12-20 15:06:42 +0000124/* Initialize all */
125
126void
127initall()
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128{
Guido van Rossum3f5da241990-12-20 15:06:42 +0000129 static int inited;
130
131 if (inited)
132 return;
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000133 inited = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000134
135 initimport();
136
Guido van Rossum6c4f4a91990-12-20 23:11:33 +0000137 /* Modules 'builtin' and 'sys' are initialized here,
138 they are needed by random bits of the interpreter.
139 All other modules are optional and should be initialized
140 by the initcalls() of a specific configuration. */
141
Guido van Rossum3f5da241990-12-20 15:06:42 +0000142 initbuiltin(); /* Also initializes builtin exceptions */
143 initsys();
Guido van Rossum3f5da241990-12-20 15:06:42 +0000144
145 initcalls(); /* Configuration-dependent initializations */
146
147 initintr(); /* For intrcheck() */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148}
149
150/* Parse input from a file and execute it */
151
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152int
153run(fp, filename)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000154 FILE *fp;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155 char *filename;
156{
157 if (filename == NULL)
158 filename = "???";
159 if (isatty(fileno(fp)))
160 return run_tty_loop(fp, filename);
161 else
162 return run_script(fp, filename);
163}
164
165int
166run_tty_loop(fp, filename)
167 FILE *fp;
168 char *filename;
169{
170 object *v;
171 int ret;
172 v = sysget("ps1");
173 if (v == NULL) {
174 sysset("ps1", v = newstringobject(">>> "));
175 XDECREF(v);
176 }
177 v = sysget("ps2");
178 if (v == NULL) {
179 sysset("ps2", v = newstringobject("... "));
180 XDECREF(v);
181 }
182 for (;;) {
183 ret = run_tty_1(fp, filename);
184#ifdef REF_DEBUG
185 fprintf(stderr, "[%ld refs]\n", ref_total);
186#endif
187 if (ret == E_EOF)
188 return 0;
189 /*
190 if (ret == E_NOMEM)
191 return -1;
192 */
193 }
194}
195
196int
197run_tty_1(fp, filename)
198 FILE *fp;
199 char *filename;
200{
201 object *m, *d, *v, *w;
202 node *n;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 char *ps1, *ps2;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000204 int err;
205 v = sysget("ps1");
206 w = sysget("ps2");
207 if (v != NULL && is_stringobject(v)) {
208 INCREF(v);
209 ps1 = getstringvalue(v);
210 }
211 else {
212 v = NULL;
213 ps1 = "";
214 }
215 if (w != NULL && is_stringobject(w)) {
216 INCREF(w);
217 ps2 = getstringvalue(w);
218 }
219 else {
220 w = NULL;
221 ps2 = "";
222 }
223 err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n);
224 XDECREF(v);
225 XDECREF(w);
226 if (err == E_EOF)
227 return E_EOF;
228 if (err != E_DONE) {
229 err_input(err);
230 print_error();
231 return err;
232 }
233 m = add_module("__main__");
234 if (m == NULL)
235 return -1;
236 d = getmoduledict(m);
237 v = run_node(n, filename, d, d);
238 flushline();
239 if (v == NULL) {
240 print_error();
241 return -1;
242 }
243 DECREF(v);
244 return 0;
245}
246
247int
248run_script(fp, filename)
249 FILE *fp;
250 char *filename;
251{
252 object *m, *d, *v;
253 m = add_module("__main__");
254 if (m == NULL)
255 return -1;
256 d = getmoduledict(m);
257 v = run_file(fp, filename, file_input, d, d);
258 flushline();
259 if (v == NULL) {
260 print_error();
261 return -1;
262 }
263 DECREF(v);
264 return 0;
265}
266
Guido van Rossum689e7011991-06-07 13:59:53 +0000267int
268run_command(command)
269 char *command;
270{
271 object *m, *d, *v;
272 m = add_module("__main__");
273 if (m == NULL)
274 return -1;
275 d = getmoduledict(m);
276 v = run_string(command, file_input, d, d);
277 flushline();
278 if (v == NULL) {
279 print_error();
280 return -1;
281 }
282 DECREF(v);
283 return 0;
284}
285
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286void
287print_error()
288{
289 object *exception, *v;
290 err_get(&exception, &v);
291 fprintf(stderr, "Unhandled exception: ");
292 printobject(exception, stderr, PRINT_RAW);
293 if (v != NULL && v != None) {
294 fprintf(stderr, ": ");
295 printobject(v, stderr, PRINT_RAW);
296 }
297 fprintf(stderr, "\n");
298 XDECREF(exception);
299 XDECREF(v);
300 printtraceback(stderr);
301}
302
303object *
304run_string(str, start, globals, locals)
305 char *str;
306 int start;
307 /*dict*/object *globals, *locals;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000308{
309 node *n;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000310 int err;
311 err = parse_string(str, start, &n);
312 return run_err_node(err, n, "<string>", globals, locals);
313}
314
315object *
316run_file(fp, filename, start, globals, locals)
317 FILE *fp;
318 char *filename;
319 int start;
320 /*dict*/object *globals, *locals;
321{
322 node *n;
323 int err;
324 err = parse_file(fp, filename, start, &n);
325 return run_err_node(err, n, filename, globals, locals);
326}
327
328object *
329run_err_node(err, n, filename, globals, locals)
330 int err;
331 node *n;
332 char *filename;
333 /*dict*/object *globals, *locals;
334{
335 if (err != E_DONE) {
336 err_input(err);
337 return NULL;
338 }
339 return run_node(n, filename, globals, locals);
340}
341
342object *
343run_node(n, filename, globals, locals)
344 node *n;
345 char *filename;
346 /*dict*/object *globals, *locals;
347{
348 if (globals == NULL) {
349 globals = getglobals();
350 if (locals == NULL)
351 locals = getlocals();
352 }
353 else {
354 if (locals == NULL)
355 locals = globals;
356 }
357 return eval_node(n, filename, globals, locals);
358}
359
360object *
361eval_node(n, filename, globals, locals)
362 node *n;
363 char *filename;
364 object *globals;
365 object *locals;
366{
367 codeobject *co;
368 object *v;
369 co = compile(n, filename);
370 freetree(n);
371 if (co == NULL)
372 return NULL;
373 v = eval_code(co, globals, locals, (object *)NULL);
374 DECREF(co);
375 return v;
376}
377
378/* Simplified interface to parsefile */
379
380int
381parse_file(fp, filename, start, n_ret)
382 FILE *fp;
383 char *filename;
384 int start;
385 node **n_ret;
386{
387 return parsefile(fp, filename, &gram, start,
388 (char *)0, (char *)0, n_ret);
389}
390
391/* Simplified interface to parsestring */
392
393int
394parse_string(str, start, n_ret)
395 char *str;
396 int start;
397 node **n_ret;
398{
399 int err = parsestring(str, &gram, start, n_ret);
400 /* Don't confuse early end of string with early end of input */
401 if (err == E_EOF)
402 err = E_SYNTAX;
403 return err;
404}
405
406/* Print fatal error message and abort */
407
408void
409fatal(msg)
410 char *msg;
411{
412 fprintf(stderr, "Fatal error: %s\n", msg);
413 abort();
414}
415
416/* Clean up and exit */
417
418void
419goaway(sts)
420 int sts;
421{
422 flushline();
423
424 /* XXX Call doneimport() before donecalls(), since donecalls()
425 calls wdone(), and doneimport() may close windows */
426 doneimport();
427 donecalls();
428
429 err_clear();
430
431#ifdef REF_DEBUG
432 fprintf(stderr, "[%ld refs]\n", ref_total);
433#endif
434
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435#ifdef TRACE_REFS
436 if (askyesno("Print left references?")) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437 printrefs(stderr);
438 }
439#endif /* TRACE_REFS */
440
441 exit(sts);
442 /*NOTREACHED*/
443}
444
445static
446finaloutput()
447{
448#ifdef TRACE_REFS
449 if (!askyesno("Print left references?"))
450 return;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451 printrefs(stderr);
452#endif /* TRACE_REFS */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000453}
454
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000455/* Ask a yes/no question */
456
Guido van Rossum3f5da241990-12-20 15:06:42 +0000457static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458askyesno(prompt)
459 char *prompt;
460{
461 char buf[256];
462
463 printf("%s [ny] ", prompt);
464 if (fgets(buf, sizeof buf, stdin) == NULL)
465 return 0;
466 return buf[0] == 'y' || buf[0] == 'Y';
467}
468
Guido van Rossum2cfd3561991-06-04 19:38:58 +0000469#ifdef applec /* MPW (also usable for Think C 3.0) */
Guido van Rossumda0c6bd1990-11-18 17:28:24 +0000470
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471/* Check for file descriptor connected to interactive device.
472 Pretend that stdin is always interactive, other files never. */
473
474int
475isatty(fd)
476 int fd;
477{
478 return fd == fileno(stdin);
479}
480
Guido van Rossume6c67a71991-04-04 10:47:59 +0000481#endif