|
@@ -7,6 +7,7 @@
|
|
#include <structmember.h>
|
|
#include <structmember.h>
|
|
|
|
|
|
#include "term.h"
|
|
#include "term.h"
|
|
|
|
+#include "py_namespace.h"
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
typedef struct {
|
|
@@ -40,6 +41,93 @@ Term_init (TermObject *self, PyObject *args, PyObject *kwargs)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+Term_iriref_init (TermObject *self, PyObject *args, PyObject *kwargs)
|
|
|
|
+{
|
|
|
|
+ char *data = NULL;
|
|
|
|
+ LSUP_NSMap *nsm = NULL;
|
|
|
|
+
|
|
|
|
+ static char *kwlist[] = {"data", "nsm", NULL};
|
|
|
|
+
|
|
|
|
+ if (!PyArg_ParseTupleAndKeywords (
|
|
|
|
+ args, kwargs, "|sO", kwlist, &data, &nsm))
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ if (nsm && !PyObject_TypeCheck (nsm, &NSMapType)) {
|
|
|
|
+ PyErr_SetString (PyExc_TypeError, "nsm is not a NSMap type.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // TODO Add nsm parameter.
|
|
|
|
+ self->ob_struct = LSUP_uri_new (data);
|
|
|
|
+ if (!self->ob_struct) {
|
|
|
|
+ PyErr_SetString (PyExc_ValueError, "Could not create term.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+Term_literal_init (TermObject *self, PyObject *args, PyObject *kwargs)
|
|
|
|
+{
|
|
|
|
+ char *data = NULL, *datatype = NULL;
|
|
|
|
+
|
|
|
|
+ static char *kwlist[] = {"", "datatype", NULL};
|
|
|
|
+
|
|
|
|
+ if (!PyArg_ParseTupleAndKeywords (
|
|
|
|
+ args, kwargs, "s|z", kwlist, &data, &datatype))
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ self->ob_struct = LSUP_term_new (LSUP_TERM_LITERAL, data, datatype);
|
|
|
|
+ if (!self->ob_struct) {
|
|
|
|
+ PyErr_SetString (PyExc_ValueError, "Could not create term.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+Term_lt_literal_init (TermObject *self, PyObject *args, PyObject *kwargs)
|
|
|
|
+{
|
|
|
|
+ char *data = NULL, *lang = NULL;
|
|
|
|
+
|
|
|
|
+ if (!PyArg_ParseTuple (args, "sz", &data, &lang))
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ self->ob_struct = LSUP_term_new (LSUP_TERM_LT_LITERAL, data, lang);
|
|
|
|
+ if (!self->ob_struct) {
|
|
|
|
+ PyErr_SetString (PyExc_ValueError, "Could not create term.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static int
|
|
|
|
+Term_bnode_init (TermObject *self, PyObject *args, PyObject *kwargs)
|
|
|
|
+{
|
|
|
|
+ char *data;
|
|
|
|
+ static char *kwlist[] = {"data", NULL};
|
|
|
|
+
|
|
|
|
+ if (!PyArg_ParseTupleAndKeywords (args, kwargs, "|s", kwlist, &data))
|
|
|
|
+ return -1;
|
|
|
|
+
|
|
|
|
+ self->ob_struct = LSUP_term_new (LSUP_TERM_BNODE, data, NULL);
|
|
|
|
+ if (!self->ob_struct) {
|
|
|
|
+ PyErr_SetString (PyExc_ValueError, "Could not create term.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
static void
|
|
static void
|
|
Term_dealloc (TermObject *self)
|
|
Term_dealloc (TermObject *self)
|
|
{
|
|
{
|
|
@@ -82,6 +170,20 @@ Term_get_datatype (TermObject *self, void *closure)
|
|
return datatype;
|
|
return datatype;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * This is the same value for all language-tagged literals.
|
|
|
|
+ */
|
|
|
|
+static PyObject *
|
|
|
|
+LTLiteral_get_datatype (TermObject *self, void *closure)
|
|
|
|
+{
|
|
|
|
+ const LSUP_Term *dtype = LSUP_default_datatype;
|
|
|
|
+
|
|
|
|
+ PyObject *datatype = PyUnicode_FromString (dtype->data);
|
|
|
|
+
|
|
|
|
+ Py_INCREF (datatype);
|
|
|
|
+ return datatype;
|
|
|
|
+}
|
|
|
|
+
|
|
static PyObject *
|
|
static PyObject *
|
|
Term_get_lang (TermObject *self, void *closure)
|
|
Term_get_lang (TermObject *self, void *closure)
|
|
{
|
|
{
|
|
@@ -98,20 +200,56 @@ Term_get_lang (TermObject *self, void *closure)
|
|
|
|
|
|
|
|
|
|
static PyGetSetDef Term_getsetters[] = {
|
|
static PyGetSetDef Term_getsetters[] = {
|
|
- {"type", (getter) Term_get_type, NULL, "Term type.", NULL},
|
|
|
|
- {"data", (getter) Term_get_data, NULL, "Term data.", NULL},
|
|
|
|
|
|
+ {"_type", (getter) Term_get_type, NULL, "Term type.", NULL},
|
|
|
|
+ {"_data", (getter) Term_get_data, NULL, "Term data.", NULL},
|
|
{
|
|
{
|
|
- "datatype", (getter) Term_get_datatype,
|
|
|
|
|
|
+ "_datatype", (getter) Term_get_datatype,
|
|
NULL, "Literal term data type.", NULL
|
|
NULL, "Literal term data type.", NULL
|
|
},
|
|
},
|
|
{
|
|
{
|
|
- "lang", (getter) Term_get_lang,
|
|
|
|
|
|
+ "_lang", (getter) Term_get_lang,
|
|
NULL, "Literal term language tag.", NULL
|
|
NULL, "Literal term language tag.", NULL
|
|
},
|
|
},
|
|
{NULL}
|
|
{NULL}
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
+static PyGetSetDef IRIRef_getsetters[] = {
|
|
|
|
+ {"data", (getter) Term_get_data, NULL, "IRI string.", NULL},
|
|
|
|
+ {NULL}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static PyGetSetDef Literal_getsetters[] = {
|
|
|
|
+ {"data", (getter) Term_get_data, NULL, "Literal data.", NULL},
|
|
|
|
+ {
|
|
|
|
+ "datatype", (getter) Term_get_datatype,
|
|
|
|
+ NULL, "Data type.", NULL
|
|
|
|
+ },
|
|
|
|
+ {NULL}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static PyGetSetDef LTLiteral_getsetters[] = {
|
|
|
|
+ {"data", (getter) Term_get_data, NULL, "Literal data.", NULL},
|
|
|
|
+ {
|
|
|
|
+ "datatype", (getter) LTLiteral_get_datatype,
|
|
|
|
+ NULL, "Data type.", NULL
|
|
|
|
+ },
|
|
|
|
+ {
|
|
|
|
+ "lang", (getter) Term_get_lang,
|
|
|
|
+ NULL, "Language tag.", NULL
|
|
|
|
+ },
|
|
|
|
+ {NULL}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+static PyGetSetDef BNode_getsetters[] = {
|
|
|
|
+ {"data", (getter) Term_get_data, NULL, "Blank node label.", NULL},
|
|
|
|
+ {NULL}
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
static PyObject *
|
|
static PyObject *
|
|
Term_richcmp (PyObject *obj1, PyObject *obj2, int op);
|
|
Term_richcmp (PyObject *obj1, PyObject *obj2, int op);
|
|
|
|
|
|
@@ -137,6 +275,50 @@ PyTypeObject TermType = {
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
+PyTypeObject IRIRefType = {
|
|
|
|
+ PyVarObject_HEAD_INIT(NULL, 0)
|
|
|
|
+ .tp_name = "term.IRIRef",
|
|
|
|
+ .tp_doc = "RDF IRI reference.",
|
|
|
|
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
|
|
|
+ .tp_base = &TermType,
|
|
|
|
+ .tp_init = (initproc) Term_iriref_init,
|
|
|
|
+ .tp_getset = IRIRef_getsetters,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+PyTypeObject LiteralType = {
|
|
|
|
+ PyVarObject_HEAD_INIT(NULL, 0)
|
|
|
|
+ .tp_name = "term.Literal",
|
|
|
|
+ .tp_doc = "RDF Literal.",
|
|
|
|
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
|
|
|
+ .tp_base = &TermType,
|
|
|
|
+ .tp_init = (initproc) Term_literal_init,
|
|
|
|
+ .tp_getset = Literal_getsetters,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+PyTypeObject LTLiteralType = {
|
|
|
|
+ PyVarObject_HEAD_INIT(NULL, 0)
|
|
|
|
+ .tp_name = "term.LTLiteral",
|
|
|
|
+ .tp_doc = "RDF language-tagged Literal.",
|
|
|
|
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
|
|
|
+ .tp_base = &LiteralType,
|
|
|
|
+ .tp_init = (initproc) Term_lt_literal_init,
|
|
|
|
+ .tp_getset = LTLiteral_getsetters,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+PyTypeObject BNodeType = {
|
|
|
|
+ PyVarObject_HEAD_INIT(NULL, 0)
|
|
|
|
+ .tp_name = "term.BNode",
|
|
|
|
+ .tp_doc = "RDF Blanbk Node.",
|
|
|
|
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
|
|
|
|
+ .tp_base = &TermType,
|
|
|
|
+ .tp_init = (initproc) Term_bnode_init,
|
|
|
|
+ .tp_getset = BNode_getsetters,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+
|
|
static PyObject *
|
|
static PyObject *
|
|
Term_richcmp (PyObject *obj1, PyObject *obj2, int op)
|
|
Term_richcmp (PyObject *obj1, PyObject *obj2, int op)
|
|
{
|
|
{
|