1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
5667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
65651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou#include <locale.h>
75651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou
89cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
9945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
10bfce0f977d20be0781f2b6f201ec309a67bf6099Steve Dower#ifdef HAVE_IO_H
11bfce0f977d20be0781f2b6f201ec309a67bf6099Steve Dower#include <io.h>
12bfce0f977d20be0781f2b6f201ec309a67bf6099Steve Dower#endif
13477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
143e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
153e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
16477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
173e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
18945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
19945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
20945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
22ab70e2ab3264c444ac70a1c98e869b0de0b22c4aJesus Cea#if defined(MS_WINDOWS)
23a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
24a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
25da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
27a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
282cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
292cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
30a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3136002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3236002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
33a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
3449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
3549fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
3649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
3749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
38ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
39790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
40667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
41667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
42bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
43ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes#define BASE_OPTS L"bBc:dEhiIJm:OqRsStuvVW:xX:?"
44bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
45bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
463ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
482d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_line[] =
49790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
50667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
51667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
522d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_1[] = "\
53667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
542ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
552ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
56790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
57393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
5889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
59790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
600e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6161c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
622d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_2[] = "\
6398297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
6498297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
65ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes-I     : isolate Python from the user's environment (implies -E and -s)\n\
66db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
6789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
686b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
699d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl-q     : don't print version and copyright messages on interactive startup\n\
708dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
717922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
72393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
732d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_3[] = "\
7461b0c672b5e9ba1cf564947ecb38d175fd70ea7eEzio Melotti-u     : unbuffered binary stdout and stderr, stdin always buffered;\n\
7561b0c672b5e9ba1cf564947ecb38d175fd70ea7eEzio Melotti         also PYTHONUNBUFFERED=x\n\
76db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
7789f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
7889f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
790e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
800e175a6e762676fca6bfd656912bb862e29fbdd5INADA Naoki         when given twice, print more information about the build\n\
8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
820805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey         also PYTHONWARNINGS=arg\n\
83393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
849583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou-X opt : set implementation-specific option\n\
857922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
862d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_4[] = "\
8798297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
8898297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
8989f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
90667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
91667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
921ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy StorchakaPYTHONPATH   : '%lc'-separated list of directories prefixed to the\n\
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
94790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
952d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchakastatic const char usage_5[] =
961ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka"PYTHONHOME   : alternate <prefix> directory (or <prefix>%lc<exec_prefix>).\n"
979802b39c12712e924bed699812756ce5076b77a3Victor Stinner"               The default module search path uses %s.\n"
989802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
999802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
10034be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONFAULTHANDLER: dump the Python traceback on fatal errors.\n";
10134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinnerstatic const char usage_6[] =
10234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONHASHSEED: if this variable is set to 'random', a random value is used\n"
10334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   to seed the hashes of str, bytes and datetime objects.  It can also be\n"
10434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   set to an integer in the range [0,4294967295] to get hash values with a\n"
10534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   predictable seed.\n"
10634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"PYTHONMALLOC: set the Python memory allocators and/or install debug hooks\n"
10734be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   on Python memory allocators. Use PYTHONMALLOC=debug to install debug\n"
10834be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner"   hooks.\n";
109667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
110852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
111ef1585eb9a488ae8ce3ff057f43a7048b941cc1cSerhiy Storchakausage(int exitcode, const wchar_t* program)
1123b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *f = exitcode ? stderr : stdout;
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(f, usage_line, program);
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode)
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, "Try `python -h' for more information.\n");
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_1, f);
120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_2, f);
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_3, f);
1221ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka        fprintf(f, usage_4, (wint_t)DELIM);
1231ba01615dedd936625242724e19f6cf25e5aa0f3Serhiy Storchaka        fprintf(f, usage_5, (wint_t)DELIM, PYTHONHOMEHELP);
1242daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        fputs(usage_6, f);
125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return exitcode;
1273b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1283b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1296caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1306caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *startup = Py_GETENV("PYTHONSTARTUP");
132f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (startup != NULL && startup[0] != '\0') {
133daf455554bc21b6b5df0a016ab5fa639d36cc595Victor Stinner        FILE *fp = _Py_fopen(startup, "r");
134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (fp != NULL) {
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            int save_errno;
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            save_errno = errno;
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = save_errno;
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            startup);
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Print();
147f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1506caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1516caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
1521a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitroustatic void RunInteractiveHook(void)
1531a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou{
1541a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyObject *sys, *hook, *result;
1551a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    sys = PyImport_ImportModule("sys");
1561a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    if (sys == NULL)
1571a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        goto error;
1581a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    hook = PyObject_GetAttrString(sys, "__interactivehook__");
1591a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    Py_DECREF(sys);
1601a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    if (hook == NULL)
1611a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        PyErr_Clear();
1621a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    else {
1631a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        result = PyObject_CallObject(hook, NULL);
1641a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        Py_DECREF(hook);
1651a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        if (result == NULL)
1661a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            goto error;
1671a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        else
1681a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            Py_DECREF(result);
1691a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    }
1701a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    return;
1711a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou
1721a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrouerror:
1731a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PySys_WriteStderr("Failed calling sys.__interactivehook__\n");
1741a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyErr_Print();
1751a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou    PyErr_Clear();
1761a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou}
1771a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou
178db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1795651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
180a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *module, *runpy, *runmodule, *runargs, *result;
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runpy = PyImport_ImportModule("runpy");
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runpy == NULL) {
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not import runpy module\n");
1857d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runmodule == NULL) {
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not access runpy._run_module_as_main\n");
1917d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    module = PyUnicode_FromWideChar(modname, wcslen(modname));
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module == NULL) {
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not convert module name to unicode\n");
1987d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runargs = Py_BuildValue("(Oi)", module, set_argv0);
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runargs == NULL) {
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr,
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Could not create arguments for runpy._run_module_as_main\n");
2077d36e4f074a0141966394284f877bbe2270ccd93Victor Stinner        PyErr_Print();
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(module);
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyObject_Call(runmodule, runargs, NULL);
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runpy);
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runmodule);
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(module);
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runargs);
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(result);
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
226db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2273b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
22875345c552d0889f4f63039d6063f371846c8f41fNick Coghlanstatic PyObject *
22975345c552d0889f4f63039d6063f371846c8f41fNick CoghlanAsImportPathEntry(wchar_t *filename)
2309cd177526afc086a300b548588880329c32f607dChristian Heimes{
23175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PyObject *sys_path0 = NULL, *importer;
232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
23375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    sys_path0 = PyUnicode_FromWideChar(filename, wcslen(filename));
23475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    if (sys_path0 == NULL)
2354726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2364726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
23775345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    importer = PyImport_GetImporter(sys_path0);
2384726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    if (importer == NULL)
2394726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2404726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
241aa93642a35ed570ba91a80c583df2c8a383686d6Brett Cannon    if (importer == Py_None) {
24275345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        Py_DECREF(sys_path0);
2434726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        Py_DECREF(importer);
24475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        return NULL;
245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2464726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    Py_DECREF(importer);
24775345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    return sys_path0;
24875345c552d0889f4f63039d6063f371846c8f41fNick Coghlan
24975345c552d0889f4f63039d6063f371846c8f41fNick Coghlanerror:
25075345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    Py_XDECREF(sys_path0);
25175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PySys_WriteStderr("Failed checking if argv[0] is an import path entry\n");
25275345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PyErr_Print();
25375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PyErr_Clear();
25475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    return NULL;
25575345c552d0889f4f63039d6063f371846c8f41fNick Coghlan}
25675345c552d0889f4f63039d6063f371846c8f41fNick Coghlan
25775345c552d0889f4f63039d6063f371846c8f41fNick Coghlan
25875345c552d0889f4f63039d6063f371846c8f41fNick Coghlanstatic int
25975345c552d0889f4f63039d6063f371846c8f41fNick CoghlanRunMainFromImporter(PyObject *sys_path0)
26075345c552d0889f4f63039d6063f371846c8f41fNick Coghlan{
26175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PyObject *sys_path;
26275345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    int sts;
2634726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
26475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    /* Assume sys_path0 has already been checked by AsImportPathEntry,
26575345c552d0889f4f63039d6063f371846c8f41fNick Coghlan     * so put it in sys.path[0] and import __main__ */
266bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    sys_path = PySys_GetObject("path");
2671e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner    if (sys_path == NULL) {
2681e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner        PyErr_SetString(PyExc_RuntimeError, "unable to get sys.path");
2694726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2701e53bbacedaed883104454693c29d1ad31f5029bVictor Stinner    }
27175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    sts = PyList_Insert(sys_path, 0, sys_path0);
2726d46ae7d12d2cbe4c5b2bd7b023dd37ff12dec68Steve Dower    if (sts) {
27375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        sys_path0 = NULL;
2744726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner        goto error;
2754726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    }
2764726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2774726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    sts = RunModule(L"__main__", 0);
2784726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return sts != 0;
2794726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner
2804726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinnererror:
28175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    Py_XDECREF(sys_path0);
2824726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    PyErr_Print();
2834726e40e00ad9c2e333c4dfc5005f410a520834cVictor Stinner    return 1;
2849cd177526afc086a300b548588880329c32f607dChristian Heimes}
2859cd177526afc086a300b548588880329c32f607dChristian Heimes
286a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int
287a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf)
288a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{
289a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyObject *unicode, *bytes;
290a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    int ret;
291a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
292a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    unicode = PyUnicode_FromWideChar(command, -1);
293a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (unicode == NULL)
294a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
295a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    bytes = PyUnicode_AsUTF8String(unicode);
296a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(unicode);
297a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (bytes == NULL)
298a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
299a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
300a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(bytes);
301a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return ret != 0;
302a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
303a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror:
304398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner    PySys_WriteStderr("Unable to decode the command from the command line:\n");
305a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyErr_Print();
306a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return 1;
307a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner}
308a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
3090a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int
3100a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
3110a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{
3120a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    PyObject *unicode, *bytes = NULL;
3130a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    char *filename_str;
3140a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    int run;
3150a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3160a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    /* call pending calls like signal handlers (SIGINT) */
3170a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (Py_MakePendingCalls() == -1) {
3180a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        PyErr_Print();
3190a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        return 1;
3200a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
3210a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3220a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (filename) {
3230a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
3240a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (unicode != NULL) {
325e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            bytes = PyUnicode_EncodeFSDefault(unicode);
3260a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            Py_DECREF(unicode);
3270a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3280a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (bytes != NULL)
3290a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = PyBytes_AsString(bytes);
3300a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        else {
3310a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            PyErr_Clear();
332e0f32687152615b7266e66cbee216434fbbdd5bcVictor Stinner            filename_str = "<encoding error>";
3330a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3340a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
3350a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    else
3360a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        filename_str = "<stdin>";
3370a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3380a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
3390a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    Py_XDECREF(bytes);
3400a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    return run != 0;
3410a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner}
3420a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3439cd177526afc086a300b548588880329c32f607dChristian Heimes
344667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
345667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
346fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
347790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
348667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int c;
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int sts;
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *command = NULL;
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *filename = NULL;
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *module = NULL;
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *fp = stdin;
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
356e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *wp;
358e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int skipfirstline = 0;
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int stdin_is_interactive = 0;
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int help = 0;
362f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int version = 0;
363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int saw_unbuffered_flag = 0;
36434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    char *opt;
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags cf;
36675345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    PyObject *main_importer_path = NULL;
3676999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    PyObject *warning_option = NULL;
3686999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    PyObject *warning_options = NULL;
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    cf.cf_flags = 0;
371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argc = argc;           /* For Py_GetArgcArgv() */
373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argv = argv;
374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
37586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    /* Hash randomization needed early for all string operations
37686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou       (including -W and -X options). */
377a0dd22e5e824195e322cb417ebb34c66475e952dEzio Melotti    _PyOS_opterr = 0;  /* prevent printing the error in 1st pass */
37886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
37986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        if (c == 'm' || c == 'c') {
38086838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* -c / -m is the last option: following arguments are
38186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou               not interpreter options. */
38286838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
38386838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
384c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson        if (c == 'E') {
38586838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            Py_IgnoreEnvironmentFlag++;
38686838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            break;
38786838b02f04a01445778584afb7acd0b05081335Antoine Pitrou        }
38886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    }
38986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
39034be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    opt = Py_GETENV("PYTHONMALLOC");
39134be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    if (_PyMem_SetupAllocators(opt) < 0) {
39234be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner        fprintf(stderr,
39334be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner                "Error in PYTHONMALLOC: unknown allocator \"%s\"!\n", opt);
39434be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner        exit(1);
39534be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner    }
39634be807ca4dfecc5b0a9e577a48535e738dce32bVictor Stinner
397c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson    Py_HashRandomizationFlag = 1;
39886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyRandom_Init();
39986838b02f04a01445778584afb7acd0b05081335Antoine Pitrou
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_ResetWarnOptions();
40186838b02f04a01445778584afb7acd0b05081335Antoine Pitrou    _PyOS_ResetGetOpt();
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'c') {
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            size_t len;
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -c is the last option; following arguments
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               command to interpret. */
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            len = wcslen(_PyOS_optarg) + 1 + 1;
4111a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner            command = (wchar_t *)PyMem_RawMalloc(sizeof(wchar_t) * len);
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (command == NULL)
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_FatalError(
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "not enough memory to copy -c argument");
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wcscpy(command, _PyOS_optarg);
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 2] = '\n';
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 1] = 0;
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'm') {
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -m is the last option; following arguments
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               module to interpret. */
425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            module = _PyOS_optarg;
426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
428f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        switch (c) {
430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'b':
431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_BytesWarningFlag++;
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'd':
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DebugFlag++;
436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'i':
439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag++;
440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InteractiveFlag++;
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
443ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes        case 'I':
444ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_IsolatedFlag++;
445ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_NoUserSiteDirectory++;
446ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            Py_IgnoreEnvironmentFlag++;
447ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes            break;
448ad73a9cf97770023665a1bb1c6390a3c99478139Christian Heimes
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'J': reserved for Jython */
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
451f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'O':
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag++;
453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'B':
456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DontWriteBytecodeFlag++;
457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 's':
460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoUserSiteDirectory++;
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'S':
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoSiteFlag++;
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'E':
46886838b02f04a01445778584afb7acd0b05081335Antoine Pitrou            /* Already handled above */
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
470f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
471f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 't':
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* ignored for backwards compatibility */
473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'u':
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_UnbufferedStdioFlag = 1;
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            saw_unbuffered_flag = 1;
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'v':
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_VerboseFlag++;
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'x':
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            skipfirstline = 1;
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
487f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
488f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'h':
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case '?':
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            help++;
491f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
493f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'V':
494f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            version++;
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
496f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'W':
4986999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_options == NULL)
4996999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                warning_options = PyList_New(0);
5006999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_options == NULL)
5016999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                Py_FatalError("failure in handling of -W argument");
5026999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            warning_option = PyUnicode_FromWideChar(_PyOS_optarg, -1);
5036999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            if (warning_option == NULL)
5046999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou                Py_FatalError("failure in handling of -W argument");
505275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes            if (PyList_Append(warning_options, warning_option) == -1)
506275270772e6b733beb5bf0e24f6d33663975cc63Christian Heimes                Py_FatalError("failure in handling of -W argument");
5076999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            Py_DECREF(warning_option);
508f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
509f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
5109583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou        case 'X':
5119583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            PySys_AddXOption(_PyOS_optarg);
5129583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou            break;
5139583cac6337f9a5f2670fbe5e1f2e85aaad04522Antoine Pitrou
5149d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl        case 'q':
5158aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl            Py_QuietFlag++;
5169d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl            break;
5179d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl
5182daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl        case 'R':
519c9f54cf512996790266c17f81584c9725ee99d47Benjamin Peterson            /* Ignored */
5202daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl            break;
5212daf6ae2495c862adf8bc717bfe9964081ea0b10Georg Brandl
522f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* This space reserved for other options */
523f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        default:
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return usage(2, argv[0]);
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /*NOTREACHED*/
527f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
5307d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
531f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (help)
532f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return usage(0, argv[0]);
533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
534f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (version) {
5350e175a6e762676fca6bfd656912bb862e29fbdd5INADA Naoki        printf("Python %s\n", version >= 2 ? Py_GetVersion() : PY_VERSION);
536f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
538f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
540f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!saw_unbuffered_flag &&
543f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
544f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_UnbufferedStdioFlag = 1;
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoUserSiteDirectory &&
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
548f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_NoUserSiteDirectory = 1;
5498dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
550e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
552f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *wp != L'\0') {
553f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower        wchar_t *buf, *warning, *context = NULL;
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
5551a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buf = (wchar_t *)PyMem_RawMalloc((wcslen(wp) + 1) * sizeof(wchar_t));
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscpy(buf, wp);
560f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower        for (warning = wcstok_s(buf, L",", &context);
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning != NULL;
562f63dab5a842df7349af73be23fb3acc37aa75703Steve Dower             warning = wcstok_s(NULL, L",", &context)) {
563f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(warning);
564f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
5651a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(buf);
566f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
567e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *buf, *oldloc;
570c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner        PyObject *unicode;
571f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
572f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* settle for strtok here as there's no one standard
573f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           C89 wcstok */
5741a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buf = (char *)PyMem_RawMalloc(strlen(p) + 1);
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        strcpy(buf, p);
57949fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner        oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL));
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, "");
581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
5825c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__
5835c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            /* Use utf-8 on Mac OS X */
5845c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            unicode = PyUnicode_FromString(p);
5855c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else
5861b57967b96daeb505e9d2dbe3cd347625dcb0739Victor Stinner            unicode = PyUnicode_DecodeLocale(p, "surrogateescape");
5875c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif
588af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            if (unicode == NULL) {
589af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                /* ignore errors */
590af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner                PyErr_Clear();
591c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
592af02e1c85a66009cdc645a64de7d7ee1335c8301Victor Stinner            }
593c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PySys_AddWarnOptionUnicode(unicode);
594c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            Py_DECREF(unicode);
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, oldloc);
59749fc8ece8172162510890f42127d2aa4e13f878bVictor Stinner        PyMem_RawFree(oldloc);
5981a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(buf);
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
600e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
6016999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    if (warning_options != NULL) {
6026999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        Py_ssize_t i;
6036999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        for (i = 0; i < PyList_GET_SIZE(warning_options); i++) {
6046999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou            PySys_AddWarnOptionUnicode(PyList_GET_ITEM(warning_options, i));
6056999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou        }
6066999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    }
6070805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command == NULL && module == NULL && _PyOS_optind < argc &&
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscmp(argv[_PyOS_optind], L"-") != 0)
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = argv[_PyOS_optind];
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
613775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
615775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
6169cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
61789e343660623862acbd40cc617b4af262d6c799fVictor Stinner    /* don't translate newlines (\r\n <=> \n) */
61889e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdin), O_BINARY);
61989e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stdout), O_BINARY);
62089e343660623862acbd40cc617b4af262d6c799fVictor Stinner    _setmode(fileno(stderr), O_BINARY);
621f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
62289e343660623862acbd40cc617b4af262d6c799fVictor Stinner
62389e343660623862acbd40cc617b4af262d6c799fVictor Stinner    if (Py_UnbufferedStdioFlag) {
62422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
62822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdin,  (char *)NULL);
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdout, (char *)NULL);
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stderr, (char *)NULL);
63222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (Py_InteractiveFlag) {
635b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Doesn't have to have line-buffered -- use unbuffered */
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
638f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
63922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
64022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
64322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
64422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Leave stderr alone - it should be unbuffered anyway. */
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
647667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
6482ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* On MacOS X, when the Python interpreter is embedded in an
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       application bundle, it gets executed by a bootstrapping script
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       that does os.execve() with an argv[0] that's different from the
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual Python executable. This is needed to keep the Finder happy,
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       or rather, to work around Apple's overly strict requirements of
654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the process name. However, we still need a usable sys.executable,
655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       so the actual executable path is passed in an environment variable.
656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       script. */
658f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t* buffer;
660eb61f8b3a726a8cd1ae3bc3794623e7fe4dd5703Ronald Oussoren        size_t len = strlen(p) + 1;
661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6621a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        buffer = PyMem_RawMalloc(len * sizeof(wchar_t));
663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buffer == NULL) {
664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONEXECUTABLE");
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
668b94767ff44edf5d461d7cb1c8eb5160f83886358Brett Cannon        mbstowcs(buffer, p, len);
669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(buffer);
670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* buffer is now handed off - do not free */
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
67290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#ifdef WITH_NEXT_FRAMEWORK
67390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        char* pyvenv_launcher = getenv("__PYVENV_LAUNCHER__");
67490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
67590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        if (pyvenv_launcher && *pyvenv_launcher) {
67690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Used by Mac/Tools/pythonw.c to forward
67790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             * the argv0 of the stub executable
67890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
679f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner            wchar_t* wbuf = Py_DecodeLocale(pyvenv_launcher, NULL);
68090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
68190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            if (wbuf == NULL) {
68290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip                Py_FatalError("Cannot decode __PYVENV_LAUNCHER__");
68390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            }
68490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(wbuf);
68590db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip
68690db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            /* Don't free wbuf, the argument to Py_SetProgramName
687b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter             * must remain valid until Py_FinalizeEx is called.
68890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip             */
68990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        } else {
69090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip            Py_SetProgramName(argv[0]);
69190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip        }
69290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#else
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(argv[0]);
69490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip#endif
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
6962ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
697f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_SetProgramName(argv[0]);
698fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Initialize();
7006999441d62cfc6a6273b0e9e3df2cce0ef3f05faAntoine Pitrou    Py_XDECREF(warning_options);
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
7028aa7e999b5ab87cdbefe441649c223647875c110Georg Brandl    if (!Py_QuietFlag && (Py_VerboseFlag ||
7039d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                        (command == NULL && filename == NULL &&
7049d8711964f114b9f0f5ed8a9a1eccfba2a096030Georg Brandl                         module == NULL && stdin_is_interactive))) {
705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s on %s\n",
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_GetVersion(), Py_GetPlatform());
707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "%s\n", COPYRIGHT);
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command != NULL) {
712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argv[_PyOS_optind] = L"-c";
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
717f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module != NULL) {
718d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
720d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        argv[_PyOS_optind] = L"-m";
721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
72375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    if (filename != NULL) {
72475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        main_importer_path = AsImportPathEntry(filename);
72575345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    }
72675345c552d0889f4f63039d6063f371846c8f41fNick Coghlan
72775345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    if (main_importer_path != NULL) {
72875345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        /* Let RunMainFromImporter adjust sys.path[0] later */
72975345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        PySys_SetArgvEx(argc-_PyOS_optind, argv+_PyOS_optind, 0);
73075345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    } else {
73175345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        /* Use config settings to decide whether or not to update sys.path[0] */
73275345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
73375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan    }
734f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
735f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
736313523ce2dd67db67b7dcbcc5f6d6ca95922b34bSteve Dower        isatty(fileno(stdin)) &&
737313523ce2dd67db67b7dcbcc5f6d6ca95922b34bSteve Dower        !Py_IsolatedFlag) {
738f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *v;
739f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyImport_ImportModule("readline");
740f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
741f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
742f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
743f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v);
744f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command) {
747a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        sts = run_command(command, &cf);
7481a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner        PyMem_RawFree(command);
749f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else if (module) {
750f01a337950bdcd6905d12b2335ba4d8773f6b8e5Senthil Kumaran        sts = (RunModule(module, 1) != 0);
751f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
752f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
753f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
754f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == NULL && stdin_is_interactive) {
755f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag = 0; /* do exit on SystemExit */
756f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            RunStartupFile(&cf);
7571a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou            RunInteractiveHook();
758f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
759f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
760f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
761f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = -1;               /* keep track of whether we've already run __main__ */
762f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
76375345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        if (main_importer_path != NULL) {
76475345c552d0889f4f63039d6063f371846c8f41fNick Coghlan            sts = RunMainFromImporter(main_importer_path);
765f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
766f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
76775345c552d0889f4f63039d6063f371846c8f41fNick Coghlan        if (sts==-1 && filename != NULL) {
7689a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            fp = _Py_wfopen(filename, L"r");
7699a6692f6d7784365ae07094694c754d2b153b719Victor Stinner            if (fp == NULL) {
7709a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                char *cfilename_buffer;
7719a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                const char *cfilename;
772c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                int err = errno;
773f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner                cfilename_buffer = Py_EncodeLocale(filename, NULL);
7749a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer != NULL)
7759a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = cfilename_buffer;
7769a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                else
7779a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    cfilename = "<unprintable file name>";
778f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
779c345ce1a69b3c4a46d87ef56d859bc70abfc74b4Antoine Pitrou                    argv[0], cfilename, err, strerror(err));
7809a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                if (cfilename_buffer)
7819a6692f6d7784365ae07094694c754d2b153b719Victor Stinner                    PyMem_Free(cfilename_buffer);
782f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return 2;
783f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
784f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else if (skipfirstline) {
785f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                int ch;
786f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Push back first newline so line numbers
787f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   remain the same */
788f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                while ((ch = getc(fp)) != EOF) {
789f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    if (ch == '\n') {
790f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (void)ungetc(ch, fp);
791f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        break;
792f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    }
793f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
794f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
795f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
796f2f373f5931be48efc3f6fa2c2faa1cca79dce75Steve Dower                struct _Py_stat_struct sb;
797e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                if (_Py_fstat_noraise(fileno(fp), &sb) == 0 &&
798f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    S_ISDIR(sb.st_mode)) {
799e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                    fprintf(stderr,
800e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                            "%ls: '%ls' is a directory, cannot continue\n",
801e134a7fe36652434c2ccffc4ebab2ec2031d1505Victor Stinner                            argv[0], filename);
802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fclose(fp);
803f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return 1;
804f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
805f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
806f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
807f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
8080a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (sts == -1)
8090a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            sts = run_file(fp, filename, &cf);
810f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Check this environment variable at the end, to give programs the
813f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * opportunity to set it from Python.
814f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
815f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
816f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
817f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
818f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
819f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
820f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
821f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag && stdin_is_interactive &&
822f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (filename != NULL || command != NULL || module != NULL)) {
823f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 0;
8241a6cb30a346ba8812d6abc77fddee636ae06ccffAntoine Pitrou        RunInteractiveHook();
825f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
826f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
827f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
828f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
829b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter    if (Py_FinalizeEx() < 0) {
830b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        /* Value unlikely to be confused with a non-error exit status or
831b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        other special meaning */
832b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter        sts = 120;
833b4ce1fc31be5614d527d77c55018281ebbcd70abMartin Panter    }
8343e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
8353e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Insure++ is a memory analysis tool that aids in discovering
837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory leaks and other memory problems.  On Python exit, the
838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interned string dictionaries are flagged as being in use at exit
839f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * (which it is).  Under normal circumstances, this is fine because
840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the memory will be automatically reclaimed by the system.  Under
841f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory debugging, it's a huge source of useless noise, so we
842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * trade off slower shutdown for less distraction in the memory
843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * reports.  -baw
844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
845f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedUnicodeStrings();
8463e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
8473e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return sts;
849667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
850667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
851786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
852786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
853786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
854667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
855667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
856667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
857667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
858667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
859790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
860667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argc = orig_argc;
862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argv = orig_argv;
863667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
86449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
86549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
86649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
86749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
868