Add run_command() to implement "-c command".

This commit is contained in:
Guido van Rossum 1991-06-07 13:59:53 +00:00
parent 971443b7d4
commit 689e701919

View file

@ -47,32 +47,77 @@ extern grammar gram; /* From graminit.c */
int debugging; /* Needed by parser.c */ int debugging; /* Needed by parser.c */
#endif #endif
/* Interface to getopt(): */
extern int optind;
extern char *optarg;
extern int getopt PROTO((int, char **, char *));
main(argc, argv) main(argc, argv)
int argc; int argc;
char **argv; char **argv;
{ {
int c;
int sts;
char *command = NULL;
char *filename = NULL; char *filename = NULL;
FILE *fp = stdin; 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) if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
filename = argv[1]; filename = argv[optind];
if (filename != NULL) { if (filename != NULL) {
if ((fp = fopen(filename, "r")) == NULL) { if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "python: can't open file '%s'\n", fprintf(stderr, "%s: can't open file '%s'\n",
filename); argv[0], filename);
exit(2); exit(2);
} }
} }
initall(); initall(); /* Defined in config*.c */
setpythonpath(getpythonpath()); setpythonpath(getpythonpath());
setpythonargv(argc-1, argv+1); if (command != NULL) {
/* Backup optind and force sys.argv[0] = '-c' */
goaway(run(fp, filename == NULL ? "<stdin>" : filename)); 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*/ /*NOTREACHED*/
} }
@ -219,6 +264,25 @@ run_script(fp, filename)
return 0; 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 void
print_error() print_error()
{ {