summaryrefslogtreecommitdiffstats
path: root/Python/pythonmain.c
diff options
context:
space:
mode:
Diffstat (limited to 'Python/pythonmain.c')
-rw-r--r--Python/pythonmain.c297
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
+*/