From: NeilBrown Date: Mon, 25 Jan 2016 05:58:44 +0000 (+1100) Subject: Python: add interface to access attributes of mark via subscripts X-Git-Tag: lca2016~4 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=290292f03688ed0cf4dc0247e541c6056395c4ed;p=edlib.git Python: add interface to access attributes of mark via subscripts Signed-off-by: NeilBrown --- diff --git a/lang-python.c b/lang-python.c index 665a0226..c309eb74 100644 --- a/lang-python.c +++ b/lang-python.c @@ -859,6 +859,52 @@ static PyMethodDef mark_methods[] = { {NULL} }; +static PyObject *mark_get_item(Mark *self, PyObject *key) +{ + char *k, *v; + if (!self->mark) { + PyErr_SetString(PyExc_TypeError, "Mark is NULL"); + return NULL; + } + if (!PyString_Check(key)) { + PyErr_SetString(PyExc_TypeError, "Key must be a string"); + return NULL; + } + k = PyString_AsString(key); + v = attr_get_str(self->mark->attrs, k, -1); + if (v) + return Py_BuildValue("s", v); + Py_INCREF(Py_None); + return Py_None; +} + +static int mark_set_item(Mark *self, PyObject *key, PyObject *val) +{ + char *k, *v; + if (!self->mark) { + PyErr_SetString(PyExc_TypeError, "Mark is NULL"); + return -1; + } + if (!PyString_Check(key)) { + PyErr_SetString(PyExc_TypeError, "Key must be a string"); + return -1; + } + if (!PyString_Check(val)) { + PyErr_SetString(PyExc_TypeError, "value must be a string"); + return -1; + } + k = PyString_AsString(key); + v = PyString_AsString(val); + attr_set_str(&self->mark->attrs, k, v, -1); + return 0; +} + +static PyMappingMethods mark_mapping = { + .mp_length = NULL, + .mp_subscript = (binaryfunc)mark_get_item, + .mp_ass_subscript = (objobjargproc)mark_set_item, +}; + static PyTypeObject MarkType = { PyObject_HEAD_INIT(NULL) 0, /*ob_size*/ @@ -873,7 +919,7 @@ static PyTypeObject MarkType = { 0, /*tp_repr*/ 0, /*tp_as_number*/ 0, /*tp_as_sequence*/ - 0, /*tp_as_mapping*/ + &mark_mapping, /*tp_as_mapping*/ 0, /*tp_hash */ 0, /*tp_call*/ 0, /*tp_str*/