2 * types.c: converter functions between the internal representation
3 * and the Python objects
5 * See Copyright for the status of this software.
9 #include "libxml_wrap.h"
12 libxml_intWrap(int val
)
17 printf("libxml_intWrap: val = %d\n", val
);
19 ret
= PyInt_FromLong((long) val
);
24 libxml_longWrap(long val
)
29 printf("libxml_longWrap: val = %ld\n", val
);
31 ret
= PyInt_FromLong(val
);
36 libxml_doubleWrap(double val
)
41 printf("libxml_doubleWrap: val = %f\n", val
);
43 ret
= PyFloat_FromDouble((double) val
);
48 libxml_charPtrWrap(char *str
)
53 printf("libxml_xmlcharPtrWrap: str = %s\n", str
);
59 /* TODO: look at deallocation */
60 ret
= PyString_FromString(str
);
66 libxml_charPtrConstWrap(const char *str
)
71 printf("libxml_xmlcharPtrWrap: str = %s\n", str
);
77 /* TODO: look at deallocation */
78 ret
= PyString_FromString(str
);
83 libxml_xmlCharPtrWrap(xmlChar
* str
)
88 printf("libxml_xmlCharPtrWrap: str = %s\n", str
);
94 /* TODO: look at deallocation */
95 ret
= PyString_FromString((char *) str
);
101 libxml_xmlCharPtrConstWrap(const xmlChar
* str
)
106 printf("libxml_xmlCharPtrWrap: str = %s\n", str
);
112 /* TODO: look at deallocation */
113 ret
= PyString_FromString((char *) str
);
118 libxml_constcharPtrWrap(const char *str
)
123 printf("libxml_xmlcharPtrWrap: str = %s\n", str
);
129 /* TODO: look at deallocation */
130 ret
= PyString_FromString(str
);
135 libxml_constxmlCharPtrWrap(const xmlChar
* str
)
140 printf("libxml_xmlCharPtrWrap: str = %s\n", str
);
146 /* TODO: look at deallocation */
147 ret
= PyString_FromString((char *) str
);
152 libxml_xmlDocPtrWrap(xmlDocPtr doc
)
157 printf("libxml_xmlDocPtrWrap: doc = %p\n", doc
);
163 /* TODO: look at deallocation */
165 PyCObject_FromVoidPtrAndDesc((void *) doc
, (char *) "xmlDocPtr",
171 libxml_xmlNodePtrWrap(xmlNodePtr node
)
176 printf("libxml_xmlNodePtrWrap: node = %p\n", node
);
183 PyCObject_FromVoidPtrAndDesc((void *) node
, (char *) "xmlNodePtr",
189 libxml_xmlURIPtrWrap(xmlURIPtr uri
)
194 printf("libxml_xmlURIPtrWrap: uri = %p\n", uri
);
201 PyCObject_FromVoidPtrAndDesc((void *) uri
, (char *) "xmlURIPtr",
207 libxml_xmlNsPtrWrap(xmlNsPtr ns
)
212 printf("libxml_xmlNsPtrWrap: node = %p\n", ns
);
219 PyCObject_FromVoidPtrAndDesc((void *) ns
, (char *) "xmlNsPtr",
225 libxml_xmlAttrPtrWrap(xmlAttrPtr attr
)
230 printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr
);
237 PyCObject_FromVoidPtrAndDesc((void *) attr
, (char *) "xmlAttrPtr",
243 libxml_xmlAttributePtrWrap(xmlAttributePtr attr
)
248 printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr
);
255 PyCObject_FromVoidPtrAndDesc((void *) attr
,
256 (char *) "xmlAttributePtr", NULL
);
261 libxml_xmlElementPtrWrap(xmlElementPtr elem
)
266 printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem
);
273 PyCObject_FromVoidPtrAndDesc((void *) elem
,
274 (char *) "xmlElementPtr", NULL
);
279 libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt
)
284 printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt
);
291 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
292 (char *) "xmlXPathContextPtr", NULL
);
297 libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt
)
302 printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt
);
308 ret
= PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
309 (char *) "xmlXPathParserContextPtr",
315 libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt
)
320 printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt
);
328 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
329 (char *) "xmlParserCtxtPtr", NULL
);
334 libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj
)
339 printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj
);
346 case XPATH_XSLT_TREE
: {
347 if ((obj
->nodesetval
== NULL
) ||
348 (obj
->nodesetval
->nodeNr
== 0) ||
349 (obj
->nodesetval
->nodeTab
== NULL
)) {
355 node
= obj
->nodesetval
->nodeTab
[0]->children
;
356 while (node
!= NULL
) {
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
));
368 * Return now, do not free the object passed down
373 if ((obj
->nodesetval
== NULL
)
374 || (obj
->nodesetval
->nodeNr
== 0)) {
380 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
));
389 ret
= PyInt_FromLong((long) obj
->boolval
);
392 ret
= PyFloat_FromDouble(obj
->floatval
);
395 ret
= PyString_FromString((char *) obj
->stringval
);
399 case XPATH_LOCATIONSET
:
401 printf("Unable to convert XPath object type %d\n", obj
->type
);
405 xmlXPathFreeObject(obj
);
410 libxml_xmlXPathObjectPtrConvert(PyObject
* obj
)
412 xmlXPathObjectPtr ret
= NULL
;
415 printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj
);
422 ret
= xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj
));
423 } else if PyString_Check
427 str
= xmlStrndup((const xmlChar
*) PyString_AS_STRING(obj
),
428 PyString_GET_SIZE(obj
));
429 ret
= xmlXPathWrapString(str
);
430 } else if PyList_Check
437 set
= xmlXPathNodeSetCreate(NULL
);
439 for (i
= 0; i
< PyList_Size(obj
); i
++) {
440 node
= PyList_GetItem(obj
, i
);
441 if ((node
== NULL
) || (node
->ob_type
== NULL
))
445 if (PyCObject_Check(node
)) {
446 printf("Got a CObject\n");
447 cur
= PyxmlNode_Get(node
);
448 } else if (PyInstance_Check(node
)) {
449 PyInstanceObject
*inst
= (PyInstanceObject
*) node
;
450 PyObject
*name
= inst
->in_class
->cl_name
;
454 char *type
= PyString_AS_STRING(name
);
457 if (!strcmp(type
, "xmlNode")) {
459 PyObject_GetAttrString(node
, (char *) "_o");
460 if (wrapper
!= NULL
) {
461 cur
= PyxmlNode_Get(wrapper
);
466 printf("Unknown object in Python return list\n");
469 xmlXPathNodeSetAdd(set
, cur
);
472 ret
= xmlXPathWrapNodeSet(set
);
474 printf("Unable to convert Python Object to XPath");
481 libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid
)
486 printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid
);
494 PyCObject_FromVoidPtrAndDesc((void *) valid
,
495 (char *) "xmlValidCtxtPtr", NULL
);
501 libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal
)
506 printf("libxml_xmlNodePtrWrap: catal = %p\n", catal
);
513 PyCObject_FromVoidPtrAndDesc((void *) catal
,
514 (char *) "xmlCatalogPtr", NULL
);
519 libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer
)
524 printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer
);
526 if (buffer
== NULL
) {
531 PyCObject_FromVoidPtrAndDesc((void *) buffer
,
532 (char *) "xmlOutputBufferPtr", NULL
);
537 libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer
)
542 printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer
);
544 if (buffer
== NULL
) {
549 PyCObject_FromVoidPtrAndDesc((void *) buffer
,
550 (char *) "xmlParserInputBufferPtr", NULL
);
554 #ifdef LIBXML_REGEXP_ENABLED
556 libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp
)
561 printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp
);
563 if (regexp
== NULL
) {
568 PyCObject_FromVoidPtrAndDesc((void *) regexp
,
569 (char *) "xmlRegexpPtr", NULL
);
572 #endif /* LIBXML_REGEXP_ENABLED */
575 libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader
)
580 printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader
);
582 if (reader
== NULL
) {
587 PyCObject_FromVoidPtrAndDesc((void *) reader
,
588 (char *) "xmlTextReaderPtr", NULL
);
593 libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator
)
598 printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator
);
600 if (locator
== NULL
) {
605 PyCObject_FromVoidPtrAndDesc((void *) locator
,
606 (char *) "xmlTextReaderLocatorPtr", NULL
);
610 #ifdef LIBXML_SCHEMAS_ENABLED
612 libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt
)
617 printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt
);
624 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
625 (char *) "xmlRelaxNGPtr", NULL
);
630 libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt
)
635 printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt
);
642 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
643 (char *) "xmlRelaxNGParserCtxtPtr", NULL
);
647 libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid
)
652 printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid
);
659 PyCObject_FromVoidPtrAndDesc((void *) valid
,
660 (char *) "xmlRelaxNGValidCtxtPtr", NULL
);
665 libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt
)
670 printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt
);
677 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
678 (char *) "xmlSchemaPtr", NULL
);
683 libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt
)
688 printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt
);
695 PyCObject_FromVoidPtrAndDesc((void *) ctxt
,
696 (char *) "xmlSchemaParserCtxtPtr", NULL
);
702 libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid
)
707 printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid
);
715 PyCObject_FromVoidPtrAndDesc((void *) valid
,
716 (char *) "xmlSchemaValidCtxtPtr", NULL
);
720 #endif /* LIBXML_SCHEMAS_ENABLED */
723 libxml_xmlErrorPtrWrap(xmlErrorPtr error
)
728 printf("libxml_xmlErrorPtrWrap: error = %p\n", error
);
735 PyCObject_FromVoidPtrAndDesc((void *) error
,
736 (char *) "xmlErrorPtr", NULL
);