mirror of
https://github.com/python/cpython.git
synced 2025-10-02 21:25:24 +00:00
Add run_command() to implement "-c command".
This commit is contained in:
parent
971443b7d4
commit
689e701919
1 changed files with 73 additions and 9 deletions
|
@ -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()
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue