diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2014-07-25 11:52:14 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2014-07-25 11:52:14 (GMT) |
commit | 973fe0ba7adb081b81f319b924f9bbb50b2b1345 (patch) | |
tree | 5b386540c29cbf34abbceb101c13377ae3760c71 /Programs/python.c | |
parent | d6766ae434fd09130863af913a8193641e51b91c (diff) | |
download | cpython-973fe0ba7adb081b81f319b924f9bbb50b2b1345.zip cpython-973fe0ba7adb081b81f319b924f9bbb50b2b1345.tar.gz cpython-973fe0ba7adb081b81f319b924f9bbb50b2b1345.tar.bz2 |
Issue #18093: Factor out the programs that embed the runtime
Diffstat (limited to 'Programs/python.c')
-rw-r--r-- | Programs/python.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/Programs/python.c b/Programs/python.c new file mode 100644 index 0000000..9811c01 --- /dev/null +++ b/Programs/python.c @@ -0,0 +1,77 @@ +/* Minimal main program -- everything is loaded from the library */ + +#include "Python.h" +#include <locale.h> + +#ifdef __FreeBSD__ +#include <floatingpoint.h> +#endif + +#ifdef MS_WINDOWS +int +wmain(int argc, wchar_t **argv) +{ + return Py_Main(argc, argv); +} +#else + +int +main(int argc, char **argv) +{ + wchar_t **argv_copy; + /* We need a second copy, as Python might modify the first one. */ + wchar_t **argv_copy2; + int i, res; + char *oldloc; +#ifdef __FreeBSD__ + fp_except_t m; +#endif + + argv_copy = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1)); + argv_copy2 = (wchar_t **)PyMem_RawMalloc(sizeof(wchar_t*) * (argc+1)); + if (!argv_copy || !argv_copy2) { + fprintf(stderr, "out of memory\n"); + return 1; + } + + /* 754 requires that FP exceptions run in "no stop" mode by default, + * and until C vendors implement C99's ways to control FP exceptions, + * Python requires non-stop mode. Alas, some platforms enable FP + * exceptions by default. Here we disable them. + */ +#ifdef __FreeBSD__ + m = fpgetmask(); + fpsetmask(m & ~FP_X_OFL); +#endif + + oldloc = _PyMem_RawStrdup(setlocale(LC_ALL, NULL)); + if (!oldloc) { + fprintf(stderr, "out of memory\n"); + return 1; + } + + setlocale(LC_ALL, ""); + for (i = 0; i < argc; i++) { + argv_copy[i] = _Py_char2wchar(argv[i], NULL); + if (!argv_copy[i]) { + PyMem_RawFree(oldloc); + fprintf(stderr, "Fatal Python error: " + "unable to decode the command line argument #%i\n", + i + 1); + return 1; + } + argv_copy2[i] = argv_copy[i]; + } + argv_copy2[argc] = argv_copy[argc] = NULL; + + setlocale(LC_ALL, oldloc); + PyMem_RawFree(oldloc); + res = Py_Main(argc, argv_copy); + for (i = 0; i < argc; i++) { + PyMem_RawFree(argv_copy2[i]); + } + PyMem_RawFree(argv_copy); + PyMem_RawFree(argv_copy2); + return res; +} +#endif |