diff options
author | Guido van Rossum <guido@python.org> | 1992-08-04 12:41:02 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1992-08-04 12:41:02 (GMT) |
commit | 1984f1e1c6306d4e8073c28d2395638f80ea509b (patch) | |
tree | 4366039e7665e689aef04549c3e3d73f99bdab32 /Python/pythonmain.c | |
parent | 4fbf798f866b10ee50cc91a394d19c0d4b2f79ab (diff) | |
download | cpython-1984f1e1c6306d4e8073c28d2395638f80ea509b.zip cpython-1984f1e1c6306d4e8073c28d2395638f80ea509b.tar.gz cpython-1984f1e1c6306d4e8073c28d2395638f80ea509b.tar.bz2 |
* Makefile adapted to changes below.
* split pythonmain.c in two: most stuff goes to pythonrun.c, in the library.
* new optional built-in threadmodule.c, build upon Sjoerd's thread.{c,h}.
* new module from Sjoerd: mmmodule.c (dynamically loaded).
* new module from Sjoerd: sv (svgen.py, svmodule.c.proto).
* new files thread.{c,h} (from Sjoerd).
* new xxmodule.c (example only).
* myselect.h: bzero -> memset
* select.c: bzero -> memset; removed global variable
Diffstat (limited to 'Python/pythonmain.c')
-rw-r--r-- | Python/pythonmain.c | 384 |
1 files changed, 3 insertions, 381 deletions
diff --git a/Python/pythonmain.c b/Python/pythonmain.c index a141168..0f76bfd 100644 --- a/Python/pythonmain.c +++ b/Python/pythonmain.c @@ -26,23 +26,10 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include "allobjects.h" -#include "grammar.h" -#include "node.h" -#include "parsetok.h" -#include "graminit.h" -#include "errcode.h" -#include "sysmodule.h" -#include "compile.h" -#include "ceval.h" -#include "pythonrun.h" -#include "import.h" - extern char *getpythonpath(); -extern grammar gram; /* From graminit.c */ - -int debugging; /* Needed by parser.c */ -int verbose; /* Needed by import.c */ +extern int debugging; /* Needed by parser.c */ +extern int verbose; /* Needed by import.c */ /* Interface to getopt(): */ extern int optind; @@ -108,12 +95,12 @@ main(argc, argv) initall(); - setpythonpath(getpythonpath()); if (command != NULL) { /* Backup optind and force sys.argv[0] = '-c' */ optind--; argv[optind] = "-c"; } + setpythonargv(argc-optind, argv+optind); if (command) { @@ -126,368 +113,3 @@ main(argc, argv) goaway(sts); /*NOTREACHED*/ } - -/* Initialize all */ - -void -initall() -{ - static int inited; - - if (inited) - return; - inited = 1; - - initimport(); - - /* Modules 'builtin' and 'sys' are initialized here, - they are needed by random bits of the interpreter. - All other modules are optional and should be initialized - by the initcalls() of a specific configuration. */ - - initbuiltin(); /* Also initializes builtin exceptions */ - initsys(); - - initcalls(); /* Configuration-dependent initializations */ - - initintr(); /* For intrcheck() */ -} - -/* Parse input from a file and execute it */ - -int -run(fp, filename) - FILE *fp; - char *filename; -{ - if (filename == NULL) - filename = "???"; - if (isatty((int)fileno(fp))) - return run_tty_loop(fp, filename); - else - return run_script(fp, filename); -} - -int -run_tty_loop(fp, filename) - FILE *fp; - char *filename; -{ - object *v; - int ret; - v = sysget("ps1"); - if (v == NULL) { - sysset("ps1", v = newstringobject(">>> ")); - XDECREF(v); - } - v = sysget("ps2"); - if (v == NULL) { - sysset("ps2", v = newstringobject("... ")); - XDECREF(v); - } - for (;;) { - ret = run_tty_1(fp, filename); -#ifdef REF_DEBUG - fprintf(stderr, "[%ld refs]\n", ref_total); -#endif - if (ret == E_EOF) - return 0; - /* - if (ret == E_NOMEM) - return -1; - */ - } -} - -int -run_tty_1(fp, filename) - FILE *fp; - char *filename; -{ - object *m, *d, *v, *w; - node *n; - char *ps1, *ps2; - int err; - v = sysget("ps1"); - w = sysget("ps2"); - if (v != NULL && is_stringobject(v)) { - INCREF(v); - ps1 = getstringvalue(v); - } - else { - v = NULL; - ps1 = ""; - } - if (w != NULL && is_stringobject(w)) { - INCREF(w); - ps2 = getstringvalue(w); - } - else { - w = NULL; - ps2 = ""; - } - err = parsefile(fp, filename, &gram, single_input, ps1, ps2, &n); - XDECREF(v); - XDECREF(w); - if (err == E_EOF) - return E_EOF; - if (err != E_DONE) { - err_input(err); - print_error(); - return err; - } - m = add_module("__main__"); - if (m == NULL) - return -1; - d = getmoduledict(m); - v = run_node(n, filename, d, d); - flushline(); - if (v == NULL) { - print_error(); - return -1; - } - DECREF(v); - return 0; -} - -int -run_script(fp, filename) - FILE *fp; - char *filename; -{ - object *m, *d, *v; - m = add_module("__main__"); - if (m == NULL) - return -1; - d = getmoduledict(m); - v = run_file(fp, filename, file_input, d, d); - flushline(); - if (v == NULL) { - print_error(); - return -1; - } - DECREF(v); - return 0; -} - -int -run_command(command) - char *command; -{ - object *m, *d, *v; - m = add_module("__main__"); - if (m == NULL) - return -1; - d = getmoduledict(m); - v = run_string(command, file_input, d, d); - flushline(); - if (v == NULL) { - print_error(); - return -1; - } - DECREF(v); - return 0; -} - -void -print_error() -{ - object *exception, *v; - err_get(&exception, &v); - if (exception == SystemExit) { - if (v == NULL || v == None) - goaway(0); - if (is_intobject(v)) - goaway((int)getintvalue(v)); - else { - printobject(v, stderr, PRINT_RAW); - fprintf(stderr, "\n"); - goaway(1); - } - } - sysset("last_type", exception); - sysset("last_value", v); - if (printobject(exception, stderr, PRINT_RAW) != 0) - err_clear(); - if (v != NULL && v != None) { - fprintf(stderr, ": "); - if (printobject(v, stderr, PRINT_RAW) != 0) - err_clear(); - } - fprintf(stderr, "\n"); - XDECREF(exception); - XDECREF(v); - printtraceback(stderr); -} - -object * -run_string(str, start, globals, locals) - char *str; - int start; - /*dict*/object *globals, *locals; -{ - node *n; - int err; - err = parse_string(str, start, &n); - return run_err_node(err, n, "<string>", globals, locals); -} - -object * -run_file(fp, filename, start, globals, locals) - FILE *fp; - char *filename; - int start; - /*dict*/object *globals, *locals; -{ - node *n; - int err; - err = parse_file(fp, filename, start, &n); - return run_err_node(err, n, filename, globals, locals); -} - -object * -run_err_node(err, n, filename, globals, locals) - int err; - node *n; - char *filename; - /*dict*/object *globals, *locals; -{ - if (err != E_DONE) { - err_input(err); - return NULL; - } - return run_node(n, filename, globals, locals); -} - -object * -run_node(n, filename, globals, locals) - node *n; - char *filename; - /*dict*/object *globals, *locals; -{ - if (globals == NULL) { - globals = getglobals(); - if (locals == NULL) - locals = getlocals(); - } - else { - if (locals == NULL) - locals = globals; - } - return eval_node(n, filename, globals, locals); -} - -object * -eval_node(n, filename, globals, locals) - node *n; - char *filename; - object *globals; - object *locals; -{ - codeobject *co; - object *v; - co = compile(n, filename); - freetree(n); - if (co == NULL) - return NULL; - v = eval_code(co, globals, locals, (object *)NULL); - DECREF(co); - return v; -} - -/* Simplified interface to parsefile */ - -int -parse_file(fp, filename, start, n_ret) - FILE *fp; - char *filename; - int start; - node **n_ret; -{ - return parsefile(fp, filename, &gram, start, - (char *)0, (char *)0, n_ret); -} - -/* Simplified interface to parsestring */ - -int -parse_string(str, start, n_ret) - char *str; - int start; - node **n_ret; -{ - int err = parsestring(str, &gram, start, n_ret); - /* Don't confuse early end of string with early end of input */ - if (err == E_EOF) - err = E_SYNTAX; - return err; -} - -/* Print fatal error message and abort */ - -void -fatal(msg) - char *msg; -{ - fprintf(stderr, "Fatal error: %s\n", msg); - abort(); -} - -/* Clean up and exit */ - -void -goaway(sts) - int sts; -{ - flushline(); - - /* XXX Call doneimport() before donecalls(), since donecalls() - calls wdone(), and doneimport() may close windows */ - doneimport(); - donecalls(); - - err_clear(); - -#ifdef REF_DEBUG - fprintf(stderr, "[%ld refs]\n", ref_total); -#endif - -#ifdef TRACE_REFS - if (askyesno("Print left references?")) { - printrefs(stderr); - } -#endif /* TRACE_REFS */ - - exit(sts); - /*NOTREACHED*/ -} - -#ifdef TRACE_REFS -/* Ask a yes/no question */ - -static 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'; -} -#endif - -#ifdef applec /* MPW (also usable for Think C 3.0) */ - -/* 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); -} - -#endif |