|
|
|
|
|
|
|
|
#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 |
|
|
|