|  | /* Minimal main program -- everything is loaded from the library */ | 
|  |  | 
|  | #include "Python.h" | 
|  | #include <locale.h> | 
|  |  | 
|  | #ifdef __FreeBSD__ | 
|  | #include <fenv.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; | 
|  |  | 
|  | 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__ | 
|  | fedisableexcept(FE_OVERFLOW); | 
|  | #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_DecodeLocale(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 |