From 40589f25f90c4863cfe2787b72629aa0a8cda082 Mon Sep 17 00:00:00 2001 From: Uwe Hermann Date: Thu, 25 Aug 2016 22:22:07 +0200 Subject: [PATCH] Factor out srd_decoder_apiver(). --- decoder.c | 31 +++++++++++++++++++++++++------ libsigrokdecode-internal.h | 3 +++ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/decoder.c b/decoder.c index 748280a..25ca476 100644 --- a/decoder.c +++ b/decoder.c @@ -586,6 +586,29 @@ static int check_method(PyObject *py_dec, const char *mod_name, return SRD_OK; } +/** + * Get the API version of the specified decoder. + * + * @param d The decoder to use. Must not be NULL. + * + * @return The API version of the decoder, or 0 upon errors. + */ +SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d) +{ + PyObject *py_apiver; + long apiver; + + if (!d) + return 0; + + py_apiver = PyObject_GetAttrString(d->py_dec, "api_version"); + apiver = (py_apiver && PyLong_Check(py_apiver)) + ? PyLong_AsLong(py_apiver) : 0; + Py_XDECREF(py_apiver); + + return apiver; +} + /** * Load a protocol decoder module into the embedded Python interpreter. * @@ -597,7 +620,7 @@ static int check_method(PyObject *py_dec, const char *mod_name, */ SRD_API int srd_decoder_load(const char *module_name) { - PyObject *py_basedec, *py_apiver; + PyObject *py_basedec; struct srd_decoder *d; long apiver; int is_subclass; @@ -648,11 +671,7 @@ SRD_API int srd_decoder_load(const char *module_name) * Check that this decoder has the correct PD API version. * PDs of different API versions are incompatible and cannot work. */ - py_apiver = PyObject_GetAttrString(d->py_dec, "api_version"); - apiver = (py_apiver && PyLong_Check(py_apiver)) - ? PyLong_AsLong(py_apiver) : 0; - Py_XDECREF(py_apiver); - + apiver = srd_decoder_apiver(d); if (apiver != 2) { srd_exception_catch("Only PDs of API version 2 are supported"); goto err_out; diff --git a/libsigrokdecode-internal.h b/libsigrokdecode-internal.h index d32414a..8259b97 100644 --- a/libsigrokdecode-internal.h +++ b/libsigrokdecode-internal.h @@ -86,6 +86,9 @@ SRD_PRIV int srd_log(int loglevel, const char *format, ...) G_GNUC_PRINTF(2, 3); #define srd_warn(...) srd_log(SRD_LOG_WARN, __VA_ARGS__) #define srd_err(...) srd_log(SRD_LOG_ERR, __VA_ARGS__) +/* decoder.c */ +SRD_PRIV long srd_decoder_apiver(const struct srd_decoder *d); + /* type_decoder.c */ SRD_PRIV PyObject *srd_Decoder_type_new(void); -- 2.30.2