blob: 8a6a9a0e3f048ff07f4b975094c5ccf5f93d140e [file] [log] [blame]
Daniel Veillard3ce52572002-02-03 15:08:05 +00001/*
2 * types.c: converter functions between the internal representation
3 * and the Python objects
4 *
5 * See Copyright for the status of this software.
6 *
7 * daniel@veillard.com
8 */
9#include "libxml_wrap.h"
10
11PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000012libxml_intWrap(int val)
13{
Daniel Veillard3ce52572002-02-03 15:08:05 +000014 PyObject *ret;
15
16#ifdef DEBUG
17 printf("libxml_intWrap: val = %d\n", val);
18#endif
19 ret = PyInt_FromLong((long) val);
Daniel Veillardd2379012002-03-15 22:24:56 +000020 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000021}
22
23PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000024libxml_longWrap(long val)
25{
Daniel Veillard4e1b26c2002-02-03 20:13:06 +000026 PyObject *ret;
27
28#ifdef DEBUG
29 printf("libxml_longWrap: val = %ld\n", val);
30#endif
31 ret = PyInt_FromLong(val);
Daniel Veillardd2379012002-03-15 22:24:56 +000032 return (ret);
Daniel Veillard4e1b26c2002-02-03 20:13:06 +000033}
34
35PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000036libxml_doubleWrap(double val)
37{
Daniel Veillard3ce52572002-02-03 15:08:05 +000038 PyObject *ret;
39
40#ifdef DEBUG
41 printf("libxml_doubleWrap: val = %f\n", val);
42#endif
43 ret = PyFloat_FromDouble((double) val);
Daniel Veillardd2379012002-03-15 22:24:56 +000044 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000045}
46
47PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000048libxml_charPtrWrap(char *str)
49{
Daniel Veillard3ce52572002-02-03 15:08:05 +000050 PyObject *ret;
51
52#ifdef DEBUG
53 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
54#endif
55 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000056 Py_INCREF(Py_None);
57 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +000058 }
59 /* TODO: look at deallocation */
60 ret = PyString_FromString(str);
61 xmlFree(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000062 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000063}
64
65PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000066libxml_charPtrConstWrap(const char *str)
67{
Daniel Veillardc575b992002-02-08 13:28:40 +000068 PyObject *ret;
69
70#ifdef DEBUG
71 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
72#endif
73 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000074 Py_INCREF(Py_None);
75 return (Py_None);
Daniel Veillardc575b992002-02-08 13:28:40 +000076 }
77 /* TODO: look at deallocation */
78 ret = PyString_FromString(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000079 return (ret);
Daniel Veillardc575b992002-02-08 13:28:40 +000080}
81
82PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000083libxml_xmlCharPtrWrap(xmlChar * str)
84{
Daniel Veillard3ce52572002-02-03 15:08:05 +000085 PyObject *ret;
86
87#ifdef DEBUG
88 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
89#endif
90 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000091 Py_INCREF(Py_None);
92 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +000093 }
94 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +000095 ret = PyString_FromString((char *) str);
Daniel Veillard3ce52572002-02-03 15:08:05 +000096 xmlFree(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000097 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000098}
99
100PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000101libxml_xmlCharPtrConstWrap(const xmlChar * str)
102{
Daniel Veillardc575b992002-02-08 13:28:40 +0000103 PyObject *ret;
104
105#ifdef DEBUG
106 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
107#endif
108 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000109 Py_INCREF(Py_None);
110 return (Py_None);
Daniel Veillardc575b992002-02-08 13:28:40 +0000111 }
112 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000113 ret = PyString_FromString((char *) str);
114 return (ret);
Daniel Veillardc575b992002-02-08 13:28:40 +0000115}
116
117PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000118libxml_constcharPtrWrap(const char *str)
119{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000120 PyObject *ret;
121
122#ifdef DEBUG
123 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
124#endif
125 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000126 Py_INCREF(Py_None);
127 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000128 }
129 /* TODO: look at deallocation */
130 ret = PyString_FromString(str);
Daniel Veillardd2379012002-03-15 22:24:56 +0000131 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000132}
133
134PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000135libxml_constxmlCharPtrWrap(const xmlChar * str)
136{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000137 PyObject *ret;
138
139#ifdef DEBUG
140 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
141#endif
142 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000143 Py_INCREF(Py_None);
144 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000145 }
146 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000147 ret = PyString_FromString((char *) str);
148 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000149}
150
151PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000152libxml_xmlDocPtrWrap(xmlDocPtr doc)
153{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000154 PyObject *ret;
155
156#ifdef DEBUG
157 printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);
158#endif
159 if (doc == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000160 Py_INCREF(Py_None);
161 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000162 }
163 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000164 ret =
165 PyCObject_FromVoidPtrAndDesc((void *) doc, (char *) "xmlDocPtr",
166 NULL);
167 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000168}
169
170PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000171libxml_xmlNodePtrWrap(xmlNodePtr node)
172{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000173 PyObject *ret;
174
175#ifdef DEBUG
176 printf("libxml_xmlNodePtrWrap: node = %p\n", node);
177#endif
178 if (node == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000179 Py_INCREF(Py_None);
180 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000181 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000182 ret =
183 PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "xmlNodePtr",
184 NULL);
185 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000186}
187
188PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000189libxml_xmlURIPtrWrap(xmlURIPtr uri)
190{
Daniel Veillard6361da02002-02-23 10:10:33 +0000191 PyObject *ret;
192
193#ifdef DEBUG
194 printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);
195#endif
196 if (uri == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000197 Py_INCREF(Py_None);
198 return (Py_None);
Daniel Veillard6361da02002-02-23 10:10:33 +0000199 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000200 ret =
201 PyCObject_FromVoidPtrAndDesc((void *) uri, (char *) "xmlURIPtr",
202 NULL);
203 return (ret);
Daniel Veillard6361da02002-02-23 10:10:33 +0000204}
205
206PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000207libxml_xmlNsPtrWrap(xmlNsPtr ns)
208{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000209 PyObject *ret;
210
211#ifdef DEBUG
212 printf("libxml_xmlNsPtrWrap: node = %p\n", ns);
213#endif
214 if (ns == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000215 Py_INCREF(Py_None);
216 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000217 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000218 ret =
219 PyCObject_FromVoidPtrAndDesc((void *) ns, (char *) "xmlNsPtr",
220 NULL);
221 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000222}
223
224PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000225libxml_xmlAttrPtrWrap(xmlAttrPtr attr)
226{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000227 PyObject *ret;
228
229#ifdef DEBUG
230 printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);
231#endif
232 if (attr == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000233 Py_INCREF(Py_None);
234 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000235 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000236 ret =
237 PyCObject_FromVoidPtrAndDesc((void *) attr, (char *) "xmlAttrPtr",
238 NULL);
239 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000240}
241
242PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000243libxml_xmlAttributePtrWrap(xmlAttributePtr attr)
244{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000245 PyObject *ret;
246
247#ifdef DEBUG
248 printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);
249#endif
250 if (attr == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000251 Py_INCREF(Py_None);
252 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000253 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000254 ret =
255 PyCObject_FromVoidPtrAndDesc((void *) attr,
256 (char *) "xmlAttributePtr", NULL);
257 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000258}
259
260PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000261libxml_xmlElementPtrWrap(xmlElementPtr elem)
262{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000263 PyObject *ret;
264
265#ifdef DEBUG
266 printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);
267#endif
268 if (elem == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000269 Py_INCREF(Py_None);
270 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000271 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000272 ret =
273 PyCObject_FromVoidPtrAndDesc((void *) elem,
274 (char *) "xmlElementPtr", NULL);
275 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000276}
277
278PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000279libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt)
280{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000281 PyObject *ret;
282
283#ifdef DEBUG
284 printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);
285#endif
286 if (ctxt == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000287 Py_INCREF(Py_None);
288 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000289 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000290 ret =
291 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
292 (char *) "xmlXPathContextPtr", NULL);
293 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000294}
295
296PyObject *
Daniel Veillard7db38712002-02-07 16:39:11 +0000297libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)
298{
299 PyObject *ret;
300
301#ifdef DEBUG
302 printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);
303#endif
304 if (ctxt == NULL) {
305 Py_INCREF(Py_None);
306 return (Py_None);
307 }
308 ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt,
Daniel Veillardd2379012002-03-15 22:24:56 +0000309 (char *) "xmlXPathParserContextPtr",
310 NULL);
Daniel Veillard7db38712002-02-07 16:39:11 +0000311 return (ret);
312}
313
314PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000315libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)
316{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000317 PyObject *ret;
318
319#ifdef DEBUG
320 printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);
321#endif
322 if (ctxt == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000323 Py_INCREF(Py_None);
324 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000325 }
Daniel Veillarde6227e02003-01-14 11:42:39 +0000326
Daniel Veillardd2379012002-03-15 22:24:56 +0000327 ret =
328 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
329 (char *) "xmlParserCtxtPtr", NULL);
330 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000331}
332
333PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000334libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
335{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000336 PyObject *ret;
337
338#ifdef DEBUG
339 printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);
340#endif
341 if (obj == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000342 Py_INCREF(Py_None);
343 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000344 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000345 switch (obj->type) {
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000346 case XPATH_XSLT_TREE: {
347 if ((obj->nodesetval == NULL) ||
348 (obj->nodesetval->nodeNr == 0) ||
349 (obj->nodesetval->nodeTab == NULL)) {
350 ret = PyList_New(0);
351 } else {
352 int i, len = 0;
353 xmlNodePtr node;
354
355 node = obj->nodesetval->nodeTab[0]->children;
356 while (node != NULL) {
357 len++;
358 node = node->next;
359 }
360 ret = PyList_New(len);
361 node = obj->nodesetval->nodeTab[0]->children;
362 for (i = 0;i < len;i++) {
363 PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
364 node = node->next;
365 }
366 }
367 /*
368 * Return now, do not free the object passed down
369 */
370 return (ret);
371 }
Daniel Veillard3ce52572002-02-03 15:08:05 +0000372 case XPATH_NODESET:
Daniel Veillardd2379012002-03-15 22:24:56 +0000373 if ((obj->nodesetval == NULL)
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000374 || (obj->nodesetval->nodeNr == 0)) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000375 ret = PyList_New(0);
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000376 } else {
Daniel Veillardd2379012002-03-15 22:24:56 +0000377 int i;
378 xmlNodePtr node;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000379
Daniel Veillardd2379012002-03-15 22:24:56 +0000380 ret = PyList_New(obj->nodesetval->nodeNr);
381 for (i = 0; i < obj->nodesetval->nodeNr; i++) {
382 node = obj->nodesetval->nodeTab[i];
383 /* TODO: try to cast directly to the proper node type */
384 PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
385 }
386 }
387 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000388 case XPATH_BOOLEAN:
Daniel Veillardd2379012002-03-15 22:24:56 +0000389 ret = PyInt_FromLong((long) obj->boolval);
390 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000391 case XPATH_NUMBER:
Daniel Veillardd2379012002-03-15 22:24:56 +0000392 ret = PyFloat_FromDouble(obj->floatval);
393 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000394 case XPATH_STRING:
Daniel Veillardd2379012002-03-15 22:24:56 +0000395 ret = PyString_FromString((char *) obj->stringval);
396 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000397 case XPATH_POINT:
398 case XPATH_RANGE:
399 case XPATH_LOCATIONSET:
Daniel Veillardd2379012002-03-15 22:24:56 +0000400 default:
Daniel Veillard634ec272006-02-22 15:11:32 +0000401#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000402 printf("Unable to convert XPath object type %d\n", obj->type);
Daniel Veillard634ec272006-02-22 15:11:32 +0000403#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000404 Py_INCREF(Py_None);
405 ret = Py_None;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000406 }
407 xmlXPathFreeObject(obj);
Daniel Veillardd2379012002-03-15 22:24:56 +0000408 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000409}
410
411xmlXPathObjectPtr
Daniel Veillardd2379012002-03-15 22:24:56 +0000412libxml_xmlXPathObjectPtrConvert(PyObject * obj)
413{
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000414 xmlXPathObjectPtr ret = NULL;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000415
416#ifdef DEBUG
417 printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);
418#endif
419 if (obj == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000420 return (NULL);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000421 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000422 if PyFloat_Check
423 (obj) {
424 ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));
425 } else if PyString_Check
426 (obj) {
427 xmlChar *str;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000428
Daniel Veillardd2379012002-03-15 22:24:56 +0000429 str = xmlStrndup((const xmlChar *) PyString_AS_STRING(obj),
430 PyString_GET_SIZE(obj));
431 ret = xmlXPathWrapString(str);
432 } else if PyList_Check
433 (obj) {
434 int i;
435 PyObject *node;
436 xmlNodePtr cur;
437 xmlNodeSetPtr set;
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000438
Daniel Veillardd2379012002-03-15 22:24:56 +0000439 set = xmlXPathNodeSetCreate(NULL);
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000440
Daniel Veillardd2379012002-03-15 22:24:56 +0000441 for (i = 0; i < PyList_Size(obj); i++) {
442 node = PyList_GetItem(obj, i);
443 if ((node == NULL) || (node->ob_type == NULL))
444 continue;
Daniel Veillard79426f22002-03-01 16:14:17 +0000445
Daniel Veillardd2379012002-03-15 22:24:56 +0000446 cur = NULL;
447 if (PyCObject_Check(node)) {
Daniel Veillard634ec272006-02-22 15:11:32 +0000448#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000449 printf("Got a CObject\n");
Daniel Veillard634ec272006-02-22 15:11:32 +0000450#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000451 cur = PyxmlNode_Get(node);
452 } else if (PyInstance_Check(node)) {
453 PyInstanceObject *inst = (PyInstanceObject *) node;
454 PyObject *name = inst->in_class->cl_name;
Daniel Veillard79426f22002-03-01 16:14:17 +0000455
Daniel Veillardd2379012002-03-15 22:24:56 +0000456 if PyString_Check
457 (name) {
458 char *type = PyString_AS_STRING(name);
459 PyObject *wrapper;
460
461 if (!strcmp(type, "xmlNode")) {
462 wrapper =
463 PyObject_GetAttrString(node, (char *) "_o");
464 if (wrapper != NULL) {
465 cur = PyxmlNode_Get(wrapper);
466 }
467 }
468 }
469 } else {
Daniel Veillard634ec272006-02-22 15:11:32 +0000470#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000471 printf("Unknown object in Python return list\n");
Daniel Veillard634ec272006-02-22 15:11:32 +0000472#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000473 }
474 if (cur != NULL) {
475 xmlXPathNodeSetAdd(set, cur);
476 }
477 }
478 ret = xmlXPathWrapNodeSet(set);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000479 } else {
Daniel Veillard634ec272006-02-22 15:11:32 +0000480#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000481 printf("Unable to convert Python Object to XPath");
Daniel Veillard634ec272006-02-22 15:11:32 +0000482#endif
Daniel Veillard3ce52572002-02-03 15:08:05 +0000483 }
484 Py_DECREF(obj);
Daniel Veillardd2379012002-03-15 22:24:56 +0000485 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000486}
487
Daniel Veillard7db38712002-02-07 16:39:11 +0000488PyObject *
Daniel Veillard850ce9b2004-11-10 11:55:47 +0000489libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid)
490{
491 PyObject *ret;
492
493#ifdef DEBUG
494 printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid);
495#endif
496 if (valid == NULL) {
497 Py_INCREF(Py_None);
498 return (Py_None);
499 }
500
501 ret =
502 PyCObject_FromVoidPtrAndDesc((void *) valid,
503 (char *) "xmlValidCtxtPtr", NULL);
504
505 return (ret);
506}
507
508PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000509libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal)
510{
Daniel Veillard7db38712002-02-07 16:39:11 +0000511 PyObject *ret;
512
513#ifdef DEBUG
514 printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
515#endif
516 if (catal == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000517 Py_INCREF(Py_None);
518 return (Py_None);
Daniel Veillard7db38712002-02-07 16:39:11 +0000519 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000520 ret =
521 PyCObject_FromVoidPtrAndDesc((void *) catal,
522 (char *) "xmlCatalogPtr", NULL);
523 return (ret);
Daniel Veillard7db38712002-02-07 16:39:11 +0000524}
Daniel Veillardc6d4a932002-09-12 15:00:57 +0000525
526PyObject *
527libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)
528{
529 PyObject *ret;
530
531#ifdef DEBUG
532 printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);
533#endif
534 if (buffer == NULL) {
535 Py_INCREF(Py_None);
536 return (Py_None);
537 }
538 ret =
539 PyCObject_FromVoidPtrAndDesc((void *) buffer,
540 (char *) "xmlOutputBufferPtr", NULL);
541 return (ret);
542}
543
544PyObject *
545libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)
546{
547 PyObject *ret;
548
549#ifdef DEBUG
550 printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);
551#endif
552 if (buffer == NULL) {
553 Py_INCREF(Py_None);
554 return (Py_None);
555 }
556 ret =
557 PyCObject_FromVoidPtrAndDesc((void *) buffer,
558 (char *) "xmlParserInputBufferPtr", NULL);
559 return (ret);
560}
Daniel Veillardbd9afb52002-09-25 22:25:35 +0000561
Daniel Veillard0e298ad2003-02-04 16:14:33 +0000562#ifdef LIBXML_REGEXP_ENABLED
Daniel Veillardbd9afb52002-09-25 22:25:35 +0000563PyObject *
564libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
565{
566 PyObject *ret;
567
568#ifdef DEBUG
569 printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);
570#endif
571 if (regexp == NULL) {
572 Py_INCREF(Py_None);
573 return (Py_None);
574 }
575 ret =
576 PyCObject_FromVoidPtrAndDesc((void *) regexp,
577 (char *) "xmlRegexpPtr", NULL);
578 return (ret);
579}
Daniel Veillard0e298ad2003-02-04 16:14:33 +0000580#endif /* LIBXML_REGEXP_ENABLED */
Daniel Veillard0eb38c72002-12-14 23:00:35 +0000581
582PyObject *
583libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
584{
585 PyObject *ret;
586
587#ifdef DEBUG
588 printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
589#endif
590 if (reader == NULL) {
591 Py_INCREF(Py_None);
592 return (Py_None);
593 }
594 ret =
595 PyCObject_FromVoidPtrAndDesc((void *) reader,
596 (char *) "xmlTextReaderPtr", NULL);
597 return (ret);
598}
Daniel Veillard417be3a2003-01-20 21:26:34 +0000599
600PyObject *
601libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)
602{
603 PyObject *ret;
604
605#ifdef DEBUG
606 printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);
607#endif
608 if (locator == NULL) {
609 Py_INCREF(Py_None);
610 return (Py_None);
611 }
612 ret =
613 PyCObject_FromVoidPtrAndDesc((void *) locator,
614 (char *) "xmlTextReaderLocatorPtr", NULL);
615 return (ret);
616}
617
Daniel Veillard591b4be2003-02-09 23:33:36 +0000618#ifdef LIBXML_SCHEMAS_ENABLED
619PyObject *
620libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)
621{
622 PyObject *ret;
623
624#ifdef DEBUG
625 printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);
626#endif
627 if (ctxt == NULL) {
628 Py_INCREF(Py_None);
629 return (Py_None);
630 }
631 ret =
632 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
633 (char *) "xmlRelaxNGPtr", NULL);
634 return (ret);
635}
636
637PyObject *
638libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)
639{
640 PyObject *ret;
641
642#ifdef DEBUG
643 printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);
644#endif
645 if (ctxt == NULL) {
646 Py_INCREF(Py_None);
647 return (Py_None);
648 }
649 ret =
650 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
651 (char *) "xmlRelaxNGParserCtxtPtr", NULL);
652 return (ret);
653}
654PyObject *
655libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)
656{
657 PyObject *ret;
658
659#ifdef DEBUG
660 printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);
661#endif
662 if (valid == NULL) {
663 Py_INCREF(Py_None);
664 return (Py_None);
665 }
666 ret =
667 PyCObject_FromVoidPtrAndDesc((void *) valid,
668 (char *) "xmlRelaxNGValidCtxtPtr", NULL);
669 return (ret);
670}
Daniel Veillard259f0df2004-08-18 09:13:18 +0000671
672PyObject *
673libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt)
674{
675 PyObject *ret;
676
677#ifdef DEBUG
678 printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt);
679#endif
680 if (ctxt == NULL) {
681 Py_INCREF(Py_None);
682 return (Py_None);
683 }
684 ret =
685 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
686 (char *) "xmlSchemaPtr", NULL);
687 return (ret);
688}
689
690PyObject *
691libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt)
692{
693 PyObject *ret;
694
695#ifdef DEBUG
696 printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt);
697#endif
698 if (ctxt == NULL) {
699 Py_INCREF(Py_None);
700 return (Py_None);
701 }
702 ret =
703 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
704 (char *) "xmlSchemaParserCtxtPtr", NULL);
705
706 return (ret);
707}
708
709PyObject *
710libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid)
711{
712 PyObject *ret;
713
714#ifdef DEBUG
715 printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid);
716#endif
717 if (valid == NULL) {
718 Py_INCREF(Py_None);
719 return (Py_None);
720 }
721
722 ret =
723 PyCObject_FromVoidPtrAndDesc((void *) valid,
724 (char *) "xmlSchemaValidCtxtPtr", NULL);
725
726 return (ret);
727}
Daniel Veillard591b4be2003-02-09 23:33:36 +0000728#endif /* LIBXML_SCHEMAS_ENABLED */
Daniel Veillard46da4642004-01-06 22:54:57 +0000729
730PyObject *
731libxml_xmlErrorPtrWrap(xmlErrorPtr error)
732{
733 PyObject *ret;
734
735#ifdef DEBUG
736 printf("libxml_xmlErrorPtrWrap: error = %p\n", error);
737#endif
738 if (error == NULL) {
739 Py_INCREF(Py_None);
740 return (Py_None);
741 }
742 ret =
743 PyCObject_FromVoidPtrAndDesc((void *) error,
744 (char *) "xmlErrorPtr", NULL);
745 return (ret);
746}