Mercurial > cpython-lru_cache-weakref
annotate Python/pythonmain.c @ 16:0808e5ab743a legacy-trunk
Call asa_done() in goaway().
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Sun, 14 Oct 1990 20:05:00 +0000 |
| parents | fc6fcd7df4f7 |
| children | a36c348a8e1a |
| rev | line source |
|---|---|
| 6 | 1 /* 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" | |
| 15 int use_stdwin; | |
| 16 #endif | |
| 17 | |
|
16
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
18 #ifdef USE_AUDIO |
|
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
19 #include "asa.h" |
|
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
20 #endif |
|
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
21 |
| 6 | 22 extern 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 | |
| 34 extern 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 | |
| 54 int debugging; | |
| 55 | |
| 56 main(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 | |
| 176 goaway(sts) | |
| 177 int sts; | |
| 178 { | |
| 179 closerun(); | |
| 180 #ifdef USE_STDWIN | |
| 181 if (use_stdwin) | |
| 182 wdone(); | |
| 183 #endif | |
|
16
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
184 #ifdef USE_AUDIO |
|
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
185 asa_done(); |
|
0808e5ab743a
Call asa_done() in goaway().
Guido van Rossum <guido@python.org>
parents:
6
diff
changeset
|
186 #endif |
| 6 | 187 #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 | |
| 200 static int | |
| 201 runfile(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 | |
| 218 int | |
| 219 askyesno(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 | |
| 233 int | |
| 234 isatty(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 | |
| 244 static char * | |
| 245 nextarg(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 | |
| 263 static | |
| 264 askargs(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 */ |
