diff options
Diffstat (limited to 'Python/pythonmain.c')
-rw-r--r-- | Python/pythonmain.c | 297 |
1 files changed, 297 insertions, 0 deletions
diff --git a/Python/pythonmain.c b/Python/pythonmain.c new file mode 100644 index 0000000..c78a435 --- /dev/null +++ b/Python/pythonmain.c @@ -0,0 +1,297 @@ +/* Python interpreter main program */ + +/* XXX This is still a mess */ + +#ifdef THINK_C +#define USE_STDWIN +#endif + +#include <stdio.h> +#include <ctype.h> +#include "string.h" + +#ifdef USE_STDWIN +#include "stdwin.h" +int use_stdwin; +#endif + +extern char *getenv(); + +#include "PROTO.h" +#include "grammar.h" +#include "node.h" +#include "parsetok.h" +#include "graminit.h" +#include "errcode.h" +#include "object.h" +#include "stringobject.h" +#include "sysmodule.h" + +extern grammar gram; /* From graminit.c */ + +#ifndef PYTHONPATH + +#ifdef THINK_C + +#define PYTHONPATH ": :mod" + +#else /* !THINK_C */ + +#ifdef AMOEBA +#define PYTHONPATH ".:/profile/module/python" +#else /* !AMOEBA */ +#define PYTHONPATH ".:/usr/local/lib/python" +#endif /* !AMOEBA */ + +#endif /* !THINK_C */ + +#endif /* !PYTHONPATH */ + +int debugging; + +main(argc, argv) + int argc; + char **argv; +{ + char *path; + char *filename = NULL; + FILE *fp = stdin; + int ret; + +#ifdef USE_STDWIN +#ifdef THINK_C + wsetstdio(1); +#else THINK_C + /* Must use "python -s" now to get stdwin support */ + if (argc > 1 && strcmp(argv[1], "-s") == 0) + argv[1] = argv[0], + argc--, argv++, +#endif /* !THINK_C */ + use_stdwin = 1; + if (use_stdwin) + winitargs(&argc, &argv); +#endif /* USE_STDWIN */ + +#ifdef THINK_C_not_today + printf("argc = %d, argv[0] = '%s'\n", argc, argv[0]); + if (argc <= 1) + askargs(&argc, &argv); +#endif + + initintr(); /* For intrcheck() */ + + if (argc > 1 && strcmp(argv[1], "-") != 0) + filename = argv[1]; + + if (filename != NULL) { + if ((fp = fopen(filename, "r")) == NULL) { + fprintf(stderr, "python: can't open file '%s'\n", + filename); + exit(2); + } + } + + /* XXX what is the ideal initialization order? */ + + initsys(argc-1, argv+1); + inittime(); + initmath(); + +#ifndef THINK_C + path = getenv("PYTHONPATH"); + if (path == NULL) +#endif + path = PYTHONPATH; + setpythonpath(path); + + initrun(); + +#ifdef USE_POSIX + initposix(); +#endif + +#ifdef THINK_C + initmac(); +#endif + +#ifdef USE_AUDIO + initaudio(); +#endif + +#ifdef USE_AMOEBA + initamoeba(); +#endif + +#ifdef USE_STDWIN + if (use_stdwin) + initstdwin(); +#endif + +#ifdef USE_GL + initgl(); +#endif + +#ifdef USE_PANEL + initpanel(); +#endif + + if (!isatty(fileno(fp))) { + ret = runfile(fp, file_input, (char *)NULL, (char *)NULL); + } + else { + sysset("ps1", newstringobject(">>> ")); + sysset("ps2", newstringobject("... ")); + for (;;) { + object *v = sysget("ps1"), *w = sysget("ps2"); + char *ps1 = NULL, *ps2 = NULL; + if (v != NULL && is_stringobject(v)) { + INCREF(v); + ps1 = getstringvalue(v); + } + else + v = NULL; + if (w != NULL && is_stringobject(w)) { + INCREF(w); + ps2 = getstringvalue(w); + } + else + w = NULL; + ret = runfile(fp, single_input, ps1, ps2); + if (v != NULL) + DECREF(v); + if (w != NULL) + DECREF(w); + if (ret == E_EOF || ret == E_NOMEM) + break; + } + } + goaway(ret == E_DONE || ret == E_EOF ? 0 : 1); + /*NOTREACHED*/ +} + +goaway(sts) + int sts; +{ + closerun(); +#ifdef USE_STDWIN + if (use_stdwin) + wdone(); +#endif +#ifdef THINK_C +#ifndef TRACE_REFS + /* Avoid 'click mouse to continue' in Lightspeed C */ + if (sts == 0) + Click_On(0); +#endif +#endif + exit(sts); + /*NOTREACHED*/ +} + +/* Parse input from a file and execute it */ + +static int +runfile(fp, start, ps1, ps2) + FILE *fp; + int start; + char *ps1, *ps2; +{ + node *n; + int ret; + ret = parsefile(fp, &gram, start, ps1, ps2, &n); + if (ret != E_DONE) + return ret; + return execute(n) == 0 ? E_DONE : E_ERROR; +} + +#ifdef THINK_C + +/* Ask a yes/no question */ + +int +askyesno(prompt) + char *prompt; +{ + char buf[256]; + + printf("%s [ny] ", prompt); + if (fgets(buf, sizeof buf, stdin) == NULL) + return 0; + return buf[0] == 'y' || buf[0] == 'Y'; +} + +/* Check for file descriptor connected to interactive device. + Pretend that stdin is always interactive, other files never. */ + +int +isatty(fd) + int fd; +{ + return fd == fileno(stdin); +} + +/* Kludge to get arguments on the Mac */ + +#define MAXARGS 20 + +static char * +nextarg(pnext) + char **pnext; +{ + char *ret; + char *p = *pnext; + while (isspace(*p)) + p++; + if (*p == '\0') + return NULL; + ret = p; + while (!isspace(*p)) + p++; + if (*p != '\0') + *p++ = '\0'; + *pnext = p; + return ret; +} + +static +askargs(pargc, pargv) + int *pargc; + char ***pargv; /* sic */ +{ + static char buf[256]; + static char *argv[MAXARGS]; + int argc; + char *p, *next; + fprintf(stderr, "Args: "); + if (fgets(buf, sizeof buf, stdin) == NULL) + return; + next = buf; + if ((p = nextarg(&next)) == NULL) + return; + if (*pargc > 0) + argv[0] = (*pargv)[0]; + else + argv[0] = "PYTHON"; + argc = 1; + argv[argc++] = p; + while (argc+1 < MAXARGS && (p = nextarg(&next)) != NULL) + argv[argc++] = p; + argv[argc] = NULL; + *pargc = argc; + *pargv = argv; +} + +#endif + +/* WISH LIST + + - improved per-module error handling; different use of errno + - possible new types: + - iterator (for range, keys, ...) + - improve interpreter error handling, e.g., true tracebacks + - release parse trees when no longer needed (make them objects?) + - faster parser (for long modules) + - save precompiled modules on file? + - fork threads, locking + - allow syntax extensions +*/ |