]> sigrok.org Git - libsigrok.git/blobdiff - bindings/python/sigrok/core/lowlevel.i
python: Add conversion functions to/from GSList *
[libsigrok.git] / bindings / python / sigrok / core / lowlevel.i
index eaf02a0e82fd4fcef8186c9b17fff7597ed6adf7..f50d4d0f75d2f53038fde466333db5e9a4c3dcce 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * This file is part of the sigrok project.
+ * This file is part of the libsigrok project.
  *
  * Copyright (C) 2013 Martin Ling <martin-sigrok@earth.li>
  *
@@ -54,15 +54,60 @@ void sr_datafeed_python_callback(const struct sr_dev_inst *sdi,
     PyGILState_Release(gstate);
 }
 
-void sr_session_datafeed_python_callback_add(PyObject *cb)
+int sr_session_datafeed_python_callback_add(PyObject *cb)
 {
+    int ret;
+
     if (!PyCallable_Check(cb))
-        PyErr_SetString(PyExc_TypeError, "Object passed is not callable");
-    else
-        sr_session_datafeed_callback_add(
+        return SR_ERR_ARG;
+    else {
+        ret = sr_session_datafeed_callback_add(
             sr_datafeed_python_callback, cb);
+        if (ret == SR_OK)
+            Py_XINCREF(cb);
+        return ret;
+    }
+}
+
+PyObject *cdata(const void *data, unsigned long size)
+{
+#if PY_MAJOR_VERSION < 3
+    return PyString_FromStringAndSize(data, size);
+#else
+    return PyBytes_FromStringAndSize(data, size);
+#endif
+}
+
+GSList *python_to_gslist(PyObject *pylist)
+{
+    if (PyList_Check(pylist)) {
+        GSList *gslist = NULL;
+        int size = PyList_Size(pylist);
+        int i;
+        for (i = size - 1; i >= 0; i--) {
+            SwigPyObject *o = (SwigPyObject *)PyList_GetItem(pylist, i);
+            void *data = o->ptr;
+            gslist = g_slist_prepend(gslist, data);
+        }
+        return gslist;
+    }
+    return NULL;
+}
+
+PyObject *gslist_to_python(GSList *gslist)
+{
+    PyObject *pylist = PyList_New(0);
+    GSList *l;
+    for (l = gslist; l; l = l->next)
+        PyList_Append(pylist, SWIG_NewPointerObj(l->data, SWIGTYPE_p_void, 0));
+    return pylist;
 }
 
 %}
 
-void sr_session_datafeed_python_callback_add(PyObject *cb);
+int sr_session_datafeed_python_callback_add(PyObject *cb);
+
+PyObject *cdata(const void *data, unsigned long size);
+
+GSList *python_to_gslist(PyObject *pylist);
+PyObject *gslist_to_python(GSList *gslist);