@@ -47,32 +47,77 @@ extern grammar gram; /* From graminit.c */
4747int 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+
5055main (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+
222286void
223287print_error ()
224288{
0 commit comments