mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-21 17:12:50 -06:00
Add categoryContext function
This commit is contained in:
@@ -1897,6 +1897,47 @@ PGF_getCategories(PGFObject *self, void *closure)
|
|||||||
return categories;
|
return categories;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static PyObject*
|
||||||
|
PGF_categoryContext(PGFObject *self, PyObject *args)
|
||||||
|
{
|
||||||
|
const char *s;
|
||||||
|
Py_ssize_t size;
|
||||||
|
if (!PyArg_ParseTuple(args, "s#", &s, &size))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
PgfText *catname = (PgfText *)PyMem_Malloc(sizeof(PgfText)+size+1);
|
||||||
|
memcpy(catname->text, s, size+1);
|
||||||
|
catname->size = size;
|
||||||
|
|
||||||
|
PgfExn err;
|
||||||
|
size_t n_hypos;
|
||||||
|
PgfTypeHypo *hypos = pgf_category_context(self->db, self->revision, catname, &n_hypos, &unmarshaller, &err);
|
||||||
|
PyMem_Free(catname);
|
||||||
|
if (handleError(err) != PGF_EXN_NONE) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
PyObject *contexts = PyList_New(n_hypos);
|
||||||
|
if (contexts == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (size_t i = 0; i < n_hypos; i++) {
|
||||||
|
PyObject *tup = PyTuple_New(3);
|
||||||
|
PyTuple_SetItem(tup, 0, PyLong_FromLong(hypos[i].bind_type));
|
||||||
|
PyTuple_SetItem(tup, 1, PyUnicode_FromStringAndSize(hypos[i].cid->text, hypos[i].cid->size));
|
||||||
|
PyTuple_SetItem(tup, 2, (PyObject *)hypos[i].type);
|
||||||
|
Py_INCREF(hypos[i].type);
|
||||||
|
PyList_SetItem(contexts, i, tup);
|
||||||
|
}
|
||||||
|
if (PyErr_Occurred()) {
|
||||||
|
Py_DECREF(contexts);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return contexts;
|
||||||
|
}
|
||||||
|
|
||||||
static TypeObject *
|
static TypeObject *
|
||||||
PGF_getStartCat(PGFObject *self, void *closure)
|
PGF_getStartCat(PGFObject *self, void *closure)
|
||||||
{
|
{
|
||||||
@@ -2332,6 +2373,9 @@ static PyMemberDef PGF_members[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static PyMethodDef PGF_methods[] = {
|
static PyMethodDef PGF_methods[] = {
|
||||||
|
{"categoryContext", (PyCFunction)PGF_categoryContext, METH_VARARGS,
|
||||||
|
"Returns the context for a given category"
|
||||||
|
},
|
||||||
{"functionsByCat", (PyCFunction)PGF_functionsByCat, METH_VARARGS,
|
{"functionsByCat", (PyCFunction)PGF_functionsByCat, METH_VARARGS,
|
||||||
"Returns the list of functions for a given category"
|
"Returns the list of functions for a given category"
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -83,6 +83,23 @@ def test_functionsByCat_2(PGF):
|
|||||||
def test_functionsByCat_non_existant(PGF):
|
def test_functionsByCat_non_existant(PGF):
|
||||||
assert PGF.functionsByCat("X") == []
|
assert PGF.functionsByCat("X") == []
|
||||||
|
|
||||||
|
def test_categoryContext_1(PGF):
|
||||||
|
assert PGF.categoryContext("N") == []
|
||||||
|
|
||||||
|
def test_categoryContext_2(PGF):
|
||||||
|
assert PGF.categoryContext("S") == []
|
||||||
|
|
||||||
|
def test_categoryContext_3(PGF):
|
||||||
|
cxt = PGF.categoryContext("P")
|
||||||
|
assert len(cxt) == 1
|
||||||
|
tup = cxt[0]
|
||||||
|
assert tup[0] == 0 # explicit
|
||||||
|
assert tup[1] == "_" # cid
|
||||||
|
assert tup[2] == pgf.readType("N")
|
||||||
|
|
||||||
|
def test_categoryContext_4(PGF):
|
||||||
|
assert PGF.categoryContext("X") == []
|
||||||
|
|
||||||
# types
|
# types
|
||||||
|
|
||||||
def test_readType_invalid():
|
def test_readType_invalid():
|
||||||
|
|||||||
Reference in New Issue
Block a user