| | |
| |
|
| | #ifdef __FreeBSD__ |
| | #include <floatingpoint.h> |
| | #endif |
| |
|
| | #if PY_MAJOR_VERSION < 3 |
| | int %(main_method)s(int argc, char** argv) { |
| | #elif defined(WIN32) || defined(MS_WINDOWS) |
| | int %(wmain_method)s(int argc, wchar_t **argv) { |
| | #else |
| | static int __Pyx_main(int argc, wchar_t **argv) { |
| | #endif |
| | |
| | |
| | |
| | |
| | |
| | #ifdef __FreeBSD__ |
| | fp_except_t m; |
| |
|
| | m = fpgetmask(); |
| | fpsetmask(m & ~FP_X_OFL); |
| | #endif |
| | if (argc && argv) |
| | Py_SetProgramName(argv[0]); |
| | Py_Initialize(); |
| | if (argc && argv) |
| | PySys_SetArgv(argc, argv); |
| | { |
| | PyObject* m = NULL; |
| | %(module_is_main)s = 1; |
| | #if PY_MAJOR_VERSION < 3 |
| | init%(module_name)s(); |
| | #elif CYTHON_PEP489_MULTI_PHASE_INIT |
| | m = PyInit_%(module_name)s(); |
| | if (!PyModule_Check(m)) { |
| | PyModuleDef *mdef = (PyModuleDef *) m; |
| | PyObject *modname = PyUnicode_FromString("__main__"); |
| | m = NULL; |
| | if (modname) { |
| | |
| | |
| | m = PyModule_NewObject(modname); |
| | Py_DECREF(modname); |
| | if (m) PyModule_ExecDef(m, mdef); |
| | } |
| | } |
| | #else |
| | m = PyInit_%(module_name)s(); |
| | #endif |
| | if (PyErr_Occurred()) { |
| | PyErr_Print(); |
| | #if PY_MAJOR_VERSION < 3 |
| | if (Py_FlushLine()) PyErr_Clear(); |
| | #endif |
| | return 1; |
| | } |
| | Py_XDECREF(m); |
| | } |
| | #if PY_VERSION_HEX < 0x03060000 |
| | Py_Finalize(); |
| | #else |
| | if (Py_FinalizeEx() < 0) |
| | return 2; |
| | #endif |
| | return 0; |
| | } |
| |
|
| |
|
| | #if PY_MAJOR_VERSION >= 3 && !defined(WIN32) && !defined(MS_WINDOWS) |
| | #include <locale.h> |
| |
|
| | static wchar_t* |
| | __Pyx_char2wchar(char* arg) |
| | { |
| | wchar_t *res; |
| | #ifdef HAVE_BROKEN_MBSTOWCS |
| | |
| | |
| | |
| | |
| | size_t argsize = strlen(arg); |
| | #else |
| | size_t argsize = mbstowcs(NULL, arg, 0); |
| | #endif |
| | size_t count; |
| | unsigned char *in; |
| | wchar_t *out; |
| | #ifdef HAVE_MBRTOWC |
| | mbstate_t mbs; |
| | #endif |
| | if (argsize != (size_t)-1) { |
| | res = (wchar_t *)malloc((argsize+1)*sizeof(wchar_t)); |
| | if (!res) |
| | goto oom; |
| | count = mbstowcs(res, arg, argsize+1); |
| | if (count != (size_t)-1) { |
| | wchar_t *tmp; |
| | |
| | |
| | for (tmp = res; *tmp != 0 && |
| | (*tmp < 0xd800 || *tmp > 0xdfff); tmp++) |
| | ; |
| | if (*tmp == 0) |
| | return res; |
| | } |
| | free(res); |
| | } |
| | |
| | #ifdef HAVE_MBRTOWC |
| | |
| |
|
| | |
| | |
| | argsize = strlen(arg) + 1; |
| | res = (wchar_t *)malloc(argsize*sizeof(wchar_t)); |
| | if (!res) goto oom; |
| | in = (unsigned char*)arg; |
| | out = res; |
| | memset(&mbs, 0, sizeof mbs); |
| | while (argsize) { |
| | size_t converted = mbrtowc(out, (char*)in, argsize, &mbs); |
| | if (converted == 0) |
| | |
| | break; |
| | if (converted == (size_t)-2) { |
| | |
| | |
| | |
| | |
| | fprintf(stderr, "unexpected mbrtowc result -2\\n"); |
| | free(res); |
| | return NULL; |
| | } |
| | if (converted == (size_t)-1) { |
| | |
| | |
| | *out++ = 0xdc00 + *in++; |
| | argsize--; |
| | memset(&mbs, 0, sizeof mbs); |
| | continue; |
| | } |
| | if (*out >= 0xd800 && *out <= 0xdfff) { |
| | |
| | |
| | argsize -= converted; |
| | while (converted--) |
| | *out++ = 0xdc00 + *in++; |
| | continue; |
| | } |
| | |
| | in += converted; |
| | argsize -= converted; |
| | out++; |
| | } |
| | #else |
| | |
| | |
| | |
| | res = (wchar_t *)malloc((strlen(arg)+1)*sizeof(wchar_t)); |
| | if (!res) goto oom; |
| | in = (unsigned char*)arg; |
| | out = res; |
| | while(*in) |
| | if(*in < 128) |
| | *out++ = *in++; |
| | else |
| | *out++ = 0xdc00 + *in++; |
| | *out = 0; |
| | #endif |
| | return res; |
| | oom: |
| | fprintf(stderr, "out of memory\\n"); |
| | return NULL; |
| | } |
| |
|
| | int |
| | %(main_method)s(int argc, char **argv) |
| | { |
| | if (!argc) { |
| | return __Pyx_main(0, NULL); |
| | } |
| | else { |
| | int i, res; |
| | wchar_t **argv_copy = (wchar_t **)malloc(sizeof(wchar_t*)*argc); |
| | |
| | wchar_t **argv_copy2 = (wchar_t **)malloc(sizeof(wchar_t*)*argc); |
| | char *oldloc = strdup(setlocale(LC_ALL, NULL)); |
| | if (!argv_copy || !argv_copy2 || !oldloc) { |
| | fprintf(stderr, "out of memory\\n"); |
| | free(argv_copy); |
| | free(argv_copy2); |
| | free(oldloc); |
| | return 1; |
| | } |
| | res = 0; |
| | setlocale(LC_ALL, ""); |
| | for (i = 0; i < argc; i++) { |
| | argv_copy2[i] = argv_copy[i] = __Pyx_char2wchar(argv[i]); |
| | if (!argv_copy[i]) res = 1; |
| | } |
| | setlocale(LC_ALL, oldloc); |
| | free(oldloc); |
| | if (res == 0) |
| | res = __Pyx_main(argc, argv_copy); |
| | for (i = 0; i < argc; i++) { |
| | #if PY_VERSION_HEX < 0x03050000 |
| | free(argv_copy2[i]); |
| | #else |
| | PyMem_RawFree(argv_copy2[i]); |
| | #endif |
| | } |
| | free(argv_copy); |
| | free(argv_copy2); |
| | return res; |
| | } |
| | } |
| | #endif |
| |
|