set eol-style:native
[reactos.git] / reactos / lib / libxml2 / python / types.c
index 8d5fa09..329d270 100644 (file)
-/*\r
- * types.c: converter functions between the internal representation\r
- *          and the Python objects\r
- *\r
- * See Copyright for the status of this software.\r
- *\r
- * daniel@veillard.com\r
- */\r
-#include "libxml_wrap.h"\r
-\r
-PyObject *\r
-libxml_intWrap(int val)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_intWrap: val = %d\n", val);\r
-#endif\r
-    ret = PyInt_FromLong((long) val);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_longWrap(long val)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_longWrap: val = %ld\n", val);\r
-#endif\r
-    ret = PyInt_FromLong(val);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_doubleWrap(double val)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_doubleWrap: val = %f\n", val);\r
-#endif\r
-    ret = PyFloat_FromDouble((double) val);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_charPtrWrap(char *str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlcharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString(str);\r
-    xmlFree(str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_charPtrConstWrap(const char *str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlcharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString(str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlCharPtrWrap(xmlChar * str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlCharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString((char *) str);\r
-    xmlFree(str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlCharPtrConstWrap(const xmlChar * str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlCharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString((char *) str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_constcharPtrWrap(const char *str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlcharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString(str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_constxmlCharPtrWrap(const xmlChar * str)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlCharPtrWrap: str = %s\n", str);\r
-#endif\r
-    if (str == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret = PyString_FromString((char *) str);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlDocPtrWrap(xmlDocPtr doc)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);\r
-#endif\r
-    if (doc == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    /* TODO: look at deallocation */\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) doc, (char *) "xmlDocPtr",\r
-                                     NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlNodePtrWrap(xmlNodePtr node)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlNodePtrWrap: node = %p\n", node);\r
-#endif\r
-    if (node == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "xmlNodePtr",\r
-                                     NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlURIPtrWrap(xmlURIPtr uri)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);\r
-#endif\r
-    if (uri == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) uri, (char *) "xmlURIPtr",\r
-                                     NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlNsPtrWrap(xmlNsPtr ns)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlNsPtrWrap: node = %p\n", ns);\r
-#endif\r
-    if (ns == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) ns, (char *) "xmlNsPtr",\r
-                                     NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlAttrPtrWrap(xmlAttrPtr attr)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);\r
-#endif\r
-    if (attr == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) attr, (char *) "xmlAttrPtr",\r
-                                     NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlAttributePtrWrap(xmlAttributePtr attr)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);\r
-#endif\r
-    if (attr == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) attr,\r
-                                     (char *) "xmlAttributePtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlElementPtrWrap(xmlElementPtr elem)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);\r
-#endif\r
-    if (elem == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) elem,\r
-                                     (char *) "xmlElementPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-    if (ctxt == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                     (char *) "xmlXPathContextPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-    if (ctxt == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                       (char *) "xmlXPathParserContextPtr",\r
-                                       NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-    if (ctxt == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                     (char *) "xmlParserCtxtPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);\r
-#endif\r
-    if (obj == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    switch (obj->type) {\r
-        case XPATH_XSLT_TREE: {\r
-            if ((obj->nodesetval == NULL) ||\r
-               (obj->nodesetval->nodeNr == 0) ||\r
-               (obj->nodesetval->nodeTab == NULL)) {\r
-                ret = PyList_New(0);\r
-           } else {\r
-               int i, len = 0;\r
-               xmlNodePtr node;\r
-\r
-               node = obj->nodesetval->nodeTab[0]->children;\r
-               while (node != NULL) {\r
-                   len++;\r
-                   node = node->next;\r
-               }\r
-               ret = PyList_New(len);\r
-               node = obj->nodesetval->nodeTab[0]->children;\r
-               for (i = 0;i < len;i++) {\r
-                    PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));\r
-                   node = node->next;\r
-               }\r
-           }\r
-           /*\r
-            * Return now, do not free the object passed down\r
-            */\r
-           return (ret);\r
-       }\r
-        case XPATH_NODESET:\r
-            if ((obj->nodesetval == NULL)\r
-                || (obj->nodesetval->nodeNr == 0)) {\r
-                ret = PyList_New(0);\r
-           } else {\r
-                int i;\r
-                xmlNodePtr node;\r
-\r
-                ret = PyList_New(obj->nodesetval->nodeNr);\r
-                for (i = 0; i < obj->nodesetval->nodeNr; i++) {\r
-                    node = obj->nodesetval->nodeTab[i];\r
-                    /* TODO: try to cast directly to the proper node type */\r
-                    PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));\r
-                }\r
-            }\r
-            break;\r
-        case XPATH_BOOLEAN:\r
-            ret = PyInt_FromLong((long) obj->boolval);\r
-            break;\r
-        case XPATH_NUMBER:\r
-            ret = PyFloat_FromDouble(obj->floatval);\r
-            break;\r
-        case XPATH_STRING:\r
-            ret = PyString_FromString((char *) obj->stringval);\r
-            break;\r
-        case XPATH_POINT:\r
-        case XPATH_RANGE:\r
-        case XPATH_LOCATIONSET:\r
-        default:\r
-            printf("Unable to convert XPath object type %d\n", obj->type);\r
-            Py_INCREF(Py_None);\r
-            ret = Py_None;\r
-    }\r
-    xmlXPathFreeObject(obj);\r
-    return (ret);\r
-}\r
-\r
-xmlXPathObjectPtr\r
-libxml_xmlXPathObjectPtrConvert(PyObject * obj)\r
-{\r
-    xmlXPathObjectPtr ret = NULL;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);\r
-#endif\r
-    if (obj == NULL) {\r
-        return (NULL);\r
-    }\r
-    if PyFloat_Check\r
-        (obj) {\r
-        ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));\r
-    } else if PyString_Check\r
-        (obj) {\r
-        xmlChar *str;\r
-\r
-        str = xmlStrndup((const xmlChar *) PyString_AS_STRING(obj),\r
-                         PyString_GET_SIZE(obj));\r
-        ret = xmlXPathWrapString(str);\r
-    } else if PyList_Check\r
-        (obj) {\r
-        int i;\r
-        PyObject *node;\r
-        xmlNodePtr cur;\r
-        xmlNodeSetPtr set;\r
-\r
-        set = xmlXPathNodeSetCreate(NULL);\r
-\r
-        for (i = 0; i < PyList_Size(obj); i++) {\r
-            node = PyList_GetItem(obj, i);\r
-            if ((node == NULL) || (node->ob_type == NULL))\r
-                continue;\r
-\r
-            cur = NULL;\r
-            if (PyCObject_Check(node)) {\r
-                printf("Got a CObject\n");\r
-                cur = PyxmlNode_Get(node);\r
-            } else if (PyInstance_Check(node)) {\r
-                PyInstanceObject *inst = (PyInstanceObject *) node;\r
-                PyObject *name = inst->in_class->cl_name;\r
-\r
-                if PyString_Check\r
-                    (name) {\r
-                    char *type = PyString_AS_STRING(name);\r
-                    PyObject *wrapper;\r
-\r
-                    if (!strcmp(type, "xmlNode")) {\r
-                        wrapper =\r
-                            PyObject_GetAttrString(node, (char *) "_o");\r
-                        if (wrapper != NULL) {\r
-                            cur = PyxmlNode_Get(wrapper);\r
-                        }\r
-                    }\r
-                    }\r
-            } else {\r
-                printf("Unknown object in Python return list\n");\r
-            }\r
-            if (cur != NULL) {\r
-                xmlXPathNodeSetAdd(set, cur);\r
-            }\r
-        }\r
-        ret = xmlXPathWrapNodeSet(set);\r
-    } else {\r
-        printf("Unable to convert Python Object to XPath");\r
-    }\r
-    Py_DECREF(obj);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid)\r
-{\r
-       PyObject *ret;\r
-       \r
-#ifdef DEBUG\r
-       printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid);\r
-#endif\r
-       if (valid == NULL) {\r
-               Py_INCREF(Py_None);\r
-               return (Py_None);\r
-       }\r
-\r
-       ret = \r
-               PyCObject_FromVoidPtrAndDesc((void *) valid,\r
-                                                                        (char *) "xmlValidCtxtPtr", NULL);\r
-\r
-       return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);\r
-#endif\r
-    if (catal == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) catal,\r
-                                     (char *) "xmlCatalogPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);\r
-#endif\r
-    if (buffer == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) buffer,\r
-                                     (char *) "xmlOutputBufferPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);\r
-#endif\r
-    if (buffer == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) buffer,\r
-                                     (char *) "xmlParserInputBufferPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-#ifdef LIBXML_REGEXP_ENABLED\r
-PyObject *\r
-libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);\r
-#endif\r
-    if (regexp == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) regexp,\r
-                                     (char *) "xmlRegexpPtr", NULL);\r
-    return (ret);\r
-}\r
-#endif /* LIBXML_REGEXP_ENABLED */\r
-\r
-PyObject *\r
-libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);\r
-#endif\r
-    if (reader == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) reader,\r
-                                     (char *) "xmlTextReaderPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);\r
-#endif\r
-    if (locator == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) locator,\r
-                                     (char *) "xmlTextReaderLocatorPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-#ifdef LIBXML_SCHEMAS_ENABLED\r
-PyObject *\r
-libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-    if (ctxt == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                     (char *) "xmlRelaxNGPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-    if (ctxt == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                     (char *) "xmlRelaxNGParserCtxtPtr", NULL);\r
-    return (ret);\r
-}\r
-PyObject *\r
-libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);\r
-#endif\r
-    if (valid == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) valid,\r
-                                     (char *) "xmlRelaxNGValidCtxtPtr", NULL);\r
-    return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt)\r
-{\r
-       PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-       printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-       if (ctxt == NULL) {\r
-               Py_INCREF(Py_None);\r
-               return (Py_None);\r
-       }\r
-       ret =\r
-               PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                                                        (char *) "xmlSchemaPtr", NULL);\r
-       return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt)\r
-{\r
-       PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-       printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt);\r
-#endif\r
-       if (ctxt == NULL) {\r
-               Py_INCREF(Py_None);\r
-               return (Py_None);\r
-       }\r
-       ret = \r
-               PyCObject_FromVoidPtrAndDesc((void *) ctxt,\r
-                                                                        (char *) "xmlSchemaParserCtxtPtr", NULL);\r
-\r
-       return (ret);\r
-}\r
-\r
-PyObject *\r
-libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid)\r
-{\r
-       PyObject *ret;\r
-       \r
-#ifdef DEBUG\r
-       printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid);\r
-#endif\r
-       if (valid == NULL) {\r
-               Py_INCREF(Py_None);\r
-               return (Py_None);\r
-       }\r
-\r
-       ret = \r
-               PyCObject_FromVoidPtrAndDesc((void *) valid,\r
-                                                                        (char *) "xmlSchemaValidCtxtPtr", NULL);\r
-\r
-       return (ret);\r
-}\r
-#endif /* LIBXML_SCHEMAS_ENABLED */\r
-\r
-PyObject *\r
-libxml_xmlErrorPtrWrap(xmlErrorPtr error)\r
-{\r
-    PyObject *ret;\r
-\r
-#ifdef DEBUG\r
-    printf("libxml_xmlErrorPtrWrap: error = %p\n", error);\r
-#endif\r
-    if (error == NULL) {\r
-        Py_INCREF(Py_None);\r
-        return (Py_None);\r
-    }\r
-    ret =\r
-        PyCObject_FromVoidPtrAndDesc((void *) error,\r
-                                     (char *) "xmlErrorPtr", NULL);\r
-    return (ret);\r
-}\r
+/*
+ * types.c: converter functions between the internal representation
+ *          and the Python objects
+ *
+ * See Copyright for the status of this software.
+ *
+ * daniel@veillard.com
+ */
+#include "libxml_wrap.h"
+
+PyObject *
+libxml_intWrap(int val)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_intWrap: val = %d\n", val);
+#endif
+    ret = PyInt_FromLong((long) val);
+    return (ret);
+}
+
+PyObject *
+libxml_longWrap(long val)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_longWrap: val = %ld\n", val);
+#endif
+    ret = PyInt_FromLong(val);
+    return (ret);
+}
+
+PyObject *
+libxml_doubleWrap(double val)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_doubleWrap: val = %f\n", val);
+#endif
+    ret = PyFloat_FromDouble((double) val);
+    return (ret);
+}
+
+PyObject *
+libxml_charPtrWrap(char *str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlcharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString(str);
+    xmlFree(str);
+    return (ret);
+}
+
+PyObject *
+libxml_charPtrConstWrap(const char *str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlcharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString(str);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlCharPtrWrap(xmlChar * str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlCharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString((char *) str);
+    xmlFree(str);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlCharPtrConstWrap(const xmlChar * str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlCharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString((char *) str);
+    return (ret);
+}
+
+PyObject *
+libxml_constcharPtrWrap(const char *str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlcharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString(str);
+    return (ret);
+}
+
+PyObject *
+libxml_constxmlCharPtrWrap(const xmlChar * str)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlCharPtrWrap: str = %s\n", str);
+#endif
+    if (str == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret = PyString_FromString((char *) str);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlDocPtrWrap(xmlDocPtr doc)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlDocPtrWrap: doc = %p\n", doc);
+#endif
+    if (doc == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    /* TODO: look at deallocation */
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) doc, (char *) "xmlDocPtr",
+                                     NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlNodePtrWrap(xmlNodePtr node)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlNodePtrWrap: node = %p\n", node);
+#endif
+    if (node == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "xmlNodePtr",
+                                     NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlURIPtrWrap(xmlURIPtr uri)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlURIPtrWrap: uri = %p\n", uri);
+#endif
+    if (uri == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) uri, (char *) "xmlURIPtr",
+                                     NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlNsPtrWrap(xmlNsPtr ns)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlNsPtrWrap: node = %p\n", ns);
+#endif
+    if (ns == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) ns, (char *) "xmlNsPtr",
+                                     NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlAttrPtrWrap(xmlAttrPtr attr)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr);
+#endif
+    if (attr == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) attr, (char *) "xmlAttrPtr",
+                                     NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlAttributePtrWrap(xmlAttributePtr attr)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr);
+#endif
+    if (attr == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) attr,
+                                     (char *) "xmlAttributePtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlElementPtrWrap(xmlElementPtr elem)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem);
+#endif
+    if (elem == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) elem,
+                                     (char *) "xmlElementPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt);
+#endif
+    if (ctxt == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                     (char *) "xmlXPathContextPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlXPathParserContextPtrWrap(xmlXPathParserContextPtr ctxt)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlXPathParserContextPtrWrap: ctxt = %p\n", ctxt);
+#endif
+    if (ctxt == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                       (char *) "xmlXPathParserContextPtr",
+                                       NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlParserCtxtPtrWrap: ctxt = %p\n", ctxt);
+#endif
+    if (ctxt == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                     (char *) "xmlParserCtxtPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj);
+#endif
+    if (obj == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    switch (obj->type) {
+        case XPATH_XSLT_TREE: {
+            if ((obj->nodesetval == NULL) ||
+               (obj->nodesetval->nodeNr == 0) ||
+               (obj->nodesetval->nodeTab == NULL)) {
+                ret = PyList_New(0);
+           } else {
+               int i, len = 0;
+               xmlNodePtr node;
+
+               node = obj->nodesetval->nodeTab[0]->children;
+               while (node != NULL) {
+                   len++;
+                   node = node->next;
+               }
+               ret = PyList_New(len);
+               node = obj->nodesetval->nodeTab[0]->children;
+               for (i = 0;i < len;i++) {
+                    PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
+                   node = node->next;
+               }
+           }
+           /*
+            * Return now, do not free the object passed down
+            */
+           return (ret);
+       }
+        case XPATH_NODESET:
+            if ((obj->nodesetval == NULL)
+                || (obj->nodesetval->nodeNr == 0)) {
+                ret = PyList_New(0);
+           } else {
+                int i;
+                xmlNodePtr node;
+
+                ret = PyList_New(obj->nodesetval->nodeNr);
+                for (i = 0; i < obj->nodesetval->nodeNr; i++) {
+                    node = obj->nodesetval->nodeTab[i];
+                    /* TODO: try to cast directly to the proper node type */
+                    PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node));
+                }
+            }
+            break;
+        case XPATH_BOOLEAN:
+            ret = PyInt_FromLong((long) obj->boolval);
+            break;
+        case XPATH_NUMBER:
+            ret = PyFloat_FromDouble(obj->floatval);
+            break;
+        case XPATH_STRING:
+            ret = PyString_FromString((char *) obj->stringval);
+            break;
+        case XPATH_POINT:
+        case XPATH_RANGE:
+        case XPATH_LOCATIONSET:
+        default:
+            printf("Unable to convert XPath object type %d\n", obj->type);
+            Py_INCREF(Py_None);
+            ret = Py_None;
+    }
+    xmlXPathFreeObject(obj);
+    return (ret);
+}
+
+xmlXPathObjectPtr
+libxml_xmlXPathObjectPtrConvert(PyObject * obj)
+{
+    xmlXPathObjectPtr ret = NULL;
+
+#ifdef DEBUG
+    printf("libxml_xmlXPathObjectPtrConvert: obj = %p\n", obj);
+#endif
+    if (obj == NULL) {
+        return (NULL);
+    }
+    if PyFloat_Check
+        (obj) {
+        ret = xmlXPathNewFloat((double) PyFloat_AS_DOUBLE(obj));
+    } else if PyString_Check
+        (obj) {
+        xmlChar *str;
+
+        str = xmlStrndup((const xmlChar *) PyString_AS_STRING(obj),
+                         PyString_GET_SIZE(obj));
+        ret = xmlXPathWrapString(str);
+    } else if PyList_Check
+        (obj) {
+        int i;
+        PyObject *node;
+        xmlNodePtr cur;
+        xmlNodeSetPtr set;
+
+        set = xmlXPathNodeSetCreate(NULL);
+
+        for (i = 0; i < PyList_Size(obj); i++) {
+            node = PyList_GetItem(obj, i);
+            if ((node == NULL) || (node->ob_type == NULL))
+                continue;
+
+            cur = NULL;
+            if (PyCObject_Check(node)) {
+                printf("Got a CObject\n");
+                cur = PyxmlNode_Get(node);
+            } else if (PyInstance_Check(node)) {
+                PyInstanceObject *inst = (PyInstanceObject *) node;
+                PyObject *name = inst->in_class->cl_name;
+
+                if PyString_Check
+                    (name) {
+                    char *type = PyString_AS_STRING(name);
+                    PyObject *wrapper;
+
+                    if (!strcmp(type, "xmlNode")) {
+                        wrapper =
+                            PyObject_GetAttrString(node, (char *) "_o");
+                        if (wrapper != NULL) {
+                            cur = PyxmlNode_Get(wrapper);
+                        }
+                    }
+                    }
+            } else {
+                printf("Unknown object in Python return list\n");
+            }
+            if (cur != NULL) {
+                xmlXPathNodeSetAdd(set, cur);
+            }
+        }
+        ret = xmlXPathWrapNodeSet(set);
+    } else {
+        printf("Unable to convert Python Object to XPath");
+    }
+    Py_DECREF(obj);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlValidCtxtPtrWrap(xmlValidCtxtPtr valid)
+{
+       PyObject *ret;
+       
+#ifdef DEBUG
+       printf("libxml_xmlValidCtxtPtrWrap: valid = %p\n", valid);
+#endif
+       if (valid == NULL) {
+               Py_INCREF(Py_None);
+               return (Py_None);
+       }
+
+       ret = 
+               PyCObject_FromVoidPtrAndDesc((void *) valid,
+                                                                        (char *) "xmlValidCtxtPtr", NULL);
+
+       return (ret);
+}
+
+PyObject *
+libxml_xmlCatalogPtrWrap(xmlCatalogPtr catal)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlNodePtrWrap: catal = %p\n", catal);
+#endif
+    if (catal == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) catal,
+                                     (char *) "xmlCatalogPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlOutputBufferPtrWrap(xmlOutputBufferPtr buffer)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlOutputBufferPtrWrap: buffer = %p\n", buffer);
+#endif
+    if (buffer == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) buffer,
+                                     (char *) "xmlOutputBufferPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlParserInputBufferPtrWrap(xmlParserInputBufferPtr buffer)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlParserInputBufferPtrWrap: buffer = %p\n", buffer);
+#endif
+    if (buffer == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) buffer,
+                                     (char *) "xmlParserInputBufferPtr", NULL);
+    return (ret);
+}
+
+#ifdef LIBXML_REGEXP_ENABLED
+PyObject *
+libxml_xmlRegexpPtrWrap(xmlRegexpPtr regexp)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlRegexpPtrWrap: regexp = %p\n", regexp);
+#endif
+    if (regexp == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) regexp,
+                                     (char *) "xmlRegexpPtr", NULL);
+    return (ret);
+}
+#endif /* LIBXML_REGEXP_ENABLED */
+
+PyObject *
+libxml_xmlTextReaderPtrWrap(xmlTextReaderPtr reader)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlTextReaderPtrWrap: reader = %p\n", reader);
+#endif
+    if (reader == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) reader,
+                                     (char *) "xmlTextReaderPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlTextReaderLocatorPtrWrap(xmlTextReaderLocatorPtr locator)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlTextReaderLocatorPtrWrap: locator = %p\n", locator);
+#endif
+    if (locator == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) locator,
+                                     (char *) "xmlTextReaderLocatorPtr", NULL);
+    return (ret);
+}
+
+#ifdef LIBXML_SCHEMAS_ENABLED
+PyObject *
+libxml_xmlRelaxNGPtrWrap(xmlRelaxNGPtr ctxt)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlRelaxNGPtrWrap: ctxt = %p\n", ctxt);
+#endif
+    if (ctxt == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                     (char *) "xmlRelaxNGPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlRelaxNGParserCtxtPtrWrap(xmlRelaxNGParserCtxtPtr ctxt)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlRelaxNGParserCtxtPtrWrap: ctxt = %p\n", ctxt);
+#endif
+    if (ctxt == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                     (char *) "xmlRelaxNGParserCtxtPtr", NULL);
+    return (ret);
+}
+PyObject *
+libxml_xmlRelaxNGValidCtxtPtrWrap(xmlRelaxNGValidCtxtPtr valid)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlRelaxNGValidCtxtPtrWrap: valid = %p\n", valid);
+#endif
+    if (valid == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) valid,
+                                     (char *) "xmlRelaxNGValidCtxtPtr", NULL);
+    return (ret);
+}
+
+PyObject *
+libxml_xmlSchemaPtrWrap(xmlSchemaPtr ctxt)
+{
+       PyObject *ret;
+
+#ifdef DEBUG
+       printf("libxml_xmlSchemaPtrWrap: ctxt = %p\n", ctxt);
+#endif
+       if (ctxt == NULL) {
+               Py_INCREF(Py_None);
+               return (Py_None);
+       }
+       ret =
+               PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                                                        (char *) "xmlSchemaPtr", NULL);
+       return (ret);
+}
+
+PyObject *
+libxml_xmlSchemaParserCtxtPtrWrap(xmlSchemaParserCtxtPtr ctxt)
+{
+       PyObject *ret;
+
+#ifdef DEBUG
+       printf("libxml_xmlSchemaParserCtxtPtrWrap: ctxt = %p\n", ctxt);
+#endif
+       if (ctxt == NULL) {
+               Py_INCREF(Py_None);
+               return (Py_None);
+       }
+       ret = 
+               PyCObject_FromVoidPtrAndDesc((void *) ctxt,
+                                                                        (char *) "xmlSchemaParserCtxtPtr", NULL);
+
+       return (ret);
+}
+
+PyObject *
+libxml_xmlSchemaValidCtxtPtrWrap(xmlSchemaValidCtxtPtr valid)
+{
+       PyObject *ret;
+       
+#ifdef DEBUG
+       printf("libxml_xmlSchemaValidCtxtPtrWrap: valid = %p\n", valid);
+#endif
+       if (valid == NULL) {
+               Py_INCREF(Py_None);
+               return (Py_None);
+       }
+
+       ret = 
+               PyCObject_FromVoidPtrAndDesc((void *) valid,
+                                                                        (char *) "xmlSchemaValidCtxtPtr", NULL);
+
+       return (ret);
+}
+#endif /* LIBXML_SCHEMAS_ENABLED */
+
+PyObject *
+libxml_xmlErrorPtrWrap(xmlErrorPtr error)
+{
+    PyObject *ret;
+
+#ifdef DEBUG
+    printf("libxml_xmlErrorPtrWrap: error = %p\n", error);
+#endif
+    if (error == NULL) {
+        Py_INCREF(Py_None);
+        return (Py_None);
+    }
+    ret =
+        PyCObject_FromVoidPtrAndDesc((void *) error,
+                                     (char *) "xmlErrorPtr", NULL);
+    return (ret);
+}