blob: 54b50de205f52253bea0eb39d83dcad2e45a6291 [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"
Daniel Veillard5d279c92008-03-12 09:32:04 +000010#include <libxml/xpathInternals.h>
Daniel Veillard3ce52572002-02-03 15:08:05 +000011
12PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000013libxml_intWrap(int val)
14{
Daniel Veillard3ce52572002-02-03 15:08:05 +000015 PyObject *ret;
16
17#ifdef DEBUG
18 printf("libxml_intWrap: val = %d\n", val);
19#endif
20 ret = PyInt_FromLong((long) val);
Daniel Veillardd2379012002-03-15 22:24:56 +000021 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000022}
23
24PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000025libxml_longWrap(long val)
26{
Daniel Veillard4e1b26c2002-02-03 20:13:06 +000027 PyObject *ret;
28
29#ifdef DEBUG
30 printf("libxml_longWrap: val = %ld\n", val);
31#endif
32 ret = PyInt_FromLong(val);
Daniel Veillardd2379012002-03-15 22:24:56 +000033 return (ret);
Daniel Veillard4e1b26c2002-02-03 20:13:06 +000034}
35
36PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000037libxml_doubleWrap(double val)
38{
Daniel Veillard3ce52572002-02-03 15:08:05 +000039 PyObject *ret;
40
41#ifdef DEBUG
42 printf("libxml_doubleWrap: val = %f\n", val);
43#endif
44 ret = PyFloat_FromDouble((double) val);
Daniel Veillardd2379012002-03-15 22:24:56 +000045 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000046}
47
48PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000049libxml_charPtrWrap(char *str)
50{
Daniel Veillard3ce52572002-02-03 15:08:05 +000051 PyObject *ret;
52
53#ifdef DEBUG
54 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
55#endif
56 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000057 Py_INCREF(Py_None);
58 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +000059 }
60 /* TODO: look at deallocation */
61 ret = PyString_FromString(str);
62 xmlFree(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000063 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000064}
65
66PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000067libxml_charPtrConstWrap(const char *str)
68{
Daniel Veillardc575b992002-02-08 13:28:40 +000069 PyObject *ret;
70
71#ifdef DEBUG
72 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
73#endif
74 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000075 Py_INCREF(Py_None);
76 return (Py_None);
Daniel Veillardc575b992002-02-08 13:28:40 +000077 }
78 /* TODO: look at deallocation */
79 ret = PyString_FromString(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000080 return (ret);
Daniel Veillardc575b992002-02-08 13:28:40 +000081}
82
83PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +000084libxml_xmlCharPtrWrap(xmlChar * str)
85{
Daniel Veillard3ce52572002-02-03 15:08:05 +000086 PyObject *ret;
87
88#ifdef DEBUG
89 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
90#endif
91 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +000092 Py_INCREF(Py_None);
93 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +000094 }
95 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +000096 ret = PyString_FromString((char *) str);
Daniel Veillard3ce52572002-02-03 15:08:05 +000097 xmlFree(str);
Daniel Veillardd2379012002-03-15 22:24:56 +000098 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +000099}
100
101PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000102libxml_xmlCharPtrConstWrap(const xmlChar * str)
103{
Daniel Veillardc575b992002-02-08 13:28:40 +0000104 PyObject *ret;
105
106#ifdef DEBUG
107 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
108#endif
109 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000110 Py_INCREF(Py_None);
111 return (Py_None);
Daniel Veillardc575b992002-02-08 13:28:40 +0000112 }
113 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000114 ret = PyString_FromString((char *) str);
115 return (ret);
Daniel Veillardc575b992002-02-08 13:28:40 +0000116}
117
118PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000119libxml_constcharPtrWrap(const char *str)
120{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000121 PyObject *ret;
122
123#ifdef DEBUG
124 printf("libxml_xmlcharPtrWrap: str = %s\n", str);
125#endif
126 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000127 Py_INCREF(Py_None);
128 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000129 }
130 /* TODO: look at deallocation */
131 ret = PyString_FromString(str);
Daniel Veillardd2379012002-03-15 22:24:56 +0000132 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000133}
134
135PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000136libxml_constxmlCharPtrWrap(const xmlChar * str)
137{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000138 PyObject *ret;
139
140#ifdef DEBUG
141 printf("libxml_xmlCharPtrWrap: str = %s\n", str);
142#endif
143 if (str == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000144 Py_INCREF(Py_None);
145 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000146 }
147 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000148 ret = PyString_FromString((char *) str);
149 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000150}
151
152PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000153libxml_xmlDocPtrWrap(xmlDocPtr doc)
154{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000155 PyObject *ret;
156
157#ifdef DEBUG
158 printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);
159#endif
160 if (doc == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000161 Py_INCREF(Py_None);
162 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000163 }
164 /* TODO: look at deallocation */
Daniel Veillardd2379012002-03-15 22:24:56 +0000165 ret =
166 PyCObject_FromVoidPtrAndDesc((void *) doc, (char *) "xmlDocPtr",
167 NULL);
168 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000169}
170
171PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000172libxml_xmlNodePtrWrap(xmlNodePtr node)
173{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000174 PyObject *ret;
175
176#ifdef DEBUG
177 printf("libxml_xmlNodePtrWrap: node = %p\n", node);
178#endif
179 if (node == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000180 Py_INCREF(Py_None);
181 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000182 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000183 ret =
184 PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "xmlNodePtr",
185 NULL);
186 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000187}
188
189PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000190libxml_xmlURIPtrWrap(xmlURIPtr uri)
191{
Daniel Veillard6361da02002-02-23 10:10:33 +0000192 PyObject *ret;
193
194#ifdef DEBUG
195 printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);
196#endif
197 if (uri == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000198 Py_INCREF(Py_None);
199 return (Py_None);
Daniel Veillard6361da02002-02-23 10:10:33 +0000200 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000201 ret =
202 PyCObject_FromVoidPtrAndDesc((void *) uri, (char *) "xmlURIPtr",
203 NULL);
204 return (ret);
Daniel Veillard6361da02002-02-23 10:10:33 +0000205}
206
207PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000208libxml_xmlNsPtrWrap(xmlNsPtr ns)
209{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000210 PyObject *ret;
211
212#ifdef DEBUG
213 printf("libxml_xmlNsPtrWrap: node = %p\n", ns);
214#endif
215 if (ns == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000216 Py_INCREF(Py_None);
217 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000218 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000219 ret =
220 PyCObject_FromVoidPtrAndDesc((void *) ns, (char *) "xmlNsPtr",
221 NULL);
222 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000223}
224
225PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000226libxml_xmlAttrPtrWrap(xmlAttrPtr attr)
227{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000228 PyObject *ret;
229
230#ifdef DEBUG
231 printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);
232#endif
233 if (attr == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000234 Py_INCREF(Py_None);
235 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000236 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000237 ret =
238 PyCObject_FromVoidPtrAndDesc((void *) attr, (char *) "xmlAttrPtr",
239 NULL);
240 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000241}
242
243PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000244libxml_xmlAttributePtrWrap(xmlAttributePtr attr)
245{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000246 PyObject *ret;
247
248#ifdef DEBUG
249 printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);
250#endif
251 if (attr == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000252 Py_INCREF(Py_None);
253 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000254 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000255 ret =
256 PyCObject_FromVoidPtrAndDesc((void *) attr,
257 (char *) "xmlAttributePtr", NULL);
258 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000259}
260
261PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000262libxml_xmlElementPtrWrap(xmlElementPtr elem)
263{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000264 PyObject *ret;
265
266#ifdef DEBUG
267 printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);
268#endif
269 if (elem == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000270 Py_INCREF(Py_None);
271 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000272 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000273 ret =
274 PyCObject_FromVoidPtrAndDesc((void *) elem,
275 (char *) "xmlElementPtr", NULL);
276 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000277}
278
279PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000280libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt)
281{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000282 PyObject *ret;
283
284#ifdef DEBUG
285 printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);
286#endif
287 if (ctxt == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000288 Py_INCREF(Py_None);
289 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000290 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000291 ret =
292 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
293 (char *) "xmlXPathContextPtr", NULL);
294 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000295}
296
297PyObject *
Daniel Veillard7db38712002-02-07 16:39:11 +0000298libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)
299{
300 PyObject *ret;
301
302#ifdef DEBUG
303 printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);
304#endif
305 if (ctxt == NULL) {
306 Py_INCREF(Py_None);
307 return (Py_None);
308 }
309 ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt,
Daniel Veillardd2379012002-03-15 22:24:56 +0000310 (char *) "xmlXPathParserContextPtr",
311 NULL);
Daniel Veillard7db38712002-02-07 16:39:11 +0000312 return (ret);
313}
314
315PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000316libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)
317{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000318 PyObject *ret;
319
320#ifdef DEBUG
321 printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);
322#endif
323 if (ctxt == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000324 Py_INCREF(Py_None);
325 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000326 }
Daniel Veillarde6227e02003-01-14 11:42:39 +0000327
Daniel Veillardd2379012002-03-15 22:24:56 +0000328 ret =
329 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
330 (char *) "xmlParserCtxtPtr", NULL);
331 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000332}
333
Daniel Veillard5d279c92008-03-12 09:32:04 +0000334/**
335 * libxml_xmlXPathDestructNsNode:
336 * cobj: xmlNsPtr namespace node
337 * desc: ignored string
338 *
339 * This function is called if and when a namespace node returned in
340 * an XPath node set is to be destroyed. That's the only kind of
341 * object returned in node set not directly linked to the original
342 * xmlDoc document, see xmlXPathNodeSetDupNs.
343 */
344static void
345libxml_xmlXPathDestructNsNode(void *cobj, void *desc ATTRIBUTE_UNUSED) {
346#ifdef DEBUG
347 fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cobj);
348#endif
349 xmlXPathNodeSetFreeNs((xmlNsPtr) cobj);
350}
351
Daniel Veillard3ce52572002-02-03 15:08:05 +0000352PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000353libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
354{
Daniel Veillard3ce52572002-02-03 15:08:05 +0000355 PyObject *ret;
356
357#ifdef DEBUG
358 printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);
359#endif
360 if (obj == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000361 Py_INCREF(Py_None);
362 return (Py_None);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000363 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000364 switch (obj->type) {
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000365 case XPATH_XSLT_TREE: {
366 if ((obj->nodesetval == NULL) ||
367 (obj->nodesetval->nodeNr == 0) ||
368 (obj->nodesetval->nodeTab == NULL)) {
369 ret = PyList_New(0);
370 } else {
371 int i, len = 0;
372 xmlNodePtr node;
373
374 node = obj->nodesetval->nodeTab[0]->children;
375 while (node != NULL) {
376 len++;
377 node = node->next;
378 }
379 ret = PyList_New(len);
380 node = obj->nodesetval->nodeTab[0]->children;
381 for (i = 0;i < len;i++) {
382 PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
383 node = node->next;
384 }
385 }
386 /*
387 * Return now, do not free the object passed down
388 */
389 return (ret);
390 }
Daniel Veillard3ce52572002-02-03 15:08:05 +0000391 case XPATH_NODESET:
Daniel Veillardd2379012002-03-15 22:24:56 +0000392 if ((obj->nodesetval == NULL)
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000393 || (obj->nodesetval->nodeNr == 0)) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000394 ret = PyList_New(0);
Daniel Veillardc0ac0692002-10-20 21:31:50 +0000395 } else {
Daniel Veillardd2379012002-03-15 22:24:56 +0000396 int i;
397 xmlNodePtr node;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000398
Daniel Veillardd2379012002-03-15 22:24:56 +0000399 ret = PyList_New(obj->nodesetval->nodeNr);
400 for (i = 0; i < obj->nodesetval->nodeNr; i++) {
401 node = obj->nodesetval->nodeTab[i];
Daniel Veillard5d279c92008-03-12 09:32:04 +0000402 if (node->type == XML_NAMESPACE_DECL) {
403 PyObject *ns =
404 PyCObject_FromVoidPtrAndDesc((void *) node,
405 (char *) "xmlNsPtr",
406 libxml_xmlXPathDestructNsNode);
407 PyList_SetItem(ret, i, ns);
408 /* make sure the xmlNsPtr is not destroyed now */
409 obj->nodesetval->nodeTab[i] = NULL;
410 } else {
411 PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
412 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000413 }
414 }
415 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000416 case XPATH_BOOLEAN:
Daniel Veillardd2379012002-03-15 22:24:56 +0000417 ret = PyInt_FromLong((long) obj->boolval);
418 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000419 case XPATH_NUMBER:
Daniel Veillardd2379012002-03-15 22:24:56 +0000420 ret = PyFloat_FromDouble(obj->floatval);
421 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000422 case XPATH_STRING:
Daniel Veillardd2379012002-03-15 22:24:56 +0000423 ret = PyString_FromString((char *) obj->stringval);
424 break;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000425 case XPATH_POINT:
Daniel Veillard46459062006-10-10 08:40:04 +0000426 {
427 PyObject *node;
428 PyObject *indexIntoNode;
429 PyObject *tuple;
430
431 node = libxml_xmlNodePtrWrap(obj->user);
432 indexIntoNode = PyInt_FromLong((long) obj->index);
433
434 tuple = PyTuple_New(2);
435 PyTuple_SetItem(tuple, 0, node);
436 PyTuple_SetItem(tuple, 1, indexIntoNode);
437
438 ret = tuple;
439 break;
440 }
Daniel Veillard3ce52572002-02-03 15:08:05 +0000441 case XPATH_RANGE:
Daniel Veillard46459062006-10-10 08:40:04 +0000442 {
443 unsigned short bCollapsedRange;
444
445 bCollapsedRange = ( (obj->user2 == NULL) ||
446 ((obj->user2 == obj->user) && (obj->index == obj->index2)) );
447 if ( bCollapsedRange ) {
448 PyObject *node;
449 PyObject *indexIntoNode;
450 PyObject *tuple;
451 PyObject *list;
452
453 list = PyList_New(1);
454
455 node = libxml_xmlNodePtrWrap(obj->user);
456 indexIntoNode = PyInt_FromLong((long) obj->index);
457
458 tuple = PyTuple_New(2);
459 PyTuple_SetItem(tuple, 0, node);
460 PyTuple_SetItem(tuple, 1, indexIntoNode);
461
462 PyList_SetItem(list, 0, tuple);
463
464 ret = list;
465 } else {
466 PyObject *node;
467 PyObject *indexIntoNode;
468 PyObject *tuple;
469 PyObject *list;
470
471 list = PyList_New(2);
472
473 node = libxml_xmlNodePtrWrap(obj->user);
474 indexIntoNode = PyInt_FromLong((long) obj->index);
475
476 tuple = PyTuple_New(2);
477 PyTuple_SetItem(tuple, 0, node);
478 PyTuple_SetItem(tuple, 1, indexIntoNode);
479
480 PyList_SetItem(list, 0, tuple);
481
482 node = libxml_xmlNodePtrWrap(obj->user2);
483 indexIntoNode = PyInt_FromLong((long) obj->index2);
484
485 tuple = PyTuple_New(2);
486 PyTuple_SetItem(tuple, 0, node);
487 PyTuple_SetItem(tuple, 1, indexIntoNode);
488
489 PyList_SetItem(list, 1, tuple);
490
491 ret = list;
492 }
493 break;
494 }
Daniel Veillard3ce52572002-02-03 15:08:05 +0000495 case XPATH_LOCATIONSET:
Daniel Veillard46459062006-10-10 08:40:04 +0000496 {
497 xmlLocationSetPtr set;
498
499 set = obj->user;
500 if ( set && set->locNr > 0 ) {
501 int i;
502 PyObject *list;
503
504 list = PyList_New(set->locNr);
505
506 for (i=0; i<set->locNr; i++) {
507 xmlXPathObjectPtr setobj;
508 PyObject *pyobj;
509
510 setobj = set->locTab[i]; /*xmlXPathObjectPtr setobj*/
511
512 pyobj = libxml_xmlXPathObjectPtrWrap(setobj);
513 /* xmlXPathFreeObject(setobj) is called */
514 set->locTab[i] = NULL;
515
516 PyList_SetItem(list, i, pyobj);
517 }
518 set->locNr = 0;
519 ret = list;
520 } else {
521 Py_INCREF(Py_None);
522 ret = Py_None;
523 }
524 break;
525 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000526 default:
Daniel Veillard634ec272006-02-22 15:11:32 +0000527#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000528 printf("Unable to convert XPath object type %d\n", obj->type);
Daniel Veillard634ec272006-02-22 15:11:32 +0000529#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000530 Py_INCREF(Py_None);
531 ret = Py_None;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000532 }
533 xmlXPathFreeObject(obj);
Daniel Veillardd2379012002-03-15 22:24:56 +0000534 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000535}
536
537xmlXPathObjectPtr
Daniel Veillardd2379012002-03-15 22:24:56 +0000538libxml_xmlXPathObjectPtrConvert(PyObject * obj)
539{
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000540 xmlXPathObjectPtr ret = NULL;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000541
542#ifdef DEBUG
543 printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);
544#endif
545 if (obj == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000546 return (NULL);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000547 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000548 if PyFloat_Check
549 (obj) {
550 ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));
Daniel Veillarda4bd3692006-06-18 17:40:53 +0000551
552 } else if PyInt_Check(obj) {
553
554 ret = xmlXPathNewFloat((double) PyInt_AS_LONG(obj));
555
Daniel Veillarddb670152007-06-12 10:04:37 +0000556#ifdef PyBool_Check
Daniel Veillarda4bd3692006-06-18 17:40:53 +0000557 } else if PyBool_Check (obj) {
558
559 if (obj == Py_True) {
560 ret = xmlXPathNewBoolean(1);
561 }
562 else {
563 ret = xmlXPathNewBoolean(0);
564 }
Daniel Veillarddb670152007-06-12 10:04:37 +0000565#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000566 } else if PyString_Check
567 (obj) {
568 xmlChar *str;
Daniel Veillard3ce52572002-02-03 15:08:05 +0000569
Daniel Veillardd2379012002-03-15 22:24:56 +0000570 str = xmlStrndup((const xmlChar *) PyString_AS_STRING(obj),
571 PyString_GET_SIZE(obj));
572 ret = xmlXPathWrapString(str);
573 } else if PyList_Check
574 (obj) {
575 int i;
576 PyObject *node;
577 xmlNodePtr cur;
578 xmlNodeSetPtr set;
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000579
Daniel Veillardd2379012002-03-15 22:24:56 +0000580 set = xmlXPathNodeSetCreate(NULL);
Daniel Veillarda94ec6f2002-03-01 13:00:53 +0000581
Daniel Veillardd2379012002-03-15 22:24:56 +0000582 for (i = 0; i < PyList_Size(obj); i++) {
583 node = PyList_GetItem(obj, i);
584 if ((node == NULL) || (node->ob_type == NULL))
585 continue;
Daniel Veillard79426f22002-03-01 16:14:17 +0000586
Daniel Veillardd2379012002-03-15 22:24:56 +0000587 cur = NULL;
588 if (PyCObject_Check(node)) {
Daniel Veillard634ec272006-02-22 15:11:32 +0000589#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000590 printf("Got a CObject\n");
Daniel Veillard634ec272006-02-22 15:11:32 +0000591#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000592 cur = PyxmlNode_Get(node);
593 } else if (PyInstance_Check(node)) {
594 PyInstanceObject *inst = (PyInstanceObject *) node;
595 PyObject *name = inst->in_class->cl_name;
Daniel Veillard79426f22002-03-01 16:14:17 +0000596
Daniel Veillardd2379012002-03-15 22:24:56 +0000597 if PyString_Check
598 (name) {
599 char *type = PyString_AS_STRING(name);
600 PyObject *wrapper;
601
602 if (!strcmp(type, "xmlNode")) {
603 wrapper =
604 PyObject_GetAttrString(node, (char *) "_o");
605 if (wrapper != NULL) {
606 cur = PyxmlNode_Get(wrapper);
607 }
608 }
609 }
610 } else {
Daniel Veillard634ec272006-02-22 15:11:32 +0000611#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000612 printf("Unknown object in Python return list\n");
Daniel Veillard634ec272006-02-22 15:11:32 +0000613#endif
Daniel Veillardd2379012002-03-15 22:24:56 +0000614 }
615 if (cur != NULL) {
616 xmlXPathNodeSetAdd(set, cur);
617 }
618 }
619 ret = xmlXPathWrapNodeSet(set);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000620 } else {
Daniel Veillard634ec272006-02-22 15:11:32 +0000621#ifdef DEBUG
Daniel Veillardd2379012002-03-15 22:24:56 +0000622 printf("Unable to convert Python Object to XPath");
Daniel Veillard634ec272006-02-22 15:11:32 +0000623#endif
Daniel Veillard3ce52572002-02-03 15:08:05 +0000624 }
625 Py_DECREF(obj);
Daniel Veillardd2379012002-03-15 22:24:56 +0000626 return (ret);
Daniel Veillard3ce52572002-02-03 15:08:05 +0000627}
628
Daniel Veillard7db38712002-02-07 16:39:11 +0000629PyObject *
Daniel Veillard850ce9b2004-11-10 11:55:47 +0000630libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid)
631{
632 PyObject *ret;
633
634#ifdef DEBUG
635 printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid);
636#endif
637 if (valid == NULL) {
638 Py_INCREF(Py_None);
639 return (Py_None);
640 }
641
642 ret =
643 PyCObject_FromVoidPtrAndDesc((void *) valid,
644 (char *) "xmlValidCtxtPtr", NULL);
645
646 return (ret);
647}
648
649PyObject *
Daniel Veillardd2379012002-03-15 22:24:56 +0000650libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal)
651{
Daniel Veillard7db38712002-02-07 16:39:11 +0000652 PyObject *ret;
653
654#ifdef DEBUG
655 printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
656#endif
657 if (catal == NULL) {
Daniel Veillardd2379012002-03-15 22:24:56 +0000658 Py_INCREF(Py_None);
659 return (Py_None);
Daniel Veillard7db38712002-02-07 16:39:11 +0000660 }
Daniel Veillardd2379012002-03-15 22:24:56 +0000661 ret =
662 PyCObject_FromVoidPtrAndDesc((void *) catal,
663 (char *) "xmlCatalogPtr", NULL);
664 return (ret);
Daniel Veillard7db38712002-02-07 16:39:11 +0000665}
Daniel Veillardc6d4a932002-09-12 15:00:57 +0000666
667PyObject *
668libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)
669{
670 PyObject *ret;
671
672#ifdef DEBUG
673 printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);
674#endif
675 if (buffer == NULL) {
676 Py_INCREF(Py_None);
677 return (Py_None);
678 }
679 ret =
680 PyCObject_FromVoidPtrAndDesc((void *) buffer,
681 (char *) "xmlOutputBufferPtr", NULL);
682 return (ret);
683}
684
685PyObject *
686libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)
687{
688 PyObject *ret;
689
690#ifdef DEBUG
691 printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);
692#endif
693 if (buffer == NULL) {
694 Py_INCREF(Py_None);
695 return (Py_None);
696 }
697 ret =
698 PyCObject_FromVoidPtrAndDesc((void *) buffer,
699 (char *) "xmlParserInputBufferPtr", NULL);
700 return (ret);
701}
Daniel Veillardbd9afb52002-09-25 22:25:35 +0000702
Daniel Veillard0e298ad2003-02-04 16:14:33 +0000703#ifdef LIBXML_REGEXP_ENABLED
Daniel Veillardbd9afb52002-09-25 22:25:35 +0000704PyObject *
705libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
706{
707 PyObject *ret;
708
709#ifdef DEBUG
710 printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);
711#endif
712 if (regexp == NULL) {
713 Py_INCREF(Py_None);
714 return (Py_None);
715 }
716 ret =
717 PyCObject_FromVoidPtrAndDesc((void *) regexp,
718 (char *) "xmlRegexpPtr", NULL);
719 return (ret);
720}
Daniel Veillard0e298ad2003-02-04 16:14:33 +0000721#endif /* LIBXML_REGEXP_ENABLED */
Daniel Veillard0eb38c72002-12-14 23:00:35 +0000722
Daniel Veillard438ebbd2008-05-12 12:58:46 +0000723#ifdef LIBXML_READER_ENABLED
Daniel Veillard0eb38c72002-12-14 23:00:35 +0000724PyObject *
725libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
726{
727 PyObject *ret;
728
729#ifdef DEBUG
730 printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
731#endif
732 if (reader == NULL) {
733 Py_INCREF(Py_None);
734 return (Py_None);
735 }
736 ret =
737 PyCObject_FromVoidPtrAndDesc((void *) reader,
738 (char *) "xmlTextReaderPtr", NULL);
739 return (ret);
740}
Daniel Veillard417be3a2003-01-20 21:26:34 +0000741
742PyObject *
743libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)
744{
745 PyObject *ret;
746
747#ifdef DEBUG
748 printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);
749#endif
750 if (locator == NULL) {
751 Py_INCREF(Py_None);
752 return (Py_None);
753 }
754 ret =
755 PyCObject_FromVoidPtrAndDesc((void *) locator,
756 (char *) "xmlTextReaderLocatorPtr", NULL);
757 return (ret);
758}
Daniel Veillard438ebbd2008-05-12 12:58:46 +0000759#endif /* LIBXML_READER_ENABLED */
Daniel Veillard417be3a2003-01-20 21:26:34 +0000760
Daniel Veillard591b4be2003-02-09 23:33:36 +0000761#ifdef LIBXML_SCHEMAS_ENABLED
762PyObject *
763libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)
764{
765 PyObject *ret;
766
767#ifdef DEBUG
768 printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);
769#endif
770 if (ctxt == NULL) {
771 Py_INCREF(Py_None);
772 return (Py_None);
773 }
774 ret =
775 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
776 (char *) "xmlRelaxNGPtr", NULL);
777 return (ret);
778}
779
780PyObject *
781libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)
782{
783 PyObject *ret;
784
785#ifdef DEBUG
786 printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);
787#endif
788 if (ctxt == NULL) {
789 Py_INCREF(Py_None);
790 return (Py_None);
791 }
792 ret =
793 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
794 (char *) "xmlRelaxNGParserCtxtPtr", NULL);
795 return (ret);
796}
797PyObject *
798libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)
799{
800 PyObject *ret;
801
802#ifdef DEBUG
803 printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);
804#endif
805 if (valid == NULL) {
806 Py_INCREF(Py_None);
807 return (Py_None);
808 }
809 ret =
810 PyCObject_FromVoidPtrAndDesc((void *) valid,
811 (char *) "xmlRelaxNGValidCtxtPtr", NULL);
812 return (ret);
813}
Daniel Veillard259f0df2004-08-18 09:13:18 +0000814
815PyObject *
816libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt)
817{
818 PyObject *ret;
819
820#ifdef DEBUG
821 printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt);
822#endif
823 if (ctxt == NULL) {
824 Py_INCREF(Py_None);
825 return (Py_None);
826 }
827 ret =
828 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
829 (char *) "xmlSchemaPtr", NULL);
830 return (ret);
831}
832
833PyObject *
834libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt)
835{
836 PyObject *ret;
837
838#ifdef DEBUG
839 printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt);
840#endif
841 if (ctxt == NULL) {
842 Py_INCREF(Py_None);
843 return (Py_None);
844 }
845 ret =
846 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
847 (char *) "xmlSchemaParserCtxtPtr", NULL);
848
849 return (ret);
850}
851
852PyObject *
853libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid)
854{
855 PyObject *ret;
856
857#ifdef DEBUG
858 printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid);
859#endif
860 if (valid == NULL) {
861 Py_INCREF(Py_None);
862 return (Py_None);
863 }
864
865 ret =
866 PyCObject_FromVoidPtrAndDesc((void *) valid,
867 (char *) "xmlSchemaValidCtxtPtr", NULL);
868
869 return (ret);
870}
Daniel Veillard591b4be2003-02-09 23:33:36 +0000871#endif /* LIBXML_SCHEMAS_ENABLED */
Daniel Veillard46da4642004-01-06 22:54:57 +0000872
873PyObject *
874libxml_xmlErrorPtrWrap(xmlErrorPtr error)
875{
876 PyObject *ret;
877
878#ifdef DEBUG
879 printf("libxml_xmlErrorPtrWrap: error = %p\n", error);
880#endif
881 if (error == NULL) {
882 Py_INCREF(Py_None);
883 return (Py_None);
884 }
885 ret =
886 PyCObject_FromVoidPtrAndDesc((void *) error,
887 (char *) "xmlErrorPtr", NULL);
888 return (ret);
889}