main.c revision fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/***********************************************************
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumThe Netherlands.
4667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
5667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum                        All Rights Reserved
6667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
7d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPermission to use, copy, modify, and distribute this software and its
8d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdocumentation for any purpose and without fee is hereby granted,
9667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumprovided that the above copyright notice appear in all copies and that
10d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumboth that copyright notice and this permission notice appear in
11667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch
12d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCentrum or CWI or Corporation for National Research Initiatives or
13d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCNRI not be used in advertising or publicity pertaining to
14d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdistribution of the software without specific, written prior
15d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumpermission.
16667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
17d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumWhile CWI is the initial source for this software, a modified version
18d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumis made available by the Corporation for National Research Initiatives
19d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org.
20d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum
21d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPERFORMANCE OF THIS SOFTWARE.
29667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
30667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum******************************************************************/
31667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
32667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
33667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
34667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
35667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3666a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#ifdef HAVE_UNISTD_H
3766a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#include <unistd.h>
3866a7013c5cc85b84347f93c0d6e61594d230985aGuido van Rossum#endif
39667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
403e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#ifdef MS_WINDOWS
413e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
423e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
433e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
44667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Interface to getopt(): */
45667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern int optind;
46667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern char *optarg;
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumextern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */
48667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
49667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Subroutines that live in their own file */
51582646aecc3776109b784e1638849ea9c6389a55Guido van Rossumextern char *Py_GetVersion();
52fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossumextern char *Py_GetPlatform();
53582646aecc3776109b784e1638849ea9c6389a55Guido van Rossumextern char *Py_GetCopyright();
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
56ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetProgramName(); set by main() */
57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *argv0;
58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
59ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
60667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char **orig_argv;
61667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
62667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
63667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
64667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
657614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum"usage: %s [-d] [-i] [-O] [-s] [-u] [-v] [-c cmd | file | -] [arg] ...\n";
66667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
67667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
68667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_top = "\n\
69667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
70667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-d     : debug output from parser (also PYTHONDEBUG=x)\n\
71775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-i     : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
72775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum         and force prompts, even if stdin does not appear to be a terminal.\n\
737614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum-O     : optimize generated bytecode (a tad).\n\
74667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-s     : suppress printing of top level expressions (also PYTHONSUPPRESS=x)\n\
75667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-u     : unbuffered stdout and stderr (also PYTHONUNBUFFERED=x)\n\
76667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
77667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
78667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_bot = "\
79775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum-c cmd : program passed in as string (terminates option list)\n\
80667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumfile   : program read from script file\n\
81667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
82667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumarg ...: arguments passed to program in sys.argv[1:]\n\
83667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum\n\
84667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
85667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
86667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONPATH   : colon-separated list of directories prefixed to the\n\
87667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
8803ef6478476c284d3e60d81150610f44290b8d79Guido van RossumPYTHONHOME   : alternate <prefix> directory (or <prefix>:<exec_prefix>).\n\
8903ef6478476c284d3e60d81150610f44290b8d79Guido van Rossum               The default module search path uses <prefix>/lib/python1.5.\n\
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum";
91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
92667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
94667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumint
96667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossummain(argc, argv)
97667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int argc;
98667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char **argv;
99667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
100667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int c;
101667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int sts;
102667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *command = NULL;
103667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *filename = NULL;
104667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	FILE *fp = stdin;
105667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char *p;
106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int inspect = 0;
107667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int unbuffered = 0;
108775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	int stdin_is_interactive = 0;
109667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
110ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	orig_argc = argc;	/* For Py_GetArgcArgv() */
111667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	orig_argv = argv;
112ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum	argv0 = argv[0];	/* For Py_GetProgramName() */
113667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
114667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONDEBUG")) && *p != '\0')
115667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		Py_DebugFlag = 1;
116667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONSUPPRESS")) && *p != '\0')
117667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		Py_SuppressPrintingFlag = 1;
118667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONVERBOSE")) && *p != '\0')
119667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		Py_VerboseFlag = 1;
120667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
121667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		inspect = 1;
122667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
123667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		unbuffered = 1;
124667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1257614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum	while ((c = getopt(argc, argv, "c:diOsuv")) != EOF) {
126667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (c == 'c') {
127667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/* -c is the last option; following arguments
128667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   that look like options are left for the
129667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			   the command to interpret. */
130667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			command = malloc(strlen(optarg) + 2);
131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (command == NULL)
132667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				Py_FatalError(
133667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				   "not enough memory to copy -c argument");
134667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcpy(command, optarg);
135667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			strcat(command, "\n");
136667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
137667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
138667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
139667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		switch (c) {
140667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
141667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'd':
142667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_DebugFlag++;
143667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
144667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
145667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'i':
146667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			inspect++;
147775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			Py_InteractiveFlag++;
148667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
149667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
1507614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum		case 'O':
1517614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			Py_OptimizeFlag++;
1527614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum			break;
1537614da6b8743f1076dc68f130684b79bf4a78c0cGuido van Rossum
154667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 's':
155667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_SuppressPrintingFlag++;
156667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
157667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
158667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'u':
159667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			unbuffered++;
160667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
161667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
162667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		case 'v':
163667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			Py_VerboseFlag++;
164667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			break;
165667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
166667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* This space reserved for other options */
167667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
168667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		default:
169667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fprintf(stderr, usage_line, argv[0]);
170667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fprintf(stderr, usage_top);
171667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fprintf(stderr, usage_bot);
172667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			exit(2);
173667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			/*NOTREACHED*/
174667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
175667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
176667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
177667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
178775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (command == NULL && optind < argc &&
179775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	    strcmp(argv[optind], "-") != 0)
180775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	{
181775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		filename = argv[optind];
182775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename != NULL) {
183775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			if ((fp = fopen(filename, "r")) == NULL) {
184775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				fprintf(stderr, "%s: can't open file '%s'\n",
185775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum					argv[0], filename);
186775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum				exit(2);
187775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			}
188775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		}
189775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	}
190775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
191775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
192775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
193667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (unbuffered) {
194f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#ifdef MS_WINDOWS
1953e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdin), O_BINARY);
1963e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum		_setmode(fileno(stdout), O_BINARY);
197f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
198667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#ifndef MPW
199775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
200775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
201775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
202667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#else
203667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* On MPW (3.2) unbuffered seems to hang */
204775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
205667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
206667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
207667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#endif
208667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
2092a212191f8bd19c2deab88764b894dd31f39af78Guido van Rossum	else if (Py_InteractiveFlag) {
210b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
211b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		/* Doesn't have to have line-buffered -- use unbuffered */
212b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
213b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
214b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#else
215b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
216b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
217b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#endif
218775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		/* Leave stderr alone - it should be unbuffered anyway. */
219775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum  	}
220667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
221667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (Py_VerboseFlag ||
222129e91aa77b22db1637e9f6db9e081a4a0c9f2a1Guido van Rossum	    (command == NULL && filename == NULL && stdin_is_interactive))
223fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum		fprintf(stderr, "Python %s on %s\n%s\n",
224fe4dfc7ce3b27b8c1fce6de2321f20ac3bd9ce93Guido van Rossum			Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
225667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
226667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	Py_Initialize();
227667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
228667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command != NULL) {
229667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		/* Backup optind and force sys.argv[0] = '-c' */
230667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		optind--;
231667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		argv[optind] = "-c";
232667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
233667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
234667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	PySys_SetArgv(argc-optind, argv+optind);
235667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
236667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	if (command) {
237667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_SimpleString(command) != 0;
238667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
239667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	else {
240775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum		if (filename == NULL && stdin_is_interactive) {
241667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			char *startup = getenv("PYTHONSTARTUP");
242667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			if (startup != NULL && startup[0] != '\0') {
243667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				FILE *fp = fopen(startup, "r");
244667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				if (fp != NULL) {
245667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					(void) PyRun_SimpleFile(fp, startup);
246667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					PyErr_Clear();
247667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum					fclose(fp);
248667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum				}
249667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			}
250667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		}
251667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_AnyFile(
252775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			fp,
253775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum			filename == NULL ? "<stdin>" : filename) != 0;
254667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		if (filename != NULL)
255667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum			fclose(fp);
256667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	}
257667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
258775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum	if (inspect && stdin_is_interactive &&
259667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	    (filename != NULL || command != NULL))
260667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
261667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
262667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	Py_Exit(sts);
263a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum	return 0; /* Make gcc -Wall happy */
264667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
265667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
266667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
2678026febbd678ab132b96f96314b6fd222f4082c6Guido van Rossum/* Return the program name -- some code out there needs this
2688026febbd678ab132b96f96314b6fd222f4082c6Guido van Rossum   (currently _tkinter.c and importdl.c). */
269667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
270667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumchar *
271ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van RossumPy_GetProgramName()
272667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
273667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	return argv0;
274667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
275667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
276667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
277667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
278667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
279667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
280667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
281ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van RossumPy_GetArgcArgv(argc, argv)
282667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	int *argc;
283667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	char ***argv;
284667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
285667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argc = orig_argc;
286667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum	*argv = orig_argv;
287667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
288