#define PY_SSIZE_T_CLEAN #include #include "scode.h" #include "config.h" #include "log.h" #include "ep_init.h" #include "ep_util.h" static wchar_t *python_name = NULL; /* location of the Python executable */ PyObject *UPIWIN_module = NULL; PyObject *UPIWIN_tmp_module = NULL; /* used to link the two modules into Python's init table */ static struct _inittab upiwin_inittab[] = { { MOD_NAME_UPIWIN, Epython_init_upiwin_module }, { MOD_NAME_UPIWIN_TMP, Epython_init_upiwin_tmp_module }, { NULL, NULL } }; static void epython_cleanup(void) { Py_DECREF(UPIWIN_tmp_module); UPIWIN_tmp_module = NULL; Py_DECREF(UPIWIN_module); UPIWIN_module = NULL; if (!Py_FinalizeEx()) Log(LWARN, "errors encountered when Python uninitialized itself"); PyMem_RawFree(python_name); python_name = NULL; } HRESULT Epython_setup(void) { HRESULT hr; size_t size; python_name = Py_DecodeLocale(Gconfig.python_loc, &size); if (!python_name) { if (size==(size_t)(-1)) { Log(LFATAL, "error allocating Python program location"); return E_OUTOFMEMORY; } else { Log(LFATAL, "internal error in Py_DecodeLocale"); return E_UNEXPECTED; } } Py_SetProgramName(python_name); if (PyImport_ExtendInittab(upiwin_inittab)) { Log(LFATAL, "error allocating extended init table"); hr = E_OUTOFMEMORY; goto error_0; } Py_Initialize(); /* Import the modules */ UPIWIN_module = PyImport_ImportModule(MOD_NAME_UPIWIN); if (!UPIWIN_module) { Log(LFATAL, "error importing the upiwin module"); hr = Epython_trace_exception(); goto error_1; } UPIWIN_tmp_module = PyImport_ImportModule(MOD_NAME_UPIWIN_TMP); if (!UPIWIN_tmp_module) { Log(LFATAL, "error importing the upiwin_tmp module"); hr = Epython_trace_exception(); goto error_2; } hr = Config_exitfunc(epython_cleanup); if (FAILED(hr)) epython_cleanup(); return hr; error_2: Py_DECREF(UPIWIN_module); UPIWIN_module = NULL; error_1: Py_FinalizeEx(); error_0: PyMem_RawFree(python_name); python_name = NULL; return hr; }