summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBert Vermeulen <bert@biot.com>2012-01-20 22:08:22 +0100
committerBert Vermeulen <bert@biot.com>2012-01-21 15:06:20 +0100
commitd42fc6ee118ff673cef1c4ffbce0c7f603519f63 (patch)
tree2b744be0bc5777f206c2b7a0a0e9756517d92d96
parent4a04ece49f00ba2be5c16a55547b1a8d7e9519f9 (diff)
downloadlibsigrokdecode-d42fc6ee118ff673cef1c4ffbce0c7f603519f63.tar.gz
libsigrokdecode-d42fc6ee118ff673cef1c4ffbce0c7f603519f63.zip
add py_dictitem_as_str(), more checking in py_attr_as_str()
-rw-r--r--util.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/util.c b/util.c
index 7e2b82c..c65cbfd 100644
--- a/util.c
+++ b/util.c
@@ -50,14 +50,59 @@ int py_attr_as_str(PyObject *py_obj, const char *attr, char **outstr)
return SRD_ERR_PYTHON;
}
+ if (!PyUnicode_Check(py_str)) {
+ srd_err("%s attribute should be a string, but is a %s.",
+ attr, py_str->ob_type->tp_name);
+ Py_DecRef(py_str);
+ return SRD_ERR_PYTHON;
+ }
+
ret = py_str_as_str(py_str, outstr);
- Py_XDECREF(py_str);
+ Py_DecRef(py_str);
return ret;
}
/**
+ * Get the value of a python dictionary item, returned as a newly
+ * allocated char *.
+ *
+ * @param py_obj The dictionary to probe.
+ * @param attr Key of the item to retrieve.
+ * @param outstr ptr to char * storage to be filled in.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ * The 'outstr' argument points to a malloc()ed string upon success.
+ */
+int py_dictitem_as_str(PyObject *py_obj, const char *key, char **outstr)
+{
+ PyObject *py_value;
+ int ret;
+
+ if (!PyDict_Check(py_obj)) {
+ srd_err("Object is not a dictionary.");
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!(py_value = PyDict_GetItemString(py_obj, key))) {
+ srd_err("Dictionary has no attribute '%s'", key);
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!PyUnicode_Check(py_value)) {
+ srd_err("Dictionary value should be a string, but is a %s.",
+ key, py_value->ob_type->tp_name);
+ return SRD_ERR_PYTHON;
+ }
+
+ ret = py_str_as_str(py_value, outstr);
+
+ return SRD_OK;
+}
+
+
+/**
* Get the value of a python unicode string object, returned as a newly
* allocated char *.
*