diff options
author | Uwe Hermann <uwe@hermann-uwe.de> | 2016-08-26 15:09:17 +0200 |
---|---|---|
committer | Uwe Hermann <uwe@hermann-uwe.de> | 2016-12-07 22:37:49 +0100 |
commit | 21dfd91d99836bdc6c0da939b601dd8a52358f21 (patch) | |
tree | 54e380dc67e1cd73273679d04c4c5a8af3036e4f /util.c | |
parent | ee9304c667bf98b3c4e3a767943e3d8f6964601e (diff) | |
download | libsigrokdecode-21dfd91d99836bdc6c0da939b601dd8a52358f21.tar.gz libsigrokdecode-21dfd91d99836bdc6c0da939b601dd8a52358f21.zip |
Add support for the new query-based PD v3 decoder API.
For the time being, both APIs (2 and 3) will remain supported until all
decoders have been converted to API version 3. Then, support for API
version 2 will be dropped.
Decoders using PD v3 API can benefit from both readability improvements
as well as performance improvements. Up to 10x speedup has been measured
in some situations (depends a lot on the decoder, the amount of data,
the amount of edges in the signals, the amount of oversampling etc. etc.).
This is only the first set of (basic) performance improvements for
libsigrokdecode, there are various additional opportunities for further
changes to improve performance.
This changeset has been tested to survive a run of all the test-cases in
the sigrok-test repo without issues (for the converted PDs), however it is
not very well-tested yet, so there might be regressions that need to be
addressed.
Diffstat (limited to 'util.c')
-rw-r--r-- | util.c | 78 |
1 files changed, 78 insertions, 0 deletions
@@ -113,6 +113,84 @@ SRD_PRIV int py_dictitem_as_str(PyObject *py_obj, const char *key, } /** + * Get the value of a Python dictionary item, returned as a newly + * allocated char *. + * + * @param py_obj The dictionary to probe. + * @param py_key Key of the item to retrieve. + * @param outstr Pointer 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. + * + * @private + */ +SRD_PRIV int py_pydictitem_as_str(PyObject *py_obj, PyObject *py_key, + char **outstr) +{ + PyObject *py_value; + + if (!py_obj || !py_key || !outstr) + return SRD_ERR_ARG; + + if (!PyDict_Check(py_obj)) { + srd_dbg("Object is not a dictionary."); + return SRD_ERR_PYTHON; + } + + if (!(py_value = PyDict_GetItem(py_obj, py_key))) { + srd_dbg("Dictionary has no such key."); + return SRD_ERR_PYTHON; + } + + if (!PyUnicode_Check(py_value)) { + srd_dbg("Dictionary value should be a string."); + return SRD_ERR_PYTHON; + } + + return py_str_as_str(py_value, outstr); +} + +/** + * Get the value of a Python dictionary item, returned as a newly + * allocated char *. + * + * @param py_obj The dictionary to probe. + * @param py_key Key of the item to retrieve. + * @param out TODO. + * + * @return SRD_OK upon success, a (negative) error code otherwise. + * + * @private + */ +SRD_PRIV int py_pydictitem_as_long(PyObject *py_obj, PyObject *py_key, uint64_t *out) +{ + PyObject *py_value; + + if (!py_obj || !py_key || !out) + return SRD_ERR_ARG; + + if (!PyDict_Check(py_obj)) { + srd_dbg("Object is not a dictionary."); + return SRD_ERR_PYTHON; + } + + if (!(py_value = PyDict_GetItem(py_obj, py_key))) { + srd_dbg("Dictionary has no such key."); + return SRD_ERR_PYTHON; + } + + if (!PyLong_Check(py_value)) { + srd_dbg("Dictionary value should be a long."); + return SRD_ERR_PYTHON; + } + + *out = PyLong_AsUnsignedLongLong(py_value); + + return SRD_OK; +} + +/** * Get the value of a Python unicode string object, returned as a newly * allocated char *. * |