Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 689e701

Browse files
committed
Add run_command() to implement "-c command".
1 parent 971443b commit 689e701

1 file changed

Lines changed: 73 additions & 9 deletions

File tree

Python/pythonmain.c

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,32 +47,77 @@ extern grammar gram; /* From graminit.c */
4747
int debugging; /* Needed by parser.c */
4848
#endif
4949

50+
/* Interface to getopt(): */
51+
extern int optind;
52+
extern char *optarg;
53+
extern int getopt PROTO((int, char **, char *));
54+
5055
main(argc, argv)
5156
int argc;
5257
char **argv;
5358
{
59+
int c;
60+
int sts;
61+
char *command = NULL;
5462
char *filename = NULL;
5563
FILE *fp = stdin;
5664

57-
initargs(&argc, &argv);
65+
initargs(&argc, &argv); /* Defined in config*.c */
66+
67+
while ((c = getopt(argc, argv, "c:")) != EOF) {
68+
switch (c) {
69+
70+
default:
71+
fprintf(stderr,
72+
"usage: %s [-c cmd | file | -] [arg] ...\n",
73+
argv[0]);
74+
exit(2);
75+
/*NOTREACHED*/
76+
77+
case 'c':
78+
if (command != NULL) {
79+
fprintf(stderr, "%s: duplicate -c option\n",
80+
argv[0]);
81+
exit(2);
82+
}
83+
command = malloc(strlen(optarg) + 2);
84+
/* Ignore malloc errors this early... */
85+
strcpy(command, optarg);
86+
strcat(command, "\n");
87+
break;
88+
89+
}
90+
}
5891

59-
if (argc > 1 && strcmp(argv[1], "-") != 0)
60-
filename = argv[1];
92+
if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
93+
filename = argv[optind];
6194

6295
if (filename != NULL) {
6396
if ((fp = fopen(filename, "r")) == NULL) {
64-
fprintf(stderr, "python: can't open file '%s'\n",
65-
filename);
97+
fprintf(stderr, "%s: can't open file '%s'\n",
98+
argv[0], filename);
6699
exit(2);
67100
}
68101
}
69102

70-
initall();
103+
initall(); /* Defined in config*.c */
71104

72105
setpythonpath(getpythonpath());
73-
setpythonargv(argc-1, argv+1);
74-
75-
goaway(run(fp, filename == NULL ? "<stdin>" : filename));
106+
if (command != NULL) {
107+
/* Backup optind and force sys.argv[0] = '-c' */
108+
optind--;
109+
argv[optind] = "-c";
110+
}
111+
setpythonargv(argc-optind, argv+optind);
112+
113+
if (command) {
114+
sts = run_command(command) != 0;
115+
}
116+
else {
117+
sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
118+
}
119+
120+
goaway(sts);
76121
/*NOTREACHED*/
77122
}
78123

@@ -219,6 +264,25 @@ run_script(fp, filename)
219264
return 0;
220265
}
221266

267+
int
268+
run_command(command)
269+
char *command;
270+
{
271+
object *m, *d, *v;
272+
m = add_module("__main__");
273+
if (m == NULL)
274+
return -1;
275+
d = getmoduledict(m);
276+
v = run_string(command, file_input, d, d);
277+
flushline();
278+
if (v == NULL) {
279+
print_error();
280+
return -1;
281+
}
282+
DECREF(v);
283+
return 0;
284+
}
285+
222286
void
223287
print_error()
224288
{

0 commit comments

Comments
 (0)