py_term.h 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. #ifndef _PY_TERM_OBJ_H
  2. #define _PY_TERM_OBJ_H
  3. #define PY_SSIZE_T_CLEAN
  4. #include <Python.h>
  5. #include <structmember.h>
  6. #include "term.h"
  7. #include "py_namespace.h"
  8. typedef struct {
  9. PyObject_HEAD
  10. LSUP_Term * ob_struct;
  11. } TermObject;
  12. static int
  13. Term_init (TermObject *self, PyObject *args, PyObject *kwargs)
  14. {
  15. unsigned char term_type;
  16. char *data = NULL, *datatype = NULL, *lang = NULL;
  17. static char *kwlist[] = {"", "", "datatype", "lang", NULL};
  18. if (!PyArg_ParseTupleAndKeywords (
  19. args, kwargs, "bs|zz", kwlist,
  20. &term_type, &data, &datatype, &lang))
  21. return -1;
  22. char *metadata = datatype ? datatype : lang;
  23. self->ob_struct = LSUP_term_new (
  24. (LSUP_TermType) term_type, data, metadata);
  25. if (!self->ob_struct) {
  26. PyErr_SetString (PyExc_ValueError, "Could not create term.");
  27. return -1;
  28. }
  29. return 0;
  30. }
  31. static int
  32. Term_iriref_init (TermObject *self, PyObject *args, PyObject *kwargs)
  33. {
  34. char *data = NULL;
  35. NSMapObject *nsm = NULL;
  36. static char *kwlist[] = {"data", "nsm", NULL};
  37. if (!PyArg_ParseTupleAndKeywords (
  38. args, kwargs, "|sO", kwlist, &data, &nsm))
  39. return -1;
  40. if (nsm && !PyObject_TypeCheck (nsm, &NSMapType)) {
  41. PyErr_SetString (PyExc_TypeError, "nsm is not a NSMap type.");
  42. return -1;
  43. }
  44. self->ob_struct = LSUP_iriref_new (
  45. data, (nsm ? nsm->ob_struct : NULL));
  46. if (!self->ob_struct) {
  47. PyErr_SetString (PyExc_ValueError, "Could not create term.");
  48. return -1;
  49. }
  50. return 0;
  51. }
  52. static int
  53. Term_literal_init (TermObject *self, PyObject *args, PyObject *kwargs)
  54. {
  55. char *data = NULL, *datatype = NULL, *lang = NULL;
  56. static char *kwlist[] = {"", "datatype", "lang", NULL};
  57. if (!PyArg_ParseTupleAndKeywords (
  58. args, kwargs, "s|zz", kwlist, &data, &datatype, &lang))
  59. return -1;
  60. if (lang)
  61. self->ob_struct = LSUP_lt_literal_new (data, lang);
  62. else {
  63. LSUP_Term *dtype = (datatype) ? LSUP_iriref_new (datatype, NULL) : NULL;
  64. self->ob_struct = LSUP_literal_new (data, dtype);
  65. }
  66. if (!self->ob_struct) {
  67. PyErr_SetString (PyExc_ValueError, "Could not create term.");
  68. return -1;
  69. }
  70. return 0;
  71. }
  72. static int
  73. Term_bnode_init (TermObject *self, PyObject *args, PyObject *kwargs)
  74. {
  75. char *data;
  76. static char *kwlist[] = {"data", NULL};
  77. if (!PyArg_ParseTupleAndKeywords (args, kwargs, "|s", kwlist, &data))
  78. return -1;
  79. self->ob_struct = LSUP_term_new (LSUP_TERM_BNODE, data, NULL);
  80. if (!self->ob_struct) {
  81. PyErr_SetString (PyExc_ValueError, "Could not create term.");
  82. return -1;
  83. }
  84. return 0;
  85. }
  86. static void
  87. Term_dealloc (TermObject *self)
  88. {
  89. LSUP_term_free (self->ob_struct);
  90. Py_TYPE (self)->tp_free ((PyObject *) self);
  91. }
  92. static PyObject *
  93. Term_get_type (TermObject *self, void *closure)
  94. {
  95. return PyLong_FromLong (self->ob_struct->type);
  96. }
  97. static PyObject *
  98. Term_get_data (TermObject *self, void *closure)
  99. { return PyUnicode_FromString (self->ob_struct->data); }
  100. static PyObject *
  101. Term_iriref_get_nsm (TermObject *self, void *closure)
  102. {
  103. LSUP_Term *term = self->ob_struct;
  104. if (!LSUP_IS_IRI(term))
  105. Py_RETURN_NONE;
  106. LSUP_NSMap *nsm = LSUP_iriref_nsm (term);
  107. if (!nsm) Py_RETURN_NONE;
  108. NSMapObject *nsm_obj = PyObject_New (NSMapObject, &NSMapType);
  109. if (UNLIKELY (!nsm_obj)) return PyErr_NoMemory();
  110. nsm_obj->ob_struct = nsm;
  111. Py_INCREF (nsm_obj);
  112. return (PyObject *) nsm_obj;
  113. }
  114. static PyObject *
  115. Term_iriref_get_prefix (TermObject *self, void *closure)
  116. {
  117. LSUP_Term *term = self->ob_struct;
  118. if (! LSUP_IS_IRI (term))
  119. Py_RETURN_NONE;
  120. return PyUnicode_FromString (LSUP_iriref_prefix (term));
  121. }
  122. static PyObject *
  123. Term_iriref_get_path (TermObject *self, void *closure)
  124. {
  125. LSUP_Term *term = self->ob_struct;
  126. if (! LSUP_IS_IRI (term))
  127. Py_RETURN_NONE;
  128. return PyUnicode_FromString (LSUP_iriref_path (term));
  129. }
  130. static PyObject *
  131. Term_iriref_get_frag (TermObject *self, void *closure)
  132. {
  133. LSUP_Term *term = self->ob_struct;
  134. if (! LSUP_IS_IRI (term))
  135. Py_RETURN_NONE;
  136. return PyUnicode_FromString (LSUP_iriref_frag (term));
  137. }
  138. static PyObject *
  139. Term_lit_get_datatype (TermObject *self, void *closure)
  140. {
  141. if (!self->ob_struct->datatype) Py_RETURN_NONE;
  142. char *dtype_data =
  143. self->ob_struct->type == LSUP_TERM_LT_LITERAL ? DEFAULT_DTYPE :
  144. self->ob_struct->datatype->data;
  145. TermObject *datatype = (TermObject *) Py_TYPE (self)->tp_alloc (
  146. Py_TYPE (self), 0);
  147. if (!datatype) return PyErr_NoMemory();
  148. datatype->ob_struct = LSUP_iriref_new (dtype_data, NULL);
  149. Py_INCREF (datatype);
  150. return (PyObject *) datatype;
  151. }
  152. static PyObject *
  153. Term_lit_get_lang (TermObject *self, void *closure)
  154. {
  155. if (
  156. self->ob_struct->type != LSUP_TERM_LT_LITERAL
  157. || self->ob_struct->lang[0] == '\0')
  158. Py_RETURN_NONE;
  159. return PyUnicode_FromString (self->ob_struct->lang);
  160. }
  161. static PyGetSetDef Term_getsetters[] = {
  162. {"_type", (getter) Term_get_type, NULL, "Term type.", NULL},
  163. {"_data", (getter) Term_get_data, NULL, "Term data.", NULL},
  164. {
  165. "_nsm", (getter) Term_iriref_get_nsm,
  166. NULL, "IRI ref namespace map.", NULL
  167. },
  168. {
  169. "_prefix", (getter) Term_iriref_get_prefix,
  170. NULL, "IRI ref prefix.", NULL
  171. },
  172. {
  173. "_path", (getter) Term_iriref_get_path,
  174. NULL, "IRI ref path after prefix.", NULL
  175. },
  176. {
  177. "_frag", (getter) Term_iriref_get_frag,
  178. NULL, "IRI ref fragment.", NULL
  179. },
  180. {
  181. "_datatype", (getter) Term_lit_get_datatype,
  182. NULL, "Literal term data type.", NULL
  183. },
  184. {
  185. "_lang", (getter) Term_lit_get_lang,
  186. NULL, "Literal term language tag.", NULL
  187. },
  188. {NULL}
  189. };
  190. static PyGetSetDef IRIRef_getsetters[] = {
  191. {"data", (getter) Term_get_data, NULL, "IRI string.", NULL},
  192. {
  193. "nsm", (getter) Term_iriref_get_nsm,
  194. NULL, "Namespace map.", NULL
  195. },
  196. {
  197. "prefix", (getter) Term_iriref_get_prefix,
  198. NULL, "IRI ref prefix.", NULL
  199. },
  200. {
  201. "path", (getter) Term_iriref_get_path,
  202. NULL, "IRI ref path after prefix.", NULL
  203. },
  204. {
  205. "frag", (getter) Term_iriref_get_frag,
  206. NULL, "IRI ref fragment.", NULL
  207. },
  208. {NULL}
  209. };
  210. static PyGetSetDef Literal_getsetters[] = {
  211. {"data", (getter) Term_get_data, NULL, "Literal data.", NULL},
  212. {
  213. "datatype", (getter) Term_lit_get_datatype,
  214. NULL, "Data type.", NULL
  215. },
  216. {
  217. "lang", (getter) Term_lit_get_lang,
  218. NULL, "Language tag.", NULL
  219. },
  220. {NULL}
  221. };
  222. static PyGetSetDef BNode_getsetters[] = {
  223. {"data", (getter) Term_get_data, NULL, "Blank node label.", NULL},
  224. {NULL}
  225. };
  226. static PyObject *
  227. Term_richcmp (PyObject *obj1, PyObject *obj2, int op);
  228. static Py_hash_t
  229. Term_hash (PyObject *self)
  230. { return LSUP_term_hash (((TermObject *)self)->ob_struct); }
  231. PyTypeObject TermType = {
  232. PyVarObject_HEAD_INIT(NULL, 0)
  233. .tp_name = "term.Term",
  234. .tp_doc = "RDF term",
  235. .tp_basicsize = sizeof (TermObject),
  236. .tp_itemsize = 0,
  237. .tp_flags = Py_TPFLAGS_DEFAULT,
  238. .tp_new = PyType_GenericNew,
  239. .tp_init = (initproc) Term_init,
  240. .tp_dealloc = (destructor) Term_dealloc,
  241. .tp_getset = Term_getsetters,
  242. .tp_richcompare = Term_richcmp,
  243. .tp_hash = Term_hash,
  244. };
  245. PyTypeObject IRIRefType = {
  246. PyVarObject_HEAD_INIT(NULL, 0)
  247. .tp_name = "term.IRIRef",
  248. .tp_doc = "RDF IRI reference.",
  249. .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
  250. .tp_base = &TermType,
  251. .tp_init = (initproc) Term_iriref_init,
  252. .tp_getset = IRIRef_getsetters,
  253. };
  254. PyTypeObject LiteralType = {
  255. PyVarObject_HEAD_INIT(NULL, 0)
  256. .tp_name = "term.Literal",
  257. .tp_doc = "RDF Literal.",
  258. .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
  259. .tp_base = &TermType,
  260. .tp_init = (initproc) Term_literal_init,
  261. .tp_getset = Literal_getsetters,
  262. };
  263. PyTypeObject BNodeType = {
  264. PyVarObject_HEAD_INIT(NULL, 0)
  265. .tp_name = "term.BNode",
  266. .tp_doc = "RDF Blanbk Node.",
  267. .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
  268. .tp_base = &TermType,
  269. .tp_init = (initproc) Term_bnode_init,
  270. .tp_getset = BNode_getsetters,
  271. };
  272. static PyObject *
  273. Term_richcmp (PyObject *obj1, PyObject *obj2, int op)
  274. {
  275. PyObject *result = NULL;
  276. if (
  277. ! PyObject_TypeCheck (obj1, &TermType) ||
  278. ! PyObject_TypeCheck (obj2, &TermType)
  279. ) return NULL;
  280. int c = 0;
  281. LSUP_Term *t1 = ((TermObject *) obj1)->ob_struct;
  282. LSUP_Term *t2 = ((TermObject *) obj2)->ob_struct;
  283. switch (op) {
  284. case Py_LT: result = Py_NotImplemented; break;
  285. case Py_LE: result = Py_NotImplemented; break;
  286. case Py_EQ: c = LSUP_term_equals (t1, t2); break;
  287. case Py_NE: c = ! LSUP_term_equals (t1, t2); break;
  288. case Py_GT: result = Py_NotImplemented; break;
  289. case Py_GE: result = Py_NotImplemented; break;
  290. }
  291. if (!result) result = c ? Py_True : Py_False;
  292. Py_INCREF(result);
  293. return result;
  294. }
  295. // END _PY_TERM_OBJ_H
  296. #endif