]> git.neil.brown.name Git - edlib.git/commitdiff
python: provide access to a mark's mdata
authorNeilBrown <neil@brown.name>
Mon, 25 Jan 2016 00:43:25 +0000 (11:43 +1100)
committerNeilBrown <neil@brown.name>
Mon, 25 Jan 2016 00:46:08 +0000 (11:46 +1100)
But make sure it is something python can handle.

Signed-off-by: NeilBrown <neil@brown.name>
core.h
lang-python.c

diff --git a/core.h b/core.h
index 02faa1e662edd043db1271ffcd034309eddd5493..76cdabb5f80fd4d13b5a5e0899427a06e27e2508 100644 (file)
--- a/core.h
+++ b/core.h
@@ -148,6 +148,7 @@ struct mark {
                                         * a char
                                         */
        MARK_DATA_PTR           *mdata;
+       void                    *mtype; /* can be used to validate type of mdata */
 };
 
 /* A point uses this for the mdata */
index 9372ed439831f9aa6974f92c4f5e5e2a3e90c474..b6f95de6a02e28badf7c67693393fd390fcdca02 100644 (file)
@@ -36,7 +36,7 @@
 
 #include <Python.h>
 #include <structmember.h>
-
+#define MARK_DATA_PTR PyObject
 #include "core.h"
 
 PyObject *Edlib_CommandFailed;
@@ -662,6 +662,44 @@ static int mark_nosetview(Mark *m, PyObject *v, void *which)
        return -1;
 }
 
+static PyObject *mark_getdata(Mark *m, void *x)
+{
+       PyObject *ret;
+       if (m->mark == NULL) {
+               PyErr_SetString(PyExc_TypeError, "Mark is NULL");
+               return NULL;
+       }
+       if (m->mark->mtype != &MarkType)
+               ret = Py_None;
+       else
+               ret = m->mark->mdata;
+       Py_INCREF(ret);
+       return ret;
+}
+
+static int mark_setdata(Mark *m, PyObject *v, void *x)
+{
+       if (m->mark == NULL) {
+               PyErr_SetString(PyExc_TypeError, "Mark is NULL");
+               return -1;
+       }
+       if (m->mark->mdata && m->mark->mtype != &MarkType) {
+               PyErr_SetString(PyExc_TypeError, "Mark contains non-pythonic data");
+               return -1;
+       }
+       if (m->mark->mdata)
+               Py_DECREF(m->mark->mdata);
+       if (v == Py_None) {
+               m->mark->mtype = NULL;
+               m->mark->mdata = NULL;
+       } else {
+               Py_INCREF(v);
+               m->mark->mdata = v;
+               m->mark->mtype = &MarkType;
+       }
+       return 0;
+}
+
 PyObject *mark_compare(Mark *a, Mark *b, int op)
 {
        int ret = 0;
@@ -713,6 +751,9 @@ static PyGetSetDef mark_getseters[] = {
     {"viewnum",
      (getter)mark_getview, (setter)mark_nosetview,
      "Index for view list", NULL},
+    {"data",
+     (getter)mark_getdata, (setter)mark_setdata,
+     "Application data", NULL},
     {NULL}  /* Sentinel */
 };