blob: 7504bc847d8224fe4e47f204ee78565d44c7d85b [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Python interpreter main program */
2
3/* XXX This is still a mess */
4
5#ifdef THINK_C
6#define USE_STDWIN
7#endif
8
9#include <stdio.h>
10#include <ctype.h>
11#include "string.h"
12
13#ifdef USE_STDWIN
14#include "stdwin.h"
15int use_stdwin;
16#endif
17
Guido van Rossum536d5d31990-10-14 20:05:00 +000018#ifdef USE_AUDIO
19#include "asa.h"
20#endif
21
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000022extern char *getenv();
23
24#include "PROTO.h"
25#include "grammar.h"
26#include "node.h"
27#include "parsetok.h"
28#include "graminit.h"
29#include "errcode.h"
30#include "object.h"
31#include "stringobject.h"
32#include "sysmodule.h"
33
34extern grammar gram; /* From graminit.c */
35
36#ifndef PYTHONPATH
37
38#ifdef THINK_C
39
40#define PYTHONPATH ": :mod"
41
42#else /* !THINK_C */
43
44#ifdef AMOEBA
45#define PYTHONPATH ".:/profile/module/python"
46#else /* !AMOEBA */
47#define PYTHONPATH ".:/usr/local/lib/python"
48#endif /* !AMOEBA */
49
50#endif /* !THINK_C */
51
52#endif /* !PYTHONPATH */
53
54int debugging;
55
56main(argc, argv)
57 int argc;
58 char **argv;
59{
60 char *path;
61 char *filename = NULL;
62 FILE *fp = stdin;
63 int ret;
64
65#ifdef USE_STDWIN
66#ifdef THINK_C
67 wsetstdio(1);
68#else THINK_C
69 /* Must use "python -s" now to get stdwin support */
70 if (argc > 1 && strcmp(argv[1], "-s") == 0)
71 argv[1] = argv[0],
72 argc--, argv++,
73#endif /* !THINK_C */
74 use_stdwin = 1;
75 if (use_stdwin)
76 winitargs(&argc, &argv);
77#endif /* USE_STDWIN */
78
79#ifdef THINK_C_not_today
80 printf("argc = %d, argv[0] = '%s'\n", argc, argv[0]);
81 if (argc <= 1)
82 askargs(&argc, &argv);
83#endif
84
85 initintr(); /* For intrcheck() */
86
87 if (argc > 1 && strcmp(argv[1], "-") != 0)
88 filename = argv[1];
89
90 if (filename != NULL) {
91 if ((fp = fopen(filename, "r")) == NULL) {
92 fprintf(stderr, "python: can't open file '%s'\n",
93 filename);
94 exit(2);
95 }
96 }
97
98 /* XXX what is the ideal initialization order? */
99
100 initsys(argc-1, argv+1);
101 inittime();
102 initmath();
103
104#ifndef THINK_C
105 path = getenv("PYTHONPATH");
106 if (path == NULL)
107#endif
108 path = PYTHONPATH;
109 setpythonpath(path);
110
111 initrun();
112
113#ifdef USE_POSIX
114 initposix();
115#endif
116
117#ifdef THINK_C
118 initmac();
119#endif
120
121#ifdef USE_AUDIO
122 initaudio();
123#endif
124
125#ifdef USE_AMOEBA
126 initamoeba();
127#endif
128
129#ifdef USE_STDWIN
130 if (use_stdwin)
131 initstdwin();
132#endif
133
134#ifdef USE_GL
135 initgl();
136#endif
137
138#ifdef USE_PANEL
139 initpanel();
140#endif
141
142 if (!isatty(fileno(fp))) {
143 ret = runfile(fp, file_input, (char *)NULL, (char *)NULL);
144 }
145 else {
146 sysset("ps1", newstringobject(">>> "));
147 sysset("ps2", newstringobject("... "));
148 for (;;) {
149 object *v = sysget("ps1"), *w = sysget("ps2");
150 char *ps1 = NULL, *ps2 = NULL;
151 if (v != NULL && is_stringobject(v)) {
152 INCREF(v);
153 ps1 = getstringvalue(v);
154 }
155 else
156 v = NULL;
157 if (w != NULL && is_stringobject(w)) {
158 INCREF(w);
159 ps2 = getstringvalue(w);
160 }
161 else
162 w = NULL;
163 ret = runfile(fp, single_input, ps1, ps2);
164 if (v != NULL)
165 DECREF(v);
166 if (w != NULL)
167 DECREF(w);
168 if (ret == E_EOF || ret == E_NOMEM)
169 break;
170 }
171 }
172 goaway(ret == E_DONE || ret == E_EOF ? 0 : 1);
173 /*NOTREACHED*/
174}
175
176goaway(sts)
177 int sts;
178{
179 closerun();
180#ifdef USE_STDWIN
181 if (use_stdwin)
182 wdone();
183#endif
Guido van Rossum536d5d31990-10-14 20:05:00 +0000184#ifdef USE_AUDIO
185 asa_done();
186#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187#ifdef THINK_C
188#ifndef TRACE_REFS
189 /* Avoid 'click mouse to continue' in Lightspeed C */
190 if (sts == 0)
191 Click_On(0);
192#endif
193#endif
194 exit(sts);
195 /*NOTREACHED*/
196}
197
198/* Parse input from a file and execute it */
199
200static int
201runfile(fp, start, ps1, ps2)
202 FILE *fp;
203 int start;
204 char *ps1, *ps2;
205{
206 node *n;
207 int ret;
208 ret = parsefile(fp, &gram, start, ps1, ps2, &n);
209 if (ret != E_DONE)
210 return ret;
211 return execute(n) == 0 ? E_DONE : E_ERROR;
212}
213
214#ifdef THINK_C
215
216/* Ask a yes/no question */
217
218int
219askyesno(prompt)
220 char *prompt;
221{
222 char buf[256];
223
224 printf("%s [ny] ", prompt);
225 if (fgets(buf, sizeof buf, stdin) == NULL)
226 return 0;
227 return buf[0] == 'y' || buf[0] == 'Y';
228}
229
230/* Check for file descriptor connected to interactive device.
231 Pretend that stdin is always interactive, other files never. */
232
233int
234isatty(fd)
235 int fd;
236{
237 return fd == fileno(stdin);
238}
239
240/* Kludge to get arguments on the Mac */
241
242#define MAXARGS 20
243
244static char *
245nextarg(pnext)
246 char **pnext;
247{
248 char *ret;
249 char *p = *pnext;
250 while (isspace(*p))
251 p++;
252 if (*p == '\0')
253 return NULL;
254 ret = p;
255 while (!isspace(*p))
256 p++;
257 if (*p != '\0')
258 *p++ = '\0';
259 *pnext = p;
260 return ret;
261}
262
263static
264askargs(pargc, pargv)
265 int *pargc;
266 char ***pargv; /* sic */
267{
268 static char buf[256];
269 static char *argv[MAXARGS];
270 int argc;
271 char *p, *next;
272 fprintf(stderr, "Args: ");
273 if (fgets(buf, sizeof buf, stdin) == NULL)
274 return;
275 next = buf;
276 if ((p = nextarg(&next)) == NULL)
277 return;
278 if (*pargc > 0)
279 argv[0] = (*pargv)[0];
280 else
281 argv[0] = "PYTHON";
282 argc = 1;
283 argv[argc++] = p;
284 while (argc+1 < MAXARGS && (p = nextarg(&next)) != NULL)
285 argv[argc++] = p;
286 argv[argc] = NULL;
287 *pargc = argc;
288 *pargv = argv;
289}
290
291#endif
292
293/* WISH LIST
294
295 - improved per-module error handling; different use of errno
296 - possible new types:
297 - iterator (for range, keys, ...)
298 - improve interpreter error handling, e.g., true tracebacks
299 - release parse trees when no longer needed (make them objects?)
300 - faster parser (for long modules)
301 - save precompiled modules on file?
302 - fork threads, locking
303 - allow syntax extensions
304*/