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_xmlCatalogPtrWrap(xmlCatalogPtr catal)
486 printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
493 PyCObject_FromVoidPtrAndDesc((void *) catal,
494 (char *) "xmlCatalogPtr", NULL);
499 libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)
504 printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);
506 if (buffer == NULL) {
511 PyCObject_FromVoidPtrAndDesc((void *) buffer,
512 (char *) "xmlOutputBufferPtr", NULL);
517 libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)
522 printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);
524 if (buffer == NULL) {
529 PyCObject_FromVoidPtrAndDesc((void *) buffer,
530 (char *) "xmlParserInputBufferPtr", NULL);
534 #ifdef LIBXML_REGEXP_ENABLED
536 libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
541 printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);
543 if (regexp == NULL) {
548 PyCObject_FromVoidPtrAndDesc((void *) regexp,
549 (char *) "xmlRegexpPtr", NULL);
552 #endif /* LIBXML_REGEXP_ENABLED */
555 libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
560 printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
562 if (reader == NULL) {
567 PyCObject_FromVoidPtrAndDesc((void *) reader,
568 (char *) "xmlTextReaderPtr", NULL);
573 libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)
578 printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);
580 if (locator == NULL) {
585 PyCObject_FromVoidPtrAndDesc((void *) locator,
586 (char *) "xmlTextReaderLocatorPtr", NULL);
590 #ifdef LIBXML_SCHEMAS_ENABLED
592 libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)
597 printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);
604 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
605 (char *) "xmlRelaxNGPtr", NULL);
610 libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)
615 printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);
622 PyCObject_FromVoidPtrAndDesc((void *) ctxt,
623 (char *) "xmlRelaxNGParserCtxtPtr", NULL);
627 libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)
632 printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);
639 PyCObject_FromVoidPtrAndDesc((void *) valid,
640 (char *) "xmlRelaxNGValidCtxtPtr", NULL);
643 #endif /* LIBXML_SCHEMAS_ENABLED */