X-Git-Url: https://sigrok.org/gitweb/?p=libsigrokdecode.git;a=blobdiff_plain;f=module_sigrokdecode.c;h=ab5df19e3db27cde47cf1cc943a83ccbd4d51aa6;hp=00644ccfa05b9d2bfbb7d65fefd48c7e12bc8a98;hb=25d3576134e7b57ca169e8e4ebd4e4ce5dcf62dd;hpb=57790bc8c558ccf2e57b3d973c043088232628c7 diff --git a/module_sigrokdecode.c b/module_sigrokdecode.c index 00644cc..ab5df19 100644 --- a/module_sigrokdecode.c +++ b/module_sigrokdecode.c @@ -1,5 +1,5 @@ /* - * This file is part of the sigrok project. + * This file is part of the libsigrokdecode project. * * Copyright (C) 2012 Bert Vermeulen * @@ -17,18 +17,12 @@ * along with this program. If not, see . */ -#include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ -#include "sigrokdecode-internal.h" -#include "config.h" +#include +#include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */ +#include "libsigrokdecode.h" /** @cond PRIVATE */ -/* type_decoder.c */ -extern SRD_PRIV PyTypeObject srd_Decoder_type; - -/* type_logic.c */ -extern SRD_PRIV PyTypeObject srd_logic_type; - /* * When initialized, a reference to this module inside the Python interpreter * lives here. @@ -45,42 +39,46 @@ static struct PyModuleDef sigrokdecode_module = { }; /** @cond PRIVATE */ -/* FIXME: SRD_PRIV causes issues on MinGW. Investigate. */ PyMODINIT_FUNC PyInit_sigrokdecode(void) { - PyObject *mod; - - /* tp_new needs to be assigned here for compiler portability. */ - srd_Decoder_type.tp_new = PyType_GenericNew; - if (PyType_Ready(&srd_Decoder_type) < 0) - return NULL; + PyObject *mod, *Decoder_type; + PyGILState_STATE gstate; - srd_logic_type.tp_new = PyType_GenericNew; - if (PyType_Ready(&srd_logic_type) < 0) - return NULL; + gstate = PyGILState_Ensure(); mod = PyModule_Create(&sigrokdecode_module); - Py_INCREF(&srd_Decoder_type); - if (PyModule_AddObject(mod, "Decoder", - (PyObject *)&srd_Decoder_type) == -1) - return NULL; - Py_INCREF(&srd_logic_type); - if (PyModule_AddObject(mod, "srd_logic", - (PyObject *)&srd_logic_type) == -1) - return NULL; + if (!mod) + goto err_out; - /* expose output types as symbols in the sigrokdecode module */ - if (PyModule_AddIntConstant(mod, "OUTPUT_ANN", SRD_OUTPUT_ANN) == -1) - return NULL; - if (PyModule_AddIntConstant(mod, "OUTPUT_PROTO", - SRD_OUTPUT_PROTO) == -1) - return NULL; - if (PyModule_AddIntConstant(mod, "OUTPUT_BINARY", - SRD_OUTPUT_BINARY) == -1) - return NULL; + Decoder_type = srd_Decoder_type_new(); + if (!Decoder_type) + goto err_out; + if (PyModule_AddObject(mod, "Decoder", Decoder_type) < 0) + goto err_out; + + /* Expose output types as symbols in the sigrokdecode module */ + if (PyModule_AddIntConstant(mod, "OUTPUT_ANN", SRD_OUTPUT_ANN) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_PYTHON", SRD_OUTPUT_PYTHON) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_BINARY", SRD_OUTPUT_BINARY) < 0) + goto err_out; + if (PyModule_AddIntConstant(mod, "OUTPUT_META", SRD_OUTPUT_META) < 0) + goto err_out; + /* Expose meta input symbols. */ + if (PyModule_AddIntConstant(mod, "SRD_CONF_SAMPLERATE", SRD_CONF_SAMPLERATE) < 0) + goto err_out; mod_sigrokdecode = mod; + PyGILState_Release(gstate); + return mod; +err_out: + Py_XDECREF(mod); + srd_exception_catch("Failed to initialize module"); + PyGILState_Release(gstate); + + return NULL; } /** @endcond */