summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorBert Vermeulen <bert@biot.com>2011-12-04 10:33:02 +0100
committerBert Vermeulen <bert@biot.com>2011-12-04 17:56:56 +0100
commitb2c19614a6c4eaa0170971d1261a1bb25212e277 (patch)
treeb599e5e3795c0b094cd4514820db0c7e761653fd /util.c
parent2b7d0e2bf5147025e9d76d14e266b9905503b957 (diff)
downloadlibsigrokdecode-b2c19614a6c4eaa0170971d1261a1bb25212e277.tar.gz
libsigrokdecode-b2c19614a6c4eaa0170971d1261a1bb25212e277.zip
refactored PD framework, now using new sigrok.Decoder object
This uses the new python unified type/class object API to construct an object for PDs to subclass. The sigrok.Decoder class has a method put() which is implemented as a C function, and receives the PD's object instance as its first parameter.
Diffstat (limited to 'util.c')
-rw-r--r--util.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/util.c b/util.c
new file mode 100644
index 0000000..3aa0fd9
--- /dev/null
+++ b/util.c
@@ -0,0 +1,74 @@
+/*
+ * This file is part of the sigrok project.
+ *
+ * Copyright (C) 2010 Uwe Hermann <uwe@hermann-uwe.de>
+ * Copyright (C) 2011 Bert Vermeulen <bert@biot.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+#include <sigrokdecode.h> /* First, so we avoid a _POSIX_C_SOURCE warning. */
+
+
+/**
+ * Helper function to handle Python strings.
+ *
+ * TODO: @param entries.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ * The 'outstr' argument points to a malloc()ed string upon success.
+ */
+int h_str(PyObject *py_res, PyObject *py_mod, const char *key, char **outstr)
+{
+ PyObject *py_str;
+ char *str;
+ int ret;
+
+ py_str = PyObject_GetAttrString(py_res, (char *)key); /* NEWREF */
+ if (!py_str || !PyString_Check(py_str)) {
+ ret = SRD_ERR_PYTHON; /* TODO: More specific error? */
+ goto err_h_decref_mod;
+ }
+
+ /*
+ * PyString_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))) {
+ ret = SRD_ERR_PYTHON; /* TODO: More specific error? */
+ goto err_h_decref_str;
+ }
+
+ if (!(*outstr = g_strdup(str))) {
+ ret = SRD_ERR_MALLOC;
+ goto err_h_decref_str;
+ }
+
+ Py_XDECREF(py_str);
+
+ return SRD_OK;
+
+err_h_decref_str:
+ Py_XDECREF(py_str);
+err_h_decref_mod:
+ Py_XDECREF(py_mod);
+
+ if (PyErr_Occurred())
+ PyErr_Print(); /* Returns void. */
+
+ return ret;
+}
+