python 3 port
authorBert Vermeulen <bert@biot.com>
Tue, 27 Dec 2011 21:15:53 +0000 (22:15 +0100)
committerUwe Hermann <uwe@hermann-uwe.de>
Wed, 28 Dec 2011 11:17:13 +0000 (12:17 +0100)
controller.c
decoders/i2c.py
util.c

index 140f664f1a2166992095a23459195993e939308b..982bceb6b6468b35080fbd60c9f5b95a422c5635 100644 (file)
 #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);
index c57dd334198ea53ffd1494d435a6a2db1fe5692d..8b8e665e47618535c685c9953ffba07668760ef1 100644 (file)
@@ -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 3aa0fd90a324ca5349c193f6129e6a858fbed2c1..b6de2fb8017c61dffb450b598e5bfa31ca62ed2d 100644 (file)
--- a/util.c
+++ b/util.c
  */
 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;
        }