blob: a41a55953f62c444297968793a4cfdd97f2c9948 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum1d5735e1994-08-30 08:27:36 +00002Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum,
Guido van Rossum9bfef441993-03-29 10:43:31 +00003Amsterdam, The 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);
74 /* Ignore malloc errors this early... */
75 strcpy(command, optarg);
76 strcat(command, "\n");
77 break;
78 }
79
Guido van Rossum689e7011991-06-07 13:59:53 +000080 switch (c) {
81
Guido van Rossum8401e561992-01-19 16:48:36 +000082 case 'd':
83 debugging++;
84 break;
85
Guido van Rossumf56e3db1993-04-01 20:59:32 +000086 case 'i':
87 inspect++;
88 break;
89
Guido van Rossum1d5735e1994-08-30 08:27:36 +000090 case 's':
91 suppress_print++;
92 break;
93
94 case 'u':
95 unbuffered++;
Guido van Rossum9e90a671993-06-24 11:10:19 +000096 break;
97
Guido van Rossume3d70451992-03-27 17:21:30 +000098 case 'v':
99 verbose++;
100 break;
101
Guido van Rossum46b16381992-01-02 16:16:18 +0000102 /* This space reserved for other options */
103
Guido van Rossum689e7011991-06-07 13:59:53 +0000104 default:
105 fprintf(stderr,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000106"usage: %s [-d] [-i] [-s] [-u ] [-v] [-c cmd | file | -] [arg] ...\n",
Guido van Rossum689e7011991-06-07 13:59:53 +0000107 argv[0]);
Guido van Rossum9e90a671993-06-24 11:10:19 +0000108 fprintf(stderr, "\
109\n\
110Options and arguments (and corresponding environment variables):\n\
111-d : debug output from parser (also PYTHONDEBUG=x)\n\
112-i : inspect interactively after running script (also PYTHONINSPECT=x)\n\
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000113-s : suppress the printing of top level expressions (also PYTHONSUPPRESS=x)\n\
114-u : unbuffered stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossum9e90a671993-06-24 11:10:19 +0000115-v : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
116-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000117");
118 /* ANSI does not allow strings > 512 chars
119 and MPW doesn't like it either -- so split it! */
120 fprintf(stderr, "\
Guido van Rossum9e90a671993-06-24 11:10:19 +0000121file : program read from script file\n\
122- : program read from stdin (default; interactive mode if a tty)\n\
123arg ...: arguments passed to program in sys.argv[1:]\n\
124\n\
125Other environment variables:\n\
126PYTHONSTARTUP: file executed on interactive startup (no default)\n\
127PYTHONPATH : colon-separated list of directories prefixed to the\n\
128 default module search path. The result is sys.path.\n\
129");
Guido van Rossum689e7011991-06-07 13:59:53 +0000130 exit(2);
131 /*NOTREACHED*/
132
Guido van Rossum689e7011991-06-07 13:59:53 +0000133 }
134 }
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000135
136 if (unbuffered) {
137#ifndef MPW
138 setbuf(stdout, (char *)NULL);
139 setbuf(stderr, (char *)NULL);
140#else
141 /* On MPW (3.2) unbuffered seems to hang */
142 setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
143 setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
144#endif
145 }
146
Guido van Rossum689e7011991-06-07 13:59:53 +0000147 if (command == NULL && optind < argc && strcmp(argv[optind], "-") != 0)
148 filename = argv[optind];
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000149
150 if (verbose ||
151 command == NULL && filename == NULL && isatty((int)fileno(fp)))
152 fprintf(stderr, "Python %s\n%s\n",
153 getversion(), getcopyright());
Guido van Rossum3f5da241990-12-20 15:06:42 +0000154
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000155 if (filename != NULL) {
156 if ((fp = fopen(filename, "r")) == NULL) {
Guido van Rossum689e7011991-06-07 13:59:53 +0000157 fprintf(stderr, "%s: can't open file '%s'\n",
158 argv[0], filename);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 exit(2);
160 }
161 }
162
Guido van Rossum138e6bf1992-06-03 17:08:15 +0000163 initall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000164
Guido van Rossum689e7011991-06-07 13:59:53 +0000165 if (command != NULL) {
166 /* Backup optind and force sys.argv[0] = '-c' */
167 optind--;
168 argv[optind] = "-c";
169 }
Guido van Rossum1984f1e1992-08-04 12:41:02 +0000170
Guido van Rossum689e7011991-06-07 13:59:53 +0000171 setpythonargv(argc-optind, argv+optind);
172
173 if (command) {
174 sts = run_command(command) != 0;
175 }
176 else {
Guido van Rossumda8cd861992-09-03 20:26:57 +0000177 if (filename == NULL && isatty((int)fileno(fp))) {
178 char *startup = getenv("PYTHONSTARTUP");
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000179#ifdef macintosh
180 if (startup == NULL)
181 startup = "PythonStartup";
182#endif
Guido van Rossumda8cd861992-09-03 20:26:57 +0000183 if (startup != NULL && startup[0] != '\0') {
184 FILE *fp = fopen(startup, "r");
185 if (fp != NULL) {
186 (void) run_script(fp, startup);
187 err_clear();
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000188 fclose(fp);
Guido van Rossumda8cd861992-09-03 20:26:57 +0000189 }
190 }
191 }
Guido van Rossum689e7011991-06-07 13:59:53 +0000192 sts = run(fp, filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000193 if (filename != NULL)
194 fclose(fp);
Guido van Rossum689e7011991-06-07 13:59:53 +0000195 }
196
Guido van Rossumf56e3db1993-04-01 20:59:32 +0000197 if (inspect && isatty((int)fileno(stdin)) &&
198 (filename != NULL || command != NULL))
199 sts = run(stdin, "<stdin>") != 0;
200
Guido van Rossum689e7011991-06-07 13:59:53 +0000201 goaway(sts);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202 /*NOTREACHED*/
203}