blob: ac9ca2c5b5fbf8bd036845dcfcb3586ba8ba208f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
11supporting documentation, and that the names of Stichting Mathematisch
12Centrum or CWI not be used in advertising or publicity pertaining to
13distribution of the software without specific, written prior permission.
14
15STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23******************************************************************/
24
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000025/* Python interpreter main program */
26
Guido van Rossum3f5da241990-12-20 15:06:42 +000027#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000028
Guido van Rossum1d5735e1994-08-30 08:27:36 +000029extern int debugging; /* Needed in parser.c, declared in pythonrun.c */
30extern int verbose; /* Needed in import.c, declared in pythonrun.c */
31extern int suppress_print; /* Needed in ceval.c, declared in pythonrun.c */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032
Guido van Rossum689e7011991-06-07 13:59:53 +000033/* Interface to getopt(): */
34extern int optind;
35extern char *optarg;
Guido van Rossumb376a4a1993-11-23 17:53:17 +000036extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
Guido van Rossum689e7011991-06-07 13:59:53 +000037
Guido van Rossumf56e3db1993-04-01 20:59:32 +000038extern char *getenv();
39
Guido van Rossum1d5735e1994-08-30 08:27:36 +000040extern char *getversion();
41extern char *getcopyright();
42
43int
44realmain(argc, argv)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045 int argc;
46 char **argv;
47{
Guido van Rossum689e7011991-06-07 13:59:53 +000048 int c;
49 int sts;
50 char *command = NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000051 char *filename = NULL;
52 FILE *fp = stdin;
Guido van Rossumf56e3db1993-04-01 20:59:32 +000053 char *p;
54 int inspect = 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000055 int unbuffered = 0;
Guido van Rossumf56e3db1993-04-01 20:59:32 +000056
57 if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
58 debugging = 1;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000059 if ((p = getenv("PYTHONSUPPRESS")) && *p != '\0')
60 suppress_print = 1;
Guido van Rossumf56e3db1993-04-01 20:59:32 +000061 if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
62 verbose = 1;
Guido van Rossum9e90a671993-06-24 11:10:19 +000063 if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
64 inspect = 1;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000065 if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
66 unbuffered = 1;
Guido van Rossum689e7011991-06-07 13:59:53 +000067
Guido van Rossum1d5735e1994-08-30 08:27:36 +000068 while ((c = getopt(argc, argv, "c:disuv")) != EOF) {
Guido van Rossum46b16381992-01-02 16:16:18 +000069 if (c == 'c') {
70 /* -c is the last option; following arguments
71 that look like options are left for the
72 the command to interpret. */
73 command = malloc(strlen(optarg) + 2);
Guido van Rossuma66e25d1994-09-29 09:38:18 +000074 if (command == NULL)
75 fatal("not enough memory to copy -c argument");
Guido van Rossum46b16381992-01-02 16:16:18 +000076 strcpy(command, optarg);
77 strcat(command, "\n");
78 break;
79 }
80
Guido van Rossum689e7011991-06-07 13:59:53 +000081 switch (c) {
82
Guido van Rossum8401e561992-01-19 16:48:36 +000083 case 'd':
84 debugging++;
85 break;
86
Guido van Rossumf56e3db1993-04-01 20:59:32 +000087 case 'i':
88 inspect++;
89 break;
90
Guido van Rossum1d5735e1994-08-30 08:27:36 +000091 case 's':
92 suppress_print++;
93 break;
94
95 case 'u':
96 unbuffered++;
Guido van Rossum9e90a671993-06-24 11:10:19 +000097 break;
98
Guido van Rossume3d70451992-03-27 17:21:30 +000099 case 'v':
100 verbose++;
101 break;
102
Guido van Rossum46b16381992-01-02 16:16:18 +0000103 /* This space reserved for other options */
104
Guido van Rossum689e7011991-06-07 13:59:53 +0000105 default:
106 fprintf(stderr,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000107"usage: %s [-d] [-i] [-s] [-u ] [-v] [-c cmd | file | -] [arg] ...\n",
Guido van Rossum689e7011991-06-07 13:59:53 +0000108 argv[0]);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000109 fprintf(stderr, "\
110\n\
111Options and arguments (and corresponding environment variables):\n\
112-d : debug output from parser (also PYTHONDEBUG=x)\n\
113-i : inspect interactively after running script (also PYTHONINSPECT=x)\n\
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000114-s : suppress the printing of top level expressions (also PYTHONSUPPRESS=x)\n\
115-u : unbuffered stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossum9e90a671993-06-24 11:10:19 +0000116-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
117-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000118");
119 /* ANSI does not allow strings > 512 chars
120 and MPW doesn't like it either -- so split it! */
121 fprintf(stderr, "\
Guido van Rossum9e90a671993-06-24 11:10:19 +0000122file : program read from script file\n\
123- : program read from stdin (default; interactive mode if a tty)\n\
124arg ...: arguments passed to program in sys.argv[1:]\n\
125\n\
126Other environment variables:\n\
127PYTHONSTARTUP: file executed on interactive startup (no default)\n\
128PYTHONPATH : colon-separated list of directories prefixed to the\n\
129 default module search path. The result is sys.path.\n\
130");
Guido van Rossum689e7011991-06-07 13:59:53 +0000131 exit(2);
132 /*NOTREACHED*/
133
Guido van Rossum689e7011991-06-07 13:59:53 +0000134 }
135 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000136
137 if (unbuffered) {
138#ifndef MPW
139 setbuf(stdout, (char *)NULL);
140 setbuf(stderr, (char *)NULL);
141#else
142 /* On MPW (3.2) unbuffered seems to hang */
143 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
144 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
145#endif
146 }
147
Guido van Rossum689e7011991-06-07 13:59:53 +0000148 if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
149 filename = argv[optind];
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000150
151 if (verbose ||
152 command == NULL && filename == NULL && isatty((int)fileno(fp)))
153 fprintf(stderr, "Python %s\n%s\n",
154 getversion(), getcopyright());
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 if (filename != NULL) {
157 if ((fp = fopen(filename, "r")) == NULL) {
Guido van Rossum689e7011991-06-07 13:59:53 +0000158 fprintf(stderr, "%s: can't open file '%s'\n",
159 argv[0], filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000160 exit(2);
161 }
162 }
163
Guido van Rossum138e6bf1992-06-03 17:08:15 +0000164 initall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165
Guido van Rossum689e7011991-06-07 13:59:53 +0000166 if (command != NULL) {
167 /* Backup optind and force sys.argv[0] = '-c' */
168 optind--;
169 argv[optind] = "-c";
170 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000171
Guido van Rossum689e7011991-06-07 13:59:53 +0000172 setpythonargv(argc-optind, argv+optind);
173
174 if (command) {
175 sts = run_command(command) != 0;
176 }
177 else {
Guido van Rossumda8cd861992-09-03 20:26:57 +0000178 if (filename == NULL && isatty((int)fileno(fp))) {
179 char *startup = getenv("PYTHONSTARTUP");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000180#ifdef macintosh
181 if (startup == NULL)
182 startup = "PythonStartup";
183#endif
Guido van Rossumda8cd861992-09-03 20:26:57 +0000184 if (startup != NULL && startup[0] != '\0') {
185 FILE *fp = fopen(startup, "r");
186 if (fp != NULL) {
187 (void) run_script(fp, startup);
188 err_clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000189 fclose(fp);
Guido van Rossumda8cd861992-09-03 20:26:57 +0000190 }
191 }
192 }
Guido van Rossum689e7011991-06-07 13:59:53 +0000193 sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000194 if (filename != NULL)
195 fclose(fp);
Guido van Rossum689e7011991-06-07 13:59:53 +0000196 }
197
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000198 if (inspect && isatty((int)fileno(stdin)) &&
199 (filename != NULL || command != NULL))
200 sts = run(stdin, "<stdin>") != 0;
201
Guido van Rossum689e7011991-06-07 13:59:53 +0000202 goaway(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000203 /*NOTREACHED*/
204}