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