]> sigrok.org Git - libsigrokdecode.git/blobdiff - srd.c
init: Simplify srd_decoder_searchpath_add()
[libsigrokdecode.git] / srd.c
diff --git a/srd.c b/srd.c
index 07d79523ae859dd3d8de5d5e7d71ce0455dcf220..b152e0c1637a82388821bad512d83d80200b637b 100644 (file)
--- a/srd.c
+++ b/srd.c
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "libsigrokdecode.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
-#include "libsigrokdecode-internal.h"
-#include "config.h"
+#include <config.h>
+#include "libsigrokdecode-internal.h" /* First, so we avoid a _POSIX_C_SOURCE warning. */
+#include "libsigrokdecode.h"
 #include <glib.h>
 
 /** @cond PRIVATE */
 
-/* session.c */
-extern GSList *sessions;
-extern int max_session_id;
-
-/* decoder.c */
-extern SRD_PRIV GSList *pd_list;
+/* Python module search paths */
+SRD_PRIV GSList *searchpaths = NULL;
 
-/* module_sigrokdecode.c */
-extern PyMODINIT_FUNC PyInit_sigrokdecode(void);
+/* session.c */
+extern SRD_PRIV GSList *sessions;
+extern SRD_PRIV int max_session_id;
 
 /** @endcond */
 
@@ -65,7 +62,7 @@ extern PyMODINIT_FUNC PyInit_sigrokdecode(void);
  *
  * @section sec_mailinglists Mailing lists
  *
- * There are two mailing lists for sigrok/libsigrokdecode: <a href="https://lists.sourceforge.net/lists/listinfo/sigrok-devel">sigrok-devel</a> and <a href="https://lists.sourceforge.net/lists/listinfo/sigrok-commits">sigrok-commits</a>.
+ * There is one mailing list for sigrok/libsigrokdecode: <a href="https://lists.sourceforge.net/lists/listinfo/sigrok-devel">sigrok-devel</a>.
  *
  * @section sec_irc IRC
  *
@@ -194,8 +191,8 @@ SRD_API int srd_exit(void)
                srd_session_destroy((struct srd_session *)l->data);
 
        srd_decoder_unload_all();
-       g_slist_free(pd_list);
-       pd_list = NULL;
+       g_slist_free_full(searchpaths, g_free);
+       searchpaths = NULL;
 
        /* Py_Finalize() returns void, any finalization errors are ignored. */
        Py_Finalize();
@@ -227,38 +224,26 @@ SRD_API int srd_exit(void)
 SRD_PRIV int srd_decoder_searchpath_add(const char *path)
 {
        PyObject *py_cur_path, *py_item;
-       GString *new_path;
-       int wc_len, i;
-       wchar_t *wc_new_path;
-       char *item;
 
        srd_dbg("Adding '%s' to module path.", path);
 
-       new_path = g_string_sized_new(256);
-       g_string_assign(new_path, path);
        py_cur_path = PySys_GetObject("path");
-       for (i = 0; i < PyList_Size(py_cur_path); i++) {
-               g_string_append(new_path, G_SEARCHPATH_SEPARATOR_S);
-               py_item = PyList_GetItem(py_cur_path, i);
-               if (!PyUnicode_Check(py_item))
-                       /* Shouldn't happen. */
-                       continue;
-               if (py_str_as_str(py_item, &item) != SRD_OK)
-                       continue;
-               g_string_append(new_path, item);
-               g_free(item);
-       }
+       if (!py_cur_path)
+               return SRD_ERR_PYTHON;
 
-       /* Convert to wide chars. */
-       wc_len = sizeof(wchar_t) * (new_path->len + 1);
-       if (!(wc_new_path = g_try_malloc(wc_len))) {
-               srd_dbg("malloc failed");
-               return SRD_ERR_MALLOC;
+       py_item = PyUnicode_FromString(path);
+       if (!py_item) {
+               srd_exception_catch("Failed to create Unicode object");
+               return SRD_ERR_PYTHON;
+       }
+       if (PyList_Insert(py_cur_path, 0, py_item) < 0) {
+               srd_exception_catch("Failed to insert path element");
+               Py_DECREF(py_item);
+               return SRD_ERR_PYTHON;
        }
-       mbstowcs(wc_new_path, new_path->str, wc_len);
-       PySys_SetPath(wc_new_path);
-       g_string_free(new_path, TRUE);
-       g_free(wc_new_path);
+       Py_DECREF(py_item);
+
+       searchpaths = g_slist_prepend(searchpaths, g_strdup(path));
 
        return SRD_OK;
 }