diff options
author | Guido van Rossum <guido@python.org> | 1991-06-07 13:59:53 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1991-06-07 13:59:53 (GMT) |
commit | 689e701919e542803f71a1464e6bf7548f0fd4b7 (patch) | |
tree | f7e2984c6a78d80bde71776f04ef3d9a83df82d9 /Python/pythonmain.c | |
parent | 971443b7d46f82f24412560934e9baeefaa094bc (diff) | |
download | cpython-689e701919e542803f71a1464e6bf7548f0fd4b7.zip cpython-689e701919e542803f71a1464e6bf7548f0fd4b7.tar.gz cpython-689e701919e542803f71a1464e6bf7548f0fd4b7.tar.bz2 |
Add run_command() to implement "-c command".
Diffstat (limited to 'Python/pythonmain.c')
-rw-r--r-- | Python/pythonmain.c | 82 |
1 files changed, 73 insertions, 9 deletions
diff --git a/Python/pythonmain.c b/Python/pythonmain.c index 12e0dfe..b855520 100644 --- a/Python/pythonmain.c +++ b/Python/pythonmain.c @@ -47,32 +47,77 @@ extern grammar gram; /* From graminit.c */ int debugging; /* Needed by parser.c */ #endif +/* Interface to getopt(): */ +extern int optind; +extern char *optarg; +extern int getopt PROTO((int, char **, char *)); + main(argc, argv) int argc; char **argv; { + int c; + int sts; + char *command = NULL; char *filename = NULL; FILE *fp = stdin; - initargs(&argc, &argv); + initargs(&argc, &argv); /* Defined in config*.c */ + + while ((c = getopt(argc, argv, "c:")) != EOF) { + switch (c) { + + default: + fprintf(stderr, + "usage: %s [-c cmd | file | -] [arg] ...\n", + argv[0]); + exit(2); + /*NOTREACHED*/ + + case 'c': + if (command != NULL) { + fprintf(stderr, "%s: duplicate -c option\n", + argv[0]); + exit(2); + } + command = malloc(strlen(optarg) + 2); + /* Ignore malloc errors this early... */ + strcpy(command, optarg); + strcat(command, "\n"); + break; + + } + } - if (argc > 1 && strcmp(argv[1], "-") != 0) - filename = argv[1]; + if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0) + filename = argv[optind]; if (filename != NULL) { if ((fp = fopen(filename, "r")) == NULL) { - fprintf(stderr, "python: can't open file '%s'\n", - filename); + fprintf(stderr, "%s: can't open file '%s'\n", + argv[0], filename); exit(2); } } - initall(); + initall(); /* Defined in config*.c */ setpythonpath(getpythonpath()); - setpythonargv(argc-1, argv+1); - - goaway(run(fp, filename == NULL ? "<stdin>" : filename)); + if (command != NULL) { + /* Backup optind and force sys.argv[0] = '-c' */ + optind--; + argv[optind] = "-c"; + } + setpythonargv(argc-optind, argv+optind); + + if (command) { + sts = run_command(command) != 0; + } + else { + sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0; + } + + goaway(sts); /*NOTREACHED*/ } @@ -219,6 +264,25 @@ run_script(fp, filename) 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() { |