From: NeilBrown Date: Mon, 25 Jan 2016 00:43:25 +0000 (+1100) Subject: python: provide access to a mark's mdata X-Git-Tag: lca2016~15 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=6da477eb523ed962fe0c64e8a18db890900f0db7;p=edlib.git python: provide access to a mark's mdata But make sure it is something python can handle. Signed-off-by: NeilBrown --- diff --git a/core.h b/core.h index 02faa1e6..76cdabb5 100644 --- 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 */ diff --git a/lang-python.c b/lang-python.c index 9372ed43..b6f95de6 100644 --- a/lang-python.c +++ b/lang-python.c @@ -36,7 +36,7 @@ #include #include - +#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 */ };