main.c revision 5c848a84fd59eabd1ab9965d376b78139eaf97f7
1667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Python interpreter main program */
2667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h"
4a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#include "osdefs.h"
5db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger#include "import.h"
6667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
75651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou#include <locale.h>
85651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitrou
979acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
107a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#include <unixlib.h>
1179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
1279acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis
139cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
14945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <windows.h>
15477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#ifdef HAVE_FCNTL_H
163e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#include <fcntl.h>
17790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define PATH_MAX MAXPATHLEN
183e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum#endif
19477c8d5e70240744d24631b18341ad892c8a8e1cThomas Wouters#endif
203e7ae7ab173effc320b05a3d5a9fde7eac706771Guido van Rossum
21945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#ifdef _MSC_VER
22945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#include <crtdbg.h>
23945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis#endif
24945362cf971fb2e10f8f2a8e71e8ff10516ebe4cMartin v. Löwis
257bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if (defined(PYOS_OS2) && !defined(PYCC_GCC)) || defined(MS_WINDOWS)
26a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#define PYTHONHOMEHELP "<prefix>\\lib"
27a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#else
287bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#if defined(PYOS_OS2) && defined(PYCC_GCC)
297bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#define PYTHONHOMEHELP "<prefix>/Lib"
307bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#else
31da4dbc36c102d5005737365f65627bbca1d2395bMarc-André Lemburg#define PYTHONHOMEHELP "<prefix>/pythonX.X"
32a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum#endif
337bf6833e178696b9815fd4e4c6d1cecc8b46bdd2Andrew MacIntyre#endif
34a075ce1618c30c7d0faf4de6e84920027da40e41Guido van Rossum
352cffc7d4202fc1197280a05d998075551b459283Thomas Wouters#include "pygetopt.h"
362cffc7d4202fc1197280a05d998075551b459283Thomas Wouters
37a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum#define COPYRIGHT \
3836002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "Type \"help\", \"copyright\", \"credits\" or \"license\" " \
3936002d7af1a9971c62e982cbbb1d1ce34610129dGuido van Rossum    "for more information."
40a22865ec4400438a8b591c67e26ec69722ac9266Guido van Rossum
4149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
4249fd7fa4431da299196d74087df4a04f99f9c46fThomas Woutersextern "C" {
4349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
4449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
45ac56b03f9a931423714ab3a0e8cfae78f81f9b85Guido van Rossum/* For Py_GetArgcArgv(); set by main() */
46790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t **orig_argv;
47667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic int  orig_argc;
48667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
49bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum/* command line options */
508dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes#define BASE_OPTS L"bBc:dEhiJm:OsStuvVW:xX?"
51bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum
52bceccf5f43b51d166951ea97cff086c8828b745bGuido van Rossum#define PROGRAM_OPTS BASE_OPTS
533ed4c15a88c79ae71a01854415a66ca1cd6697c7Guido van Rossum
54667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Short usage message (with %s for argv0) */
55667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumstatic char *usage_line =
56790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis"usage: %ls [option] ... [-c cmd | -m mod | file | -] [arg] ...\n";
57667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
58667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Long usage message, split into parts < 512 bytes */
59393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_1 = "\
60667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOptions and arguments (and corresponding environment variables):\n\
612ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes-b     : issue warnings about str(bytes_instance), str(bytearray_instance)\n\
622ab344428449792e293c0c4d276fc66d26e919e5Christian Heimes         and comparing bytes/bytearray with str. (-bb: issue errors)\n\
63790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-B     : don't write .py[co] files on import; also PYTHONDONTWRITEBYTECODE=x\n\
64393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-c cmd : program passed in as string (terminates option list)\n\
6589f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-d     : debug output from parser; also PYTHONDEBUG=x\n\
66790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes-E     : ignore PYTHON* environment variables (such as PYTHONPATH)\n\
670e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-h     : print this help message and exit (also --help)\n\
6861c345fa37573005b708d239c0911218ca22383cGuido van Rossum";
6961c345fa37573005b708d239c0911218ca22383cGuido van Rossumstatic char *usage_2 = "\
7098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-i     : inspect interactively after running script; forces a prompt even\n\
7198297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum         if stdin does not appear to be a terminal; also PYTHONINSPECT=x\n\
72db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger-m mod : run library module as a script (terminates option list)\n\
7389f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-O     : optimize generated bytecode slightly; also PYTHONOPTIMIZE=x\n\
746b86a42c7f8786f8446d5a48db406282f18ec06aGuido van Rossum-OO    : remove doc-strings in addition to the -O optimizations\n\
758dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes-s     : don't add user site directory to sys.path; also PYTHONNOUSERSITE\n\
767922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum-S     : don't imply 'import site' on initialization\n\
77393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum";
78393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_3 = "\
7998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-u     : unbuffered binary stdout and stderr; also PYTHONUNBUFFERED=x\n\
80db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger         see man page for details on internal buffering relating to '-u'\n\
8189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-v     : verbose (trace import statements); also PYTHONVERBOSE=x\n\
8289f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters         can be supplied multiple times to increase verbosity\n\
830e3f591aeeef9ed715f8770320f4c4c7332a8794Thomas Wouters-V     : print the Python version number and exit (also --version)\n\
8489f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Wouters-W arg : warning control; arg is action:message:category:module:lineno\n\
850805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey         also PYTHONWARNINGS=arg\n\
86393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossum-x     : skip first line of source, allowing use of non-Unix forms of #!cmd\n\
877922bd7382c7e22ee9f711f6554718b824ac85a4Guido van Rossum";
88393661d15fa76ec46e9f7b71e97bf2ed38470620Guido van Rossumstatic char *usage_4 = "\
8998297ee7815939b124156e438b22bd652d67b5dbGuido van Rossumfile   : program read from script file\n\
9098297ee7815939b124156e438b22bd652d67b5dbGuido van Rossum-      : program read from stdin (default; interactive mode if a tty)\n\
9189f507fe8c497b3f70fdcecce8bc240f9af2bbe2Thomas Woutersarg ...: arguments passed to program in sys.argv[1:]\n\n\
92667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumOther environment variables:\n\
93667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van RossumPYTHONSTARTUP: file executed on interactive startup (no default)\n\
94a075ce1618c30c7d0faf4de6e84920027da40e41Guido van RossumPYTHONPATH   : '%c'-separated list of directories prefixed to the\n\
95667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum               default module search path.  The result is sys.path.\n\
96790c8232019d0a13c3f0a72b8cffcf3ae69ea7b9Christian Heimes";
979802b39c12712e924bed699812756ce5076b77a3Victor Stinnerstatic char *usage_5 =
989802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONHOME   : alternate <prefix> directory (or <prefix>%c<exec_prefix>).\n"
999802b39c12712e924bed699812756ce5076b77a3Victor Stinner"               The default module search path uses %s.\n"
1009802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONCASEOK : ignore case in 'import' statements (Windows).\n"
1019802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONIOENCODING: Encoding[:errors] used for stdin/stdout/stderr.\n"
1029802b39c12712e924bed699812756ce5076b77a3Victor Stinner#if !(defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)) && !defined(__APPLE__)
1039802b39c12712e924bed699812756ce5076b77a3Victor Stinner"PYTHONFSENCODING: Encoding used for the filesystem.\n"
1049802b39c12712e924bed699812756ce5076b77a3Victor Stinner#endif
1059802b39c12712e924bed699812756ce5076b77a3Victor Stinner;
106667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
107e9b428f9977f8733e6b0d2c321c093779f95080fAntoine PitrouFILE *
108e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou_Py_wfopen(const wchar_t *path, const wchar_t *mode)
109790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis{
110e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou#ifndef MS_WINDOWS
111f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    FILE *f;
112f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    char *cpath;
113f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char cmode[10];
114f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    size_t r;
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    r = wcstombs(cmode, mode, 10);
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (r == (size_t)-1 || r >= 10) {
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        errno = EINVAL;
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
119f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
120f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    cpath = _Py_wchar2char(path);
121f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    if (cpath == NULL)
122f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        return NULL;
123f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    f = fopen(cpath, cmode);
124f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    PyMem_Free(cpath);
125f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    return f;
126e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou#else
127e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou    return _wfopen(path, mode);
128790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#endif
129e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou}
130790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis
131667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
132852ba7eb2a38a4d57cea73bf34b11f8e65f004e1Martin v. Löwisstatic int
133790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisusage(int exitcode, wchar_t* program)
1343b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw{
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *f = exitcode ? stderr : stdout;
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(f, usage_line, program);
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode)
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, "Try `python -h' for more information.\n");
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
141f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_1, f);
142f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_2, f);
143f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fputs(usage_3, f);
144f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_4, DELIM);
145f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(f, usage_5, DELIM, PYTHONHOMEHELP);
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
14779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#if defined(__VMS)
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (exitcode == 0) {
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* suppress 'error' message */
150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
152f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
153f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* STS$M_INHIB_MSG + SS$_ABORT */
154f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0x1000002c;
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
15679acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#else
157f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return exitcode;
15879acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif
159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /*NOTREACHED*/
1603b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw}
1613b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
1626caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwisstatic void RunStartupFile(PyCompilerFlags *cf)
1636caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis{
164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *startup = Py_GETENV("PYTHONSTARTUP");
165f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (startup != NULL && startup[0] != '\0') {
166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        FILE *fp = fopen(startup, "r");
167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (fp != NULL) {
168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            (void) PyRun_SimpleFileExFlags(fp, startup, 0, cf);
169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
170f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fclose(fp);
171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        } else {
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            int save_errno;
173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            save_errno = errno;
175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_WriteStderr("Could not open PYTHONSTARTUP\n");
176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            errno = save_errno;
177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_SetFromErrnoWithFilename(PyExc_IOError,
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                            startup);
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Print();
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
1836caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis}
1846caea370ac3e79e8295e456b566a04817eefb0fdMartin v. Löwis
185db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger
1865651eaa720e28fb95b78524524ee75bda2d0ae59Antoine Pitroustatic int RunModule(wchar_t *modname, int set_argv0)
187a977329b6fb0e4c95cabb9043794de69b27a1099Thomas Wouters{
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *module, *runpy, *runmodule, *runargs, *result;
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runpy = PyImport_ImportModule("runpy");
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runpy == NULL) {
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not import runpy module\n");
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
193f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
194f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runmodule = PyObject_GetAttrString(runpy, "_run_module_as_main");
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runmodule == NULL) {
196f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not access runpy._run_module_as_main\n");
197f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
200f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    module = PyUnicode_FromWideChar(modname, wcslen(modname));
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module == NULL) {
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Could not convert module name to unicode\n");
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
205f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
206f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    runargs = Py_BuildValue("(Oi)", module, set_argv0);
208f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (runargs == NULL) {
209f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr,
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            "Could not create arguments for runpy._run_module_as_main\n");
211f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runpy);
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(runmodule);
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_DECREF(module);
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
216f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    result = PyObject_Call(runmodule, runargs, NULL);
217f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
219f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
220f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runpy);
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runmodule);
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(module);
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(runargs);
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (result == NULL) {
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
227f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_DECREF(result);
228f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return 0;
229db29e0fe8cab58c68d1263487ba5bac7b99c7612Raymond Hettinger}
2303b2aedbdc58c3466469abf4f3fbfc123195ff1f9Barry Warsaw
231790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic int RunMainFromImporter(wchar_t *filename)
2329cd177526afc086a300b548588880329c32f607dChristian Heimes{
233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *argv0 = NULL, *importer = NULL;
234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((argv0 = PyUnicode_FromWideChar(filename,wcslen(filename))) &&
236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (importer = PyImport_GetImporter(argv0)) &&
237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (importer->ob_type != &PyNullImporter_Type))
238f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
239f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             /* argv0 is usable as an import source, so
240f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    put it in sys.path[0] and import __main__ */
241f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *sys_path = NULL;
242f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if ((sys_path = PySys_GetObject("path")) &&
243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            !PyList_SetItem(sys_path, 0, argv0))
244f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        {
245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_INCREF(argv0);
246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(importer);
247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sys_path = NULL;
248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return RunModule(L"__main__", 0) != 0;
24974c29c71b1c9a68030e6b3fda6af54ca52b2c6c3Guido van Rossum        }
250f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
251f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(argv0);
252f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(importer);
253f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (PyErr_Occurred()) {
254f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Print();
255f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 1;
256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return -1;
259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
2609cd177526afc086a300b548588880329c32f607dChristian Heimes}
2619cd177526afc086a300b548588880329c32f607dChristian Heimes
262a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerstatic int
263a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnerrun_command(wchar_t *command, PyCompilerFlags *cf)
264a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner{
265a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyObject *unicode, *bytes;
266a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    int ret;
267a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
268a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    unicode = PyUnicode_FromWideChar(command, -1);
269a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (unicode == NULL)
270a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
271a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    bytes = PyUnicode_AsUTF8String(unicode);
272a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(unicode);
273a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    if (bytes == NULL)
274a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        goto error;
275a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    ret = PyRun_SimpleStringFlags(PyBytes_AsString(bytes), cf);
276a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    Py_DECREF(bytes);
277a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return ret != 0;
278a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
279a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinnererror:
280398356baaa60b1e46ce45ec7b8ae8ac28ca53091Victor Stinner    PySys_WriteStderr("Unable to decode the command from the command line:\n");
281a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    PyErr_Print();
282a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner    return 1;
283a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner}
284a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner
2850a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerstatic int
2860a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinnerrun_file(FILE *fp, const wchar_t *filename, PyCompilerFlags *p_cf)
2870a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner{
2880a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    PyObject *unicode, *bytes = NULL;
2890a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    char *filename_str;
2900a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    int run;
2910a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2920a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    /* call pending calls like signal handlers (SIGINT) */
2930a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (Py_MakePendingCalls() == -1) {
2940a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        PyErr_Print();
2950a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        return 1;
2960a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
2970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
2980a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    if (filename) {
2990a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        unicode = PyUnicode_FromWideChar(filename, wcslen(filename));
3000a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (unicode != NULL) {
3010a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            bytes = PyUnicode_AsUTF8String(unicode);
3020a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            Py_DECREF(unicode);
3030a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3040a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (bytes != NULL)
3050a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = PyBytes_AsString(bytes);
3060a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        else {
3070a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            PyErr_Clear();
3080a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            filename_str = "<decoding error>";
3090a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        }
3100a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    }
3110a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    else
3120a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        filename_str = "<stdin>";
3130a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3140a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    run = PyRun_AnyFileExFlags(fp, filename_str, filename != NULL, p_cf);
3150a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    Py_XDECREF(bytes);
3160a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner    return run != 0;
3170a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner}
3180a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner
3199cd177526afc086a300b548588880329c32f607dChristian Heimes
320667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Main program */
321667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
322fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark Hammondint
323790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_Main(int argc, wchar_t **argv)
324667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
325f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int c;
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int sts;
327f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *command = NULL;
328f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *filename = NULL;
329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *module = NULL;
330f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    FILE *fp = stdin;
331f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    char *p;
332e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
333f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *wp;
334e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
335f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int skipfirstline = 0;
336f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int stdin_is_interactive = 0;
337f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int help = 0;
338f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int version = 0;
339f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int saw_unbuffered_flag = 0;
340f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyCompilerFlags cf;
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
342f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    cf.cf_flags = 0;
343f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
344f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argc = argc;           /* For Py_GetArgcArgv() */
345f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    orig_argv = argv;
346f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
347f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_ResetWarnOptions();
348f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
349f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
350f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'c') {
351f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            size_t len;
352f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -c is the last option; following arguments
353f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
354f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               command to interpret. */
355f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
356f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            len = wcslen(_PyOS_optarg) + 1 + 1;
357f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command = (wchar_t *)malloc(sizeof(wchar_t) * len);
358f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (command == NULL)
359f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                Py_FatalError(
360f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   "not enough memory to copy -c argument");
361f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wcscpy(command, _PyOS_optarg);
362f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 2] = '\n';
363f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            command[len - 1] = 0;
364f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
365f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
366f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
367f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (c == 'm') {
368f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* -m is the last option; following arguments
369f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               that look like options are left for the
370f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               module to interpret. */
371f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            module = _PyOS_optarg;
372f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
373f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
374f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
375f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        switch (c) {
376f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'b':
377f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_BytesWarningFlag++;
378f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
379f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
380f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'd':
381f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DebugFlag++;
382f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
383f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
384f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'i':
385f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag++;
386f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InteractiveFlag++;
387f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
388f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
389f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'J': reserved for Jython */
390f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
391f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'O':
392f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_OptimizeFlag++;
393f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
394f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
395f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'B':
396f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DontWriteBytecodeFlag++;
397f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
398f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
399f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 's':
400f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoUserSiteDirectory++;
401f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
402f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
403f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'S':
404f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_NoSiteFlag++;
405f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
406f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
407f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'E':
408f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_IgnoreEnvironmentFlag++;
409f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
410f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
411f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 't':
412f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* ignored for backwards compatibility */
413f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
414f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
415f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'u':
416f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_UnbufferedStdioFlag = 1;
417f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            saw_unbuffered_flag = 1;
418f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
419f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
420f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'v':
421f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_VerboseFlag++;
422f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
423f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
424f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'x':
425f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            skipfirstline = 1;
426f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
427f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
428f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* case 'X': reserved for implementation-specific arguments */
429f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
430f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'h':
431f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case '?':
432f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            help++;
433f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
434f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
435f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'V':
436f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            version++;
437f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
438f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
439f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        case 'W':
440f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(_PyOS_optarg);
441f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
442f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
443f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* This space reserved for other options */
444f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
445f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        default:
446f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return usage(2, argv[0]);
447f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /*NOTREACHED*/
448f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
449f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
450f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
4517d4bb9f179f1888a472fd5d5a30df4ec3c55fea5Neil Schemenauer
452f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (help)
453f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return usage(0, argv[0]);
454f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
455f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (version) {
456f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s\n", PY_VERSION);
457f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return 0;
458f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
459f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
460f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
461f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
462f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
463f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!saw_unbuffered_flag &&
464f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONUNBUFFERED")) && *p != '\0')
465f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_UnbufferedStdioFlag = 1;
466f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
467f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_NoUserSiteDirectory &&
468f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONNOUSERSITE")) && *p != '\0')
469f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_NoUserSiteDirectory = 1;
4708dc226fccd2183670ac19a85b89941f5b05167dcChristian Heimes
471e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#ifdef MS_WINDOWS
472f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_IgnoreEnvironmentFlag && (wp = _wgetenv(L"PYTHONWARNINGS")) &&
473f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        *wp != L'\0') {
474f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t *buf, *warning;
475f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
476f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (wchar_t *)malloc((wcslen(wp) + 1) * sizeof(wchar_t));
477f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
478f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
479f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
480f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscpy(buf, wp);
481f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (warning = wcstok(buf, L",");
482f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning != NULL;
483f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou             warning = wcstok(NULL, L",")) {
484f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PySys_AddWarnOption(warning);
485f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
486f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
487f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
488e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#else
489f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONWARNINGS")) && *p != '\0') {
490f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        char *buf, *oldloc;
491c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner        PyObject *unicode;
492f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
493f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* settle for strtok here as there's no one standard
494f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou           C89 wcstok */
495f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buf = (char *)malloc(strlen(p) + 1);
496f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buf == NULL)
497f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
498f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONWARNINGS");
499f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        strcpy(buf, p);
500f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        oldloc = strdup(setlocale(LC_ALL, NULL));
501f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, "");
502f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        for (p = strtok(buf, ","); p != NULL; p = strtok(NULL, ",")) {
5035c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#ifdef __APPLE__
5045c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            /* Use utf-8 on Mac OS X */
5055c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            unicode = PyUnicode_FromString(p);
5065c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#else
5075c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner            wchar_t *wchar = _Py_char2wchar(p);
508c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            if (wchar == NULL)
509c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
510c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            unicode = PyUnicode_FromWideChar(wchar, wcslen(wchar));
511c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PyMem_Free(wchar);
5125c848a84fd59eabd1ab9965d376b78139eaf97f7Victor Stinner#endif
513c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            if (unicode == NULL)
514c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner                continue;
515c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            PySys_AddWarnOptionUnicode(unicode);
516c2d76fd339f5fcc4f0051696e5e57c979289a9c3Victor Stinner            Py_DECREF(unicode);
517f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
518f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setlocale(LC_ALL, oldloc);
519f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(oldloc);
520f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(buf);
521f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
522e53de3dc4a9021b5edabd44fd495df7770b6249cPhilip Jenvey#endif
5230805ca3f931ccd4735dcaa231752371deadf5ccfPhilip Jenvey
524f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command == NULL && module == NULL && _PyOS_optind < argc &&
525f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wcscmp(argv[_PyOS_optind], L"-") != 0)
526f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
5277a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#ifdef __VMS
528f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = decc$translate_vms(argv[_PyOS_optind]);
529f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == (char *)0 || filename == (char *)-1)
530f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            filename = argv[_PyOS_optind];
5317a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis
5327a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#else
533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        filename = argv[_PyOS_optind];
5347a924e6eb28ac0b18231a3f4ed1101c78be2c2baMartin v. Löwis#endif
535f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
536775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
537f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    stdin_is_interactive = Py_FdIsInteractive(stdin, (char *)0);
538775af9191149059bf5ebfcda6dd9bf0251ce511aGuido van Rossum
539f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_UnbufferedStdioFlag) {
5409cf424b04bf355df85659da18abc2ac3f9419c37Sjoerd Mullender#if defined(MS_WINDOWS) || defined(__CYGWIN__)
541f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _setmode(fileno(stdin), O_BINARY);
542f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _setmode(fileno(stdout), O_BINARY);
543f22d7e2c69f9095edc2703483ec11a3b7ff931f5Guido van Rossum#endif
54422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
545f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IONBF, BUFSIZ);
546f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
547f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stderr, (char *)NULL, _IONBF, BUFSIZ);
54822ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !HAVE_SETVBUF */
549f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdin,  (char *)NULL);
550f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stdout, (char *)NULL);
551f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setbuf(stderr, (char *)NULL);
55222ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !HAVE_SETVBUF */
553f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
554f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else if (Py_InteractiveFlag) {
555b31c7dcb43307b57917150d60a64856d5a845fa7Guido van Rossum#ifdef MS_WINDOWS
556f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Doesn't have to have line-buffered -- use unbuffered */
557f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Any set[v]buf(stdin, ...) screws up Tkinter :-( */
558f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IONBF, BUFSIZ);
55922ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#else /* !MS_WINDOWS */
56022ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#ifdef HAVE_SETVBUF
561f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdin,  (char *)NULL, _IOLBF, BUFSIZ);
562f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf(stdout, (char *)NULL, _IOLBF, BUFSIZ);
56322ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* HAVE_SETVBUF */
56422ffac1b1f8288bac7a277a8caa04ca731a54b81Guido van Rossum#endif /* !MS_WINDOWS */
565f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Leave stderr alone - it should be unbuffered anyway. */
566f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
56779acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#ifdef __VMS
568f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
569f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        setvbuf (stdout, (char *)NULL, _IOLBF, BUFSIZ);
570f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
57179acb9edfa893b5072350c82fd0645d023b13b03Martin v. Löwis#endif /* __VMS */
572667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
5732ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#ifdef __APPLE__
574f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* On MacOS X, when the Python interpreter is embedded in an
575f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       application bundle, it gets executed by a bootstrapping script
576f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       that does os.execve() with an argv[0] that's different from the
577f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual Python executable. This is needed to keep the Finder happy,
578f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       or rather, to work around Apple's overly strict requirements of
579f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       the process name. However, we still need a usable sys.executable,
580f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       so the actual executable path is passed in an environment variable.
581f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       See Lib/plat-mac/bundlebuiler.py for details about the bootstrap
582f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       script. */
583f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((p = Py_GETENV("PYTHONEXECUTABLE")) && *p != '\0') {
584f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        wchar_t* buffer;
585f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t len = strlen(p);
586f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t r;
587f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
588f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        buffer = malloc(len * sizeof(wchar_t));
589f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (buffer == NULL) {
590f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_FatalError(
591f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               "not enough memory to copy PYTHONEXECUTABLE");
592f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
593f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
594f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        r = mbstowcs(buffer, p, len);
595f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(buffer);
596f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* buffer is now handed off - do not free */
597f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
598f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_SetProgramName(argv[0]);
599f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
6002ac79ef9e3168691efabad6877e45168a00738acJust van Rossum#else
601f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_SetProgramName(argv[0]);
602fbd861bbd3532372c6c9160c5d14f17ff2c7de00Jack Jansen#endif
603f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Initialize();
604f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
605f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_VerboseFlag ||
606f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (command == NULL && filename == NULL && module == NULL && stdin_is_interactive)) {
607f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        fprintf(stderr, "Python %s on %s\n",
608f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_GetVersion(), Py_GetPlatform());
609f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!Py_NoSiteFlag)
610f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "%s\n", COPYRIGHT);
611f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
612f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
613f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command != NULL) {
614f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Backup _PyOS_optind and force sys.argv[0] = '-c' */
615f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
616f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argv[_PyOS_optind] = L"-c";
617f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
618f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
619f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (module != NULL) {
620d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        /* Backup _PyOS_optind and force sys.argv[0] = '-m'*/
621f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        _PyOS_optind--;
622d26c18adccf02321592cd58a2dadb0ab68af6906Nick Coghlan        argv[_PyOS_optind] = L"-m";
623f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
624f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
625f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PySys_SetArgv(argc-_PyOS_optind, argv+_PyOS_optind);
626f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
627f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if ((Py_InspectFlag || (command == NULL && filename == NULL && module == NULL)) &&
628f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        isatty(fileno(stdin))) {
629f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *v;
630f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        v = PyImport_ImportModule("readline");
631f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (v == NULL)
632f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyErr_Clear();
633f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
634f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(v);
635f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
636f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
637f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (command) {
638a62207c5847948b83d698b5fb4b2c1a03434a5a6Victor Stinner        sts = run_command(command, &cf);
639f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        free(command);
640f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else if (module) {
641f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = RunModule(module, 1);
642f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
643f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    else {
644f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
645f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename == NULL && stdin_is_interactive) {
646f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_InspectFlag = 0; /* do exit on SystemExit */
647f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            RunStartupFile(&cf);
648f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
649f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
650f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
651f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = -1;               /* keep track of whether we've already run __main__ */
652f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
653f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (filename != NULL) {
654f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            sts = RunMainFromImporter(filename);
655f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
656f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
657f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (sts==-1 && filename!=NULL) {
658e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou            if ((fp = _Py_wfopen(filename, L"r")) == NULL) {
659f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                char cfilename[PATH_MAX];
660f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                size_t r = wcstombs(cfilename, filename, PATH_MAX);
661f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (r == PATH_MAX)
662f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    /* cfilename is not null-terminated;
663f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     * forcefully null-terminating it
664f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                     * might break the shift state */
665f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    strcpy(cfilename, "<file name too long>");
666f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (r == ((size_t)-1))
667f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    strcpy(cfilename, "<unprintable file name>");
668f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                fprintf(stderr, "%ls: can't open file '%s': [Errno %d] %s\n",
669f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    argv[0], cfilename, errno, strerror(errno));
670f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
671f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return 2;
672f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
673f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            else if (skipfirstline) {
674f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                int ch;
675f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* Push back first newline so line numbers
676f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                   remain the same */
677f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                while ((ch = getc(fp)) != EOF) {
678f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    if (ch == '\n') {
679f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        (void)ungetc(ch, fp);
680f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                        break;
681f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    }
682f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
683f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
684f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            {
685f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                /* XXX: does this work on Win/Win64? (see posix_fstat) */
686f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                struct stat sb;
687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                if (fstat(fileno(fp), &sb) == 0 &&
688f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    S_ISDIR(sb.st_mode)) {
689f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fprintf(stderr, "%ls: '%ls' is a directory, cannot continue\n", argv[0], filename);
690f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    fclose(fp);
691f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                    return 1;
692f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                }
693f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            }
694f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
695f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
6960a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner        if (sts == -1)
6970a3ddad666d3c30f3b232a1825dc6d8e2de04b47Victor Stinner            sts = run_file(fp, filename, &cf);
698f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
699f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
700f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Check this environment variable at the end, to give programs the
701f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * opportunity to set it from Python.
702f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
703f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!Py_InspectFlag &&
704f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
705f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {
706f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 1;
707f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
708f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
709f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (Py_InspectFlag && stdin_is_interactive &&
710f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        (filename != NULL || command != NULL || module != NULL)) {
711f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_InspectFlag = 0;
712f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* XXX */
713f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        sts = PyRun_AnyFileFlags(stdin, "<stdin>", &cf) != 0;
714f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
715f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
716f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_Finalize();
7173e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
7183e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#ifdef __INSURE__
719f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Insure++ is a memory analysis tool that aids in discovering
720f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory leaks and other memory problems.  On Python exit, the
721f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * interned string dictionaries are flagged as being in use at exit
722f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * (which it is).  Under normal circumstances, this is fine because
723f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * the memory will be automatically reclaimed by the system.  Under
724f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * memory debugging, it's a huge source of useless noise, so we
725f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * trade off slower shutdown for less distraction in the memory
726f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * reports.  -baw
727f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
728f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedStrings();
729f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    _Py_ReleaseInternedUnicodeStrings();
7303e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw#endif /* __INSURE__ */
7313e13b1e48bdd0550929f55bac11571116cd655abBarry Warsaw
732f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return sts;
733667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
734667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
735786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro/* this is gonna seem *real weird*, but if you put some other code between
736786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   Py_Main() and Py_GetArgcArgv() you will need to adjust the test in the
737786ea6bc23c26a0ec98d5cbc80633615f9fa8cb1Skip Montanaro   while statement in Misc/gdbinit:ppystack */
738667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
739667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum/* Make the *original* argc/argv available to other modules.
740667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum   This is rare, but it is needed by the secureware extension. */
741667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum
742667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossumvoid
743790465fd90e8a72590386465f518db9e67ab843fMartin v. LöwisPy_GetArgcArgv(int *argc, wchar_t ***argv)
744667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{
745f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argc = orig_argc;
746f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *argv = orig_argv;
747667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum}
74849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters
749d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren
750f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner/* Encode a (wide) character string to the locale encoding with the
751f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   surrogateescape error handler (characters in range U+DC80..U+DCFF are
752f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   converted to bytes 0x80..0xFF).
753f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
754f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   This function is the reverse of _Py_char2wchar().
755f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
756f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   Return a pointer to a newly allocated byte string (use PyMem_Free() to free
757f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   the memory), or NULL on error (conversion error or memory error). */
758f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinnerchar*
759f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner_Py_wchar2char(const wchar_t *text)
760f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner{
761f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    const size_t len = wcslen(text);
762f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    char *result = NULL, *bytes = NULL;
763f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    size_t i, size, converted;
764f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    wchar_t c, buf[2];
765f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
766f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    /* The function works in two steps:
767f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner       1. compute the length of the output buffer in bytes (size)
768f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner       2. outputs the bytes */
769f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    size = 0;
770f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    buf[1] = 0;
771f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    while (1) {
772f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        for (i=0; i < len; i++) {
773f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            c = text[i];
774f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            if (c >= 0xdc80 && c <= 0xdcff) {
775f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                /* UTF-8b surrogate */
776f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                if (bytes != NULL) {
777f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    *bytes++ = c - 0xdc00;
778f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    size--;
779f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                }
780f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                else
781f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    size++;
782f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                continue;
783f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            }
784f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            else {
785f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                buf[0] = c;
786f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                if (bytes != NULL)
787f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    converted = wcstombs(bytes, buf, size);
788f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                else
789f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    converted = wcstombs(NULL, buf, 0);
790f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                if (converted == (size_t)-1) {
791f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    if (result != NULL)
792f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                        PyMem_Free(result);
793f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    return NULL;
794f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                }
795f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                if (bytes != NULL) {
796f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    bytes += converted;
797f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    size -= converted;
798f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                }
799f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                else
800f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner                    size += converted;
801f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            }
802f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        }
803f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        if (result != NULL) {
804f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            *bytes = 0;
805f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            break;
806f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        }
807f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
808f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        size += 1; /* nul byte at the end */
809f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        result = PyMem_Malloc(size);
810f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        if (result == NULL)
811f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner            return NULL;
812f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner        bytes = result;
813f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    }
814f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner    return result;
815f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner}
816f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
817f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
818f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner/* Decode a byte string from the locale encoding with the
819f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   surrogateescape error handler (undecodable bytes are decoded as characters
820f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   in range U+DC80..U+DCFF). If a byte sequence can be decoded as a surrogate
821f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   character, escape the bytes using the surrogateescape error handler instead
822f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   of decoding them.
823f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
824f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   Use _Py_wchar2char() to encode the character string back to a byte string.
825f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner
826f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   Return a pointer to a newly allocated (wide) character string (use
827f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   PyMem_Free() to free the memory), or NULL on error (conversion error or
828f2e08b34f1fa50e99f8cab0a21721be2d1bb38b8Victor Stinner   memory error). */
829d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussorenwchar_t*
830d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren_Py_char2wchar(char* arg)
831d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren{
832f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *res;
833d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#ifdef HAVE_BROKEN_MBSTOWCS
834f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Some platforms have a broken implementation of
835f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * mbstowcs which does not count the characters that
836f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * would result from conversion.  Use an upper bound.
837f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
838f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    size_t argsize = strlen(arg);
839d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#else
840f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    size_t argsize = mbstowcs(NULL, arg, 0);
841d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#endif
842f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    size_t count;
843f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    unsigned char *in;
844f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    wchar_t *out;
845d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#ifdef HAVE_MBRTOWC
846f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mbstate_t mbs;
847d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#endif
848f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (argsize != (size_t)-1) {
849f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        res = (wchar_t *)PyMem_Malloc((argsize+1)*sizeof(wchar_t));
850f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!res)
851f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            goto oom;
852f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        count = mbstowcs(res, arg, argsize+1);
853f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (count != (size_t)-1) {
854f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            wchar_t *tmp;
855f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Only use the result if it contains no
856f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               surrogate characters. */
857f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            for (tmp = res; *tmp != 0 &&
858f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                         (*tmp < 0xd800 || *tmp > 0xdfff); tmp++)
859f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                ;
860f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            if (*tmp == 0)
861f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                return res;
862f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
863f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyMem_Free(res);
864f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
865f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Conversion failed. Fall back to escaping with surrogateescape. */
866d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#ifdef HAVE_MBRTOWC
867f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Try conversion with mbrtwoc (C99), and escape non-decodable bytes. */
868f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
869f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Overallocate; as multi-byte characters are in the argument, the
870f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       actual output could use less memory. */
871f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    argsize = strlen(arg) + 1;
872f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    res = (wchar_t*)PyMem_Malloc(argsize*sizeof(wchar_t));
873f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!res) goto oom;
874f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    in = (unsigned char*)arg;
875f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    out = res;
876f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    memset(&mbs, 0, sizeof mbs);
877f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while (argsize) {
878f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        size_t converted = mbrtowc(out, (char*)in, argsize, &mbs);
879f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (converted == 0)
880f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Reached end of string; null char stored. */
881f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            break;
882f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (converted == (size_t)-2) {
883f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Incomplete character. This should never happen,
884f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               since we provide everything that we have -
885f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               unless there is a bug in the C library, or I
886f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               misunderstood how mbrtowc works. */
887f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            fprintf(stderr, "unexpected mbrtowc result -2\n");
888f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
889f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
890f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (converted == (size_t)-1) {
891f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Conversion error. Escape as UTF-8b, and start over
892f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               in the initial shift state. */
893f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *out++ = 0xdc00 + *in++;
894f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            argsize--;
895f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            memset(&mbs, 0, sizeof mbs);
896f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            continue;
897f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
898f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (*out >= 0xd800 && *out <= 0xdfff) {
899f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            /* Surrogate character.  Escape the original
900f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou               byte sequence with surrogateescape. */
901f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            argsize -= converted;
902f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            while (converted--)
903f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                *out++ = 0xdc00 + *in++;
904f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            continue;
905f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
906f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* successfully converted some bytes */
907f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        in += converted;
908f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        argsize -= converted;
909f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        out++;
910f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
911d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#else
912f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Cannot use C locale for escaping; manually escape as if charset
913f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       is ASCII (i.e. escape all bytes > 128. This will still roundtrip
914f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou       correctly in the locale's charset, which must be an ASCII superset. */
915f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    res = PyMem_Malloc((strlen(arg)+1)*sizeof(wchar_t));
916f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!res) goto oom;
917f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    in = (unsigned char*)arg;
918f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    out = res;
919f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    while(*in)
920f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if(*in < 128)
921f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *out++ = *in++;
922f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        else
923f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            *out++ = 0xdc00 + *in++;
924f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    *out = 0;
925d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren#endif
926f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return res;
927d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussorenoom:
928f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    fprintf(stderr, "out of memory\n");
929f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return NULL;
930d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren}
931d61deca27cdef2d1e49aeb72d8556855420a77e1Ronald Oussoren
93249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus
93349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters}
93449fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif
935