main.c 8.39 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1 2 3 4 5 6
/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

7 8
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
Guido van Rossum's avatar
Guido van Rossum committed
9
provided that the above copyright notice appear in all copies and that
10
both that copyright notice and this permission notice appear in
Guido van Rossum's avatar
Guido van Rossum committed
11
supporting documentation, and that the names of Stichting Mathematisch
12 13 14 15
Centrum or CWI or Corporation for National Research Initiatives or
CNRI not be used in advertising or publicity pertaining to
distribution of the software without specific, written prior
permission.
Guido van Rossum's avatar
Guido van Rossum committed
16

17 18 19 20 21 22 23 24 25 26 27 28
While CWI is the initial source for this software, a modified version
is made available by the Corporation for National Research Initiatives
(CNRI) at the Internet address ftp://ftp.python.org.

STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum's avatar
Guido van Rossum committed
29 30 31 32 33 34

******************************************************************/

/* Python interpreter main program */

#include "Python.h"
35
#include "osdefs.h"
Guido van Rossum's avatar
Guido van Rossum committed
36

37 38 39
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
Guido van Rossum's avatar
Guido van Rossum committed
40

41 42 43 44
#ifdef MS_WINDOWS
#include <fcntl.h>
#endif

45 46 47 48 49 50
#if defined(PYOS_OS2) || defined(MS_WINDOWS)
#define PYTHONHOMEHELP "<prefix>\\lib"
#else
#define PYTHONHOMEHELP "<prefix>/python1.5"
#endif

Guido van Rossum's avatar
Guido van Rossum committed
51 52 53 54 55 56
/* Interface to getopt(): */
extern int optind;
extern char *optarg;
extern int getopt(); /* PROTO((int, char **, char *)); -- not standardized */


57
/* For Py_GetArgcArgv(); set by main() */
Guido van Rossum's avatar
Guido van Rossum committed
58 59 60 61 62
static char **orig_argv;
static int  orig_argc;

/* Short usage message (with %s for argv0) */
static char *usage_line =
63
"usage: %s [option] ... [-c cmd | file | -] [arg] ...\n";
Guido van Rossum's avatar
Guido van Rossum committed
64 65

/* Long usage message, split into parts < 512 bytes */
66
static char *usage_top = "\
Guido van Rossum's avatar
Guido van Rossum committed
67 68
Options and arguments (and corresponding environment variables):\n\
-d     : debug output from parser (also PYTHONDEBUG=x)\n\
69
-i     : inspect interactively after running script, (also PYTHONINSPECT=x)\n\
70
         and force prompts, even if stdin does not appear to be a terminal\n\
71
-O     : optimize generated bytecode (a tad; also PYTHONOPTIMIZE=x)\n\
72
-OO    : remove doc-strings in addition to the -O optimizations\n\
73
-S     : don't imply 'import site' on initialization\n\
74
-t     : issue warnings about inconsistent tab usage (-tt: issue errors)\n\
75 76
";
static char *usage_mid = "\
77
-u     : unbuffered binary stdout and stderr (also PYTHONUNBUFFERED=x)\n\
Guido van Rossum's avatar
Guido van Rossum committed
78
-v     : verbose (trace import statements) (also PYTHONVERBOSE=x)\n\
79
-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
80
-X     : disable class based built-in exceptions\n\
81
-c cmd : program passed in as string (terminates option list)\n\
Guido van Rossum's avatar
Guido van Rossum committed
82 83
file   : program read from script file\n\
-      : program read from stdin (default; interactive mode if a tty)\n\
84 85
";
static char *usage_bot = "\
86
arg ...: arguments passed to program in sys.argv[1:]\n\
Guido van Rossum's avatar
Guido van Rossum committed
87 88
Other environment variables:\n\
PYTHONSTARTUP: file executed on interactive startup (no default)\n\
89
PYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
Guido van Rossum's avatar
Guido van Rossum committed
90
               default module search path.  The result is sys.path.\n\
91 92
PYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n\
               The default module search path uses %s.\n\
Guido van Rossum's avatar
Guido van Rossum committed
93 94 95 96 97
";


/* Main program */

98
DL_EXPORT(int)
99
Py_Main(argc, argv)
Guido van Rossum's avatar
Guido van Rossum committed
100 101 102 103 104 105 106 107 108 109 110
	int argc;
	char **argv;
{
	int c;
	int sts;
	char *command = NULL;
	char *filename = NULL;
	FILE *fp = stdin;
	char *p;
	int inspect = 0;
	int unbuffered = 0;
111
	int skipfirstline = 0;
112
	int stdin_is_interactive = 0;
Guido van Rossum's avatar
Guido van Rossum committed
113

114
	orig_argc = argc;	/* For Py_GetArgcArgv() */
Guido van Rossum's avatar
Guido van Rossum committed
115
	orig_argv = argv;
116

Guido van Rossum's avatar
Guido van Rossum committed
117 118 119 120 121
	if ((p = getenv("PYTHONINSPECT")) && *p != '\0')
		inspect = 1;
	if ((p = getenv("PYTHONUNBUFFERED")) && *p != '\0')
		unbuffered = 1;

122
	while ((c = getopt(argc, argv, "c:diOStuvxX")) != EOF) {
Guido van Rossum's avatar
Guido van Rossum committed
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
		if (c == 'c') {
			/* -c is the last option; following arguments
			   that look like options are left for the
			   the command to interpret. */
			command = malloc(strlen(optarg) + 2);
			if (command == NULL)
				Py_FatalError(
				   "not enough memory to copy -c argument");
			strcpy(command, optarg);
			strcat(command, "\n");
			break;
		}
		
		switch (c) {

		case 'd':
			Py_DebugFlag++;
			break;

		case 'i':
			inspect++;
144
			Py_InteractiveFlag++;
Guido van Rossum's avatar
Guido van Rossum committed
145 146
			break;

147 148 149 150
		case 'O':
			Py_OptimizeFlag++;
			break;

151 152 153 154
		case 'S':
			Py_NoSiteFlag++;
			break;

155 156 157 158
		case 't':
			Py_TabcheckFlag++;
			break;

Guido van Rossum's avatar
Guido van Rossum committed
159 160 161 162 163 164 165 166
		case 'u':
			unbuffered++;
			break;

		case 'v':
			Py_VerboseFlag++;
			break;

167 168 169 170
		case 'x':
			skipfirstline = 1;
			break;

171
		case 'X':
172
			Py_UseClassExceptionsFlag = 0;
173 174
			break;

Guido van Rossum's avatar
Guido van Rossum committed
175 176 177 178 179
		/* This space reserved for other options */

		default:
			fprintf(stderr, usage_line, argv[0]);
			fprintf(stderr, usage_top);
180
			fprintf(stderr, usage_mid);
181 182
			fprintf(stderr, usage_bot,
				DELIM, DELIM, PYTHONHOMEHELP);
Guido van Rossum's avatar
Guido van Rossum committed
183 184 185 186 187 188
			exit(2);
			/*NOTREACHED*/

		}
	}

189 190 191 192 193 194 195 196 197 198
	if (command == NULL && optind < argc &&
	    strcmp(argv[optind], "-") != 0)
	{
		filename = argv[optind];
		if (filename != NULL) {
			if ((fp = fopen(filename, "r")) == NULL) {
				fprintf(stderr, "%s: can't open file '%s'\n",
					argv[0], filename);
				exit(2);
			}
199
			else if (skipfirstline) {
200 201 202 203 204 205 206 207 208
				int ch;
				/* Push back first newline so line numbers
				   remain the same */
				while ((ch = getc(fp)) != EOF) {
					if (ch == '\n') {
						(void)ungetc(ch, fp);
						break;
					}
				}
209
			}
210 211 212 213 214
		}
	}

	stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);

Guido van Rossum's avatar
Guido van Rossum committed
215
	if (unbuffered) {
216
#ifdef MS_WINDOWS
217 218
		_setmode(fileno(stdin), O_BINARY);
		_setmode(fileno(stdout), O_BINARY);
219
#endif
Guido van Rossum's avatar
Guido van Rossum committed
220
#ifndef MPW
221
#ifdef HAVE_SETVBUF
222 223 224
		setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
		setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
225 226 227 228 229 230
#else /* !HAVE_SETVBUF */
		setbuf(stdin,  (char *)NULL);
		setbuf(stdout, (char *)NULL);
		setbuf(stderr, (char *)NULL);
#endif /* !HAVE_SETVBUF */
#else /* MPW */
Guido van Rossum's avatar
Guido van Rossum committed
231
		/* On MPW (3.2) unbuffered seems to hang */
232
		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
Guido van Rossum's avatar
Guido van Rossum committed
233 234
		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
		setvbuf(stderr, (char *)NULL, _IOLBF, BUFSIZ);
235
#endif /* MPW */
Guido van Rossum's avatar
Guido van Rossum committed
236
	}
237
	else if (Py_InteractiveFlag) {
238 239
#ifdef MS_WINDOWS
		/* Doesn't have to have line-buffered -- use unbuffered */
240
		/* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
241
		setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
242 243
#else /* !MS_WINDOWS */
#ifdef HAVE_SETVBUF
244 245
		setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
		setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
246 247
#endif /* HAVE_SETVBUF */
#endif /* !MS_WINDOWS */
248 249
		/* Leave stderr alone - it should be unbuffered anyway. */
  	}
Guido van Rossum's avatar
Guido van Rossum committed
250

251 252 253
	Py_SetProgramName(argv[0]);
	Py_Initialize();

Guido van Rossum's avatar
Guido van Rossum committed
254
	if (Py_VerboseFlag ||
255
	    (command == NULL && filename == NULL && stdin_is_interactive))
256 257
		fprintf(stderr, "Python %s on %s\n%s\n",
			Py_GetVersion(), Py_GetPlatform(), Py_GetCopyright());
Guido van Rossum's avatar
Guido van Rossum committed
258 259 260 261 262 263 264 265 266 267
	
	
	if (command != NULL) {
		/* Backup optind and force sys.argv[0] = '-c' */
		optind--;
		argv[optind] = "-c";
	}

	PySys_SetArgv(argc-optind, argv+optind);

268 269 270 271 272 273 274 275 276 277
	if ((inspect || (command == NULL && filename == NULL)) &&
	    isatty(fileno(stdin))) {
		PyObject *v;
		v = PyImport_ImportModule("readline");
		if (v == NULL)
			PyErr_Clear();
		else
			Py_DECREF(v);
	}

Guido van Rossum's avatar
Guido van Rossum committed
278 279
	if (command) {
		sts = PyRun_SimpleString(command) != 0;
280
		free(command);
Guido van Rossum's avatar
Guido van Rossum committed
281 282
	}
	else {
283
		if (filename == NULL && stdin_is_interactive) {
Guido van Rossum's avatar
Guido van Rossum committed
284 285 286 287 288 289 290 291 292 293 294
			char *startup = getenv("PYTHONSTARTUP");
			if (startup != NULL && startup[0] != '\0') {
				FILE *fp = fopen(startup, "r");
				if (fp != NULL) {
					(void) PyRun_SimpleFile(fp, startup);
					PyErr_Clear();
					fclose(fp);
				}
			}
		}
		sts = PyRun_AnyFile(
295 296
			fp,
			filename == NULL ? "<stdin>" : filename) != 0;
Guido van Rossum's avatar
Guido van Rossum committed
297 298 299 300
		if (filename != NULL)
			fclose(fp);
	}

301
	if (inspect && stdin_is_interactive &&
Guido van Rossum's avatar
Guido van Rossum committed
302 303 304
	    (filename != NULL || command != NULL))
		sts = PyRun_AnyFile(stdin, "<stdin>") != 0;

305
	Py_Finalize();
306
	return sts;
Guido van Rossum's avatar
Guido van Rossum committed
307 308 309 310 311 312 313
}


/* Make the *original* argc/argv available to other modules.
   This is rare, but it is needed by the secureware extension. */

void
314
Py_GetArgcArgv(argc, argv)
Guido van Rossum's avatar
Guido van Rossum committed
315 316 317 318 319 320
	int *argc;
	char ***argv;
{
	*argc = orig_argc;
	*argv = orig_argv;
}