summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--controller.c35
-rw-r--r--decoders/i2c.py6
-rw-r--r--util.c13
3 files changed, 31 insertions, 23 deletions
diff --git a/controller.c b/controller.c
index 140f664..982bceb 100644
--- a/controller.c
+++ b/controller.c
@@ -23,14 +23,6 @@
#include <glib.h>
#include <inttypes.h>
-/* TODO: this should probably be in sigrokdecode.h */
-/* Re-define some string functions for Python >= 3.0. */
-#if PY_VERSION_HEX >= 0x03000000
-#define PyString_AsString PyBytes_AsString
-#define PyString_FromString PyBytes_FromString
-#define PyString_Check PyBytes_Check
-#endif
-
/* TODO
static GSList *pipelines = NULL;
@@ -134,7 +126,7 @@ typedef struct {
} sigrok_Decoder_object;
static PyTypeObject sigrok_Decoder_type = {
- PyObject_HEAD_INIT(NULL)
+ PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "sigrok.Decoder",
.tp_basicsize = sizeof(sigrok_Decoder_object),
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
@@ -142,19 +134,30 @@ static PyTypeObject sigrok_Decoder_type = {
.tp_methods = Decoder_methods,
};
-PyMODINIT_FUNC init_sigrok_Decoder(void)
+static struct PyModuleDef sigrok_Decoder_module = {
+ PyModuleDef_HEAD_INIT,
+ .m_name = "sigrok",
+ .m_doc = "sigrok base classes",
+ .m_size = -1,
+ .m_methods = no_methods,
+};
+
+PyMODINIT_FUNC PyInit_sigrok(void)
{
PyObject *mod;
/* assign this here, for compiler portability */
sigrok_Decoder_type.tp_new = PyType_GenericNew;
if (PyType_Ready(&sigrok_Decoder_type) < 0)
- return;
+ return NULL;
- mod = Py_InitModule3("sigrok", no_methods, "sigrok base classes");
+// mod = Py_InitModule3("sigrok", no_methods, "sigrok base classes");
+ mod = PyModule_Create(&sigrok_Decoder_module);
Py_INCREF(&sigrok_Decoder_type);
- PyModule_AddObject(mod, "Decoder", (PyObject *)&sigrok_Decoder_type);
+ if (PyModule_AddObject(mod, "Decoder", (PyObject *)&sigrok_Decoder_type) == -1)
+ return NULL;
+ return mod;
}
@@ -198,10 +201,12 @@ int srd_init(void)
{
int ret;
+ PyImport_AppendInittab("sigrok", PyInit_sigrok);
+
/* Py_Initialize() returns void and usually cannot fail. */
Py_Initialize();
- init_sigrok_Decoder();
+ PyInit_sigrok();
PyRun_SimpleString("import sys;");
if ((ret = set_modulepath()) != SRD_OK) {
@@ -312,7 +317,7 @@ int srd_instance_set_probe(struct srd_decoder_instance *di,
return SRD_ERR_PYTHON; /* TODO: More specific error? */
}
- probenum = PyInt_FromLong(num);
+ probenum = PyLong_FromLong(num);
PyMapping_SetItemString(probedict, (char *)probename, probenum);
Py_XDECREF(probenum);
diff --git a/decoders/i2c.py b/decoders/i2c.py
index c57dd33..8b8e665 100644
--- a/decoders/i2c.py
+++ b/decoders/i2c.py
@@ -319,7 +319,7 @@ class Decoder(sigrok.Decoder):
duration = self.bitcount * self.period
else:
duration = self.period
- print "**", timeoffset, duration
+ print("**", timeoffset, duration)
super(Decoder, self).put(timeoffset, duration, output_id, data)
def decode(self, timeoffset, duration, data):
@@ -327,9 +327,9 @@ class Decoder(sigrok.Decoder):
self.timeoffset = timeoffset
self.duration = duration
- print "++", timeoffset, duration, len(data)
+ print("++", timeoffset, duration, len(data))
# duration of one bit in ps, only valid for this call to decode()
- self.period = duration / len(data)
+ self.period = int(duration / len(data))
# We should accept a list of samples and iterate...
for sample in sampleiter(data, self.unitsize):
diff --git a/util.c b/util.c
index 3aa0fd9..b6de2fb 100644
--- a/util.c
+++ b/util.c
@@ -32,22 +32,25 @@
*/
int h_str(PyObject *py_res, PyObject *py_mod, const char *key, char **outstr)
{
- PyObject *py_str;
+ PyObject *py_str, *py_encstr;
char *str;
int ret;
- py_str = PyObject_GetAttrString(py_res, (char *)key); /* NEWREF */
- if (!py_str || !PyString_Check(py_str)) {
+ if (!(py_str = PyObject_GetAttrString(py_res, (char *)key))) {
ret = SRD_ERR_PYTHON; /* TODO: More specific error? */
goto err_h_decref_mod;
}
/*
- * PyString_AsString()'s returned string refers to an internal buffer
+ * PyBytes_AsString()'s returned string refers to an internal buffer
* (not a copy), i.e. the data must not be modified, and the memory
* must not be free()'d.
*/
- if (!(str = PyString_AsString(py_str))) {
+ if (!(py_encstr = PyUnicode_AsEncodedString(py_str, "utf-8", NULL))) {
+ ret = SRD_ERR_PYTHON; /* TODO: More specific error? */
+ goto err_h_decref_str;
+ }
+ if (!(str = PyBytes_AS_STRING(py_encstr))) {
ret = SRD_ERR_PYTHON; /* TODO: More specific error? */
goto err_h_decref_str;
}