]> sigrok.org Git - libsigrokdecode.git/blobdiff - module_sigrokdecode.c
configure.ac: Also check for Python 3.6.
[libsigrokdecode.git] / module_sigrokdecode.c
index a76645c582c6e205912d03d6f4299eb069551303..17563c1d85d4571e362b5b71a3c5868a36d8c488 100644 (file)
@@ -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 <bert@biot.com>
  *
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "sigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
-#include "sigrokdecode-internal.h"
-#include "config.h"
+#include <config.h>
+#include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
+#include "libsigrokdecode.h"
 
-/* type_decoder.c */
-extern SRD_PRIV PyTypeObject srd_Decoder_type;
+/** @cond PRIVATE */
 
-/* type_logic.c */
-extern SRD_PRIV PyTypeObject srd_logic_type;
+SRD_PRIV PyObject *srd_logic_type = NULL;
 
 /*
  * When initialized, a reference to this module inside the Python interpreter
@@ -33,6 +31,8 @@ extern SRD_PRIV PyTypeObject srd_logic_type;
  */
 SRD_PRIV PyObject *mod_sigrokdecode = NULL;
 
+/** @endcond */
+
 static struct PyModuleDef sigrokdecode_module = {
        PyModuleDef_HEAD_INIT,
        .m_name = "sigrokdecode",
@@ -40,41 +40,48 @@ static struct PyModuleDef sigrokdecode_module = {
        .m_size = -1,
 };
 
-/* FIXME: SRD_PRIV causes issues on MinGW. Investigate. */
+/** @cond PRIVATE */
 PyMODINIT_FUNC PyInit_sigrokdecode(void)
 {
-       PyObject *mod;
+       PyObject *mod, *Decoder_type, *logic_type;
 
-       /* 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;
+       mod = PyModule_Create(&sigrokdecode_module);
+       if (!mod)
+               goto err_out;
 
-       srd_logic_type.tp_new = PyType_GenericNew;
-       if (PyType_Ready(&srd_logic_type) < 0)
-               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;
 
-       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;
+       logic_type = srd_logic_type_new();
+       if (!logic_type)
+               goto err_out;
+       if (PyModule_AddObject(mod, "srd_logic", logic_type) < 0)
+               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;
+       /* 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;
 
+       srd_logic_type = logic_type;
        mod_sigrokdecode = mod;
 
        return mod;
+err_out:
+       Py_XDECREF(mod);
+       srd_exception_catch("Failed to initialize module");
+
+       return NULL;
 }
+/** @endcond */