libxml.c revision f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2
1d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <Python.h> 2d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 3f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlversion.h> 4f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlmemory.h> 5d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/parser.h> 6d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/tree.h> 7d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 896fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 9d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 10d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 11d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 12d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 13d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 14d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Per type specific glue * 15d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 16d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 17d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 18d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_intWrap(int val) { 19d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 20d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 21d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 22d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_intWrap: val = %d\n", val); 23d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 24d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyInt_FromLong((long) val); 25d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 26d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 27d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 2996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillardlibxml_doubleWrap(double val) { 3096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard PyObject *ret; 3196fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard 3296fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#ifdef DEBUG 3396fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard printf("libxml_doubleWrap: val = %f\n", val); 3496fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#endif 3596fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard ret = PyFloat_FromDouble((double) val); 3696fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard return(ret); 3796fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard} 3896fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard 3996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel VeillardPyObject * 401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_charPtrWrap(char *str) { 41d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 42d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 43d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 44d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_xmlcharPtrWrap: str = %s\n", str); 45d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 46d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (str == NULL) { 47d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard Py_INCREF(Py_None); 48d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(Py_None); 49d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 50d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard /* TODO: look at deallocation */ 51d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyString_FromString(str); 5236ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard xmlFree(str); 53d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 54d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 55d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 56d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 571971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlCharPtrWrap(xmlChar *str) { 581971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 611971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlCharPtrWrap: str = %s\n", str); 621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (str == NULL) { 641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard /* TODO: look at deallocation */ 681971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyString_FromString(str); 691971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard xmlFree(str); 701971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 711971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 721971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 741971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_constcharPtrWrap(const char *str) { 751971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 781971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlcharPtrWrap: str = %s\n", str); 791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 801971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (str == NULL) { 811971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 821971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 831971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard /* TODO: look at deallocation */ 851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyString_FromString(str); 861971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 871971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 891971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_constxmlCharPtrWrap(const xmlChar *str) { 91d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 92d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 93d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 94d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_xmlCharPtrWrap: str = %s\n", str); 95d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 96d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (str == NULL) { 97d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard Py_INCREF(Py_None); 98d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(Py_None); 99d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 100d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard /* TODO: look at deallocation */ 101d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyString_FromString(str); 102d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 103d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 104d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 105d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 106d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_xmlDocPtrWrap(xmlDocPtr doc) { 107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 108d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 109d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_xmlDocPtrWrap: doc = %p\n", doc); 111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (doc == NULL) { 113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard Py_INCREF(Py_None); 114d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(Py_None); 115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard /* TODO: look at deallocation */ 117d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) doc, "xmlDocPtr", NULL); 118d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 119d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 120d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 121d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_xmlNodePtrWrap(xmlNodePtr node) { 123d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 124d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 125d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 126d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_xmlNodePtrWrap: node = %p\n", node); 127d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 128d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (node == NULL) { 129d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard Py_INCREF(Py_None); 130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(Py_None); 131d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) node, "xmlNodePtr", NULL); 133d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 134d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 135d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 136d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyObject * 1371971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlNsPtrWrap(xmlNsPtr ns) { 1381971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 1391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 1411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlNsPtrWrap: node = %p\n", ns); 1421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 1431971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (ns == NULL) { 1441971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 1451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 1461971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 1471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) ns, "xmlNsPtr", NULL); 1481971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 1491971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 1501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 152d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_xmlAttrPtrWrap(xmlAttrPtr attr) { 153d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *ret; 154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 155d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlAttrNodePtrWrap: attr = %p\n", attr); 157d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 158d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (attr == NULL) { 159d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard Py_INCREF(Py_None); 160d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(Py_None); 161d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 162d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) attr, "xmlAttrPtr", NULL); 163d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return(ret); 164d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 165d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlAttributePtrWrap(xmlAttributePtr attr) { 1681971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 1691971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1701971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 1711971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlAttributePtrWrap: attr = %p\n", attr); 1721971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 1731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (attr == NULL) { 1741971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 1751971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 1761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 1771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) attr, "xmlAttributePtr", NULL); 1781971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 1791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 1801971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1811971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1821971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlElementPtrWrap(xmlElementPtr elem) { 1831971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 1841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 1861971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlElementNodePtrWrap: elem = %p\n", elem); 1871971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 1881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (elem == NULL) { 1891971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 1901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 1911971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 1921971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) elem, "xmlElementPtr", NULL); 1931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 1941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 1951971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1961971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1971971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlXPathContextPtrWrap(xmlXPathContextPtr ctxt) { 1981971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 1991971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 2001971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 2011971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlXPathContextPtrWrap: ctxt = %p\n", ctxt); 2021971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 2031971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (ctxt == NULL) { 2041971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 2051971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 2061971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 2071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyCObject_FromVoidPtrAndDesc((void *) ctxt, "xmlXPathContextPtr", 2081971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard NULL); 2091971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 2101971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 2111971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 2121971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 2131971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardlibxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj) { 2141971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject *ret; 2151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 2161971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#ifdef DEBUG 2171971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("libxml_xmlXPathObjectPtrWrap: ctxt = %p\n", obj); 2181971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 2191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (obj == NULL) { 2201971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 2211971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 2221971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 2231971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard switch(obj->type) { 2241971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_XSLT_TREE: 2251971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard /* TODO !!!! Allocation problems */ 2261971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_NODESET: 2271971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if ((obj->nodesetval == NULL) || (obj->nodesetval->nodeNr == 0)) 2281971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyList_New(0); 2291971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard else { 2301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard int i; 2311971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard xmlNodePtr node; 2321971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 2331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyList_New(obj->nodesetval->nodeNr); 2341971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard for (i = 0;i < obj->nodesetval->nodeNr;i++) { 2351971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard node = obj->nodesetval->nodeTab[i]; 2361971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard /* TODO: try to cast directly to the proper node type */ 2371971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node)); 2381971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 2391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 2401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard break; 2411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_BOOLEAN: 2421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyInt_FromLong((long) obj->boolval); 2431971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard break; 2441971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_NUMBER: 2451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyFloat_FromDouble(obj->floatval); 2461971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard break; 2471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_STRING: 2481971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = PyString_FromString(obj->stringval); 2491971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard break; 2501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_POINT: 2511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_RANGE: 2521971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard case XPATH_LOCATIONSET: 2531971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard default: 2541971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("Unable to convert XPath object type %d\n", obj->type); 2551971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 2561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = Py_None; 2571971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 2581971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard xmlXPathFreeObject(obj); 2591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(ret); 2601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 2611971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 2621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 2631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 2641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * The PyxmlNode type * 2651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 2661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ************************************************************************/ 267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic void 268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyxmlNode_dealloc(PyxmlNode_Object * self) 269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 270d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("TODO PyxmlNode_dealloc\n"); 271d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyMem_DEL(self); 272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 273d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 274d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic int 275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyxmlNode_compare(PyxmlNode_Object * self, PyxmlNode_Object * v) 276d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 277d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (self->obj == v->obj) 278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return 0; 279d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (self->obj > v->obj) 280d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return -1; 281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return 1; 282d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic long 285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyxmlNode_hash(PyxmlNode_Object * self) 286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return (long) self->obj; 288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 289d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel VeillardPyxmlNode_repr(PyxmlNode_Object * self) 292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard char buf[100]; 294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard sprintf(buf, "<xmlNode of type %d at %lx>", 296d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyxmlNode_Get(self)->type, 297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (long) PyxmlNode_Get(self)); 298d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return PyString_FromString(buf); 299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 300d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic char PyxmlNode_Type__doc__[] = "This is the type of libxml Nodes"; 302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 303d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyTypeObject PyxmlNode_Type = { 304d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject_HEAD_INIT(&PyType_Type) 305d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0, /*ob_size */ 306d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard "xmlNode", /*tp_name */ 307d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard sizeof(PyxmlNode_Object), /*tp_basicsize */ 308d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0, /*tp_itemsize */ 309d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (destructor) PyxmlNode_dealloc,/*tp_dealloc */ 310d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (printfunc) 0, /*tp_print */ 311d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (getattrfunc) 0, /*tp_getattr */ 312d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (setattrfunc) 0, /*tp_setattr */ 313d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (cmpfunc) PyxmlNode_compare,/*tp_compare */ 314d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (reprfunc) PyxmlNode_repr, /*tp_repr */ 315d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0, /*tp_as_number */ 316d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0, /*tp_as_sequence */ 317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0, /*tp_as_mapping */ 318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (hashfunc) PyxmlNode_hash, /*tp_hash */ 319d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (ternaryfunc) 0, /*tp_call */ 320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard (reprfunc) 0, /*tp_str */ 321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 0L, 0L, 0L, 0L, 322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyxmlNode_Type__doc__ 323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 3271971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * The PyxmlXPathContext type * 3281971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 3291971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ************************************************************************/ 3301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardstatic void 3311971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyxmlXPathContext_dealloc(PyxmlXPathContext_Object * self) 3321971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard{ 3331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard printf("TODO PyxmlXPathContext_dealloc\n"); 3341971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyMem_DEL(self); 3351971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 3361971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3371971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardstatic int 3381971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyxmlXPathContext_compare(PyxmlXPathContext_Object * self, PyxmlXPathContext_Object * v) 3391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard{ 3401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (self->obj == v->obj) 3411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return 0; 3421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if (self->obj > v->obj) 3431971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return -1; 3441971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return 1; 3451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 3461971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardstatic long 3481971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyxmlXPathContext_hash(PyxmlXPathContext_Object * self) 3491971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard{ 3501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return (long) self->obj; 3511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 3521971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3531971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardstatic PyObject * 3541971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyxmlXPathContext_repr(PyxmlXPathContext_Object * self) 3551971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard{ 3561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard char buf[100]; 3571971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3581971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard sprintf(buf, "<xmlXPathContext at %lx>", 3591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (long) PyxmlXPathContext_Get(self)); 3601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return PyString_FromString(buf); 3611971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard} 3621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillardstatic char PyxmlXPathContext_Type__doc__[] = "This is the type of XPath evaluation contexts"; 3641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyTypeObject PyxmlXPathContext_Type = { 3661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyObject_HEAD_INIT(&PyType_Type) 3671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0, /*ob_size */ 3681971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard "xmlXPathContext", /*tp_name */ 3691971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard sizeof(PyxmlXPathContext_Object), /*tp_basicsize */ 3701971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0, /*tp_itemsize */ 3711971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (destructor) PyxmlXPathContext_dealloc,/*tp_dealloc */ 3721971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (printfunc) 0, /*tp_print */ 3731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (getattrfunc) 0, /*tp_getattr */ 3741971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (setattrfunc) 0, /*tp_setattr */ 3751971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (cmpfunc) PyxmlXPathContext_compare,/*tp_compare */ 3761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (reprfunc) PyxmlXPathContext_repr, /*tp_repr */ 3771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0, /*tp_as_number */ 3781971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0, /*tp_as_sequence */ 3791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0, /*tp_as_mapping */ 3801971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (hashfunc) PyxmlXPathContext_hash, /*tp_hash */ 3811971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (ternaryfunc) 0, /*tp_call */ 3821971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard (reprfunc) 0, /*tp_str */ 3831971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 0L, 0L, 0L, 0L, 3841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyxmlXPathContext_Type__doc__ 3851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard}; 3861971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 3871971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 3881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args) 394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 398d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:name", &obj)) 400d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 404d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 405d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 406d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 407d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 408d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 409d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 410d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 411d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 412d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: { 413d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 414d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = doc->URL; 415d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 416d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 417d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->name; 420d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 424d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = ns->prefix; 425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->name; 429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 4311971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args) 438d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:doc", &obj)) 444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 446d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 448d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 449d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 450d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 451d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 452d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 454d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 456d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->doc; 462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->doc; 469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args) 477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:properties", &obj)) 483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->properties; 487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 492d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 493d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 494d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args) 495d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 497d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:next", &obj)) 501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) ns->next; 524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 535d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args) 537d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 539d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 540d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:prev", &obj)) 543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 551d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args) 575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:children", &obj)) 581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 597d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 600d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->children; 601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 603d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->children; 605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 606d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 609d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 612d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args) 617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->last; 643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->last; 647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 651d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 652d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 653d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 654d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args) 658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 661d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:parent", &obj)) 664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->parent; 682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 685d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 686d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 688d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 690d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->parent; 691d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 692d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 693d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 694d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 695d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 696d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 697d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args) 699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 700d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 704d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 709d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 710d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 713d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "element"; break; 715d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute"; break; 717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 718d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "text"; break; 719d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 720d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "cdata"; break; 721d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 722d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_ref"; break; 723d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 724d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity"; break; 725d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 726d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "pi"; break; 727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 728d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "comment"; break; 729d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 730d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_xml"; break; 731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 732d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "doctype"; break; 733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "fragment"; break; 735d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 736d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "notation"; break; 737d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 738d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_html"; break; 739d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 740d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "dtd"; break; 741d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 742d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "elem_decl"; break; 743d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 744d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute_decl"; break; 745d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 746d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_decl"; break; 747d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 748d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "namespace"; break; 749d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 750d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_start"; break; 751d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 752d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_end"; break; 753d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 754d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_docbook"; break; 756d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 757d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 758d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 760d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 761d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 7621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 763d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 764d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 765d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 766d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 767d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 768d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 769d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 770d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 771d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 77296fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 773d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "name", libxml_name, METH_VARARGS }, 774d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "children", libxml_children, METH_VARARGS }, 775d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "properties", libxml_properties, METH_VARARGS }, 776d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "last", libxml_last, METH_VARARGS }, 777d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "prev", libxml_prev, METH_VARARGS }, 778d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "next", libxml_next, METH_VARARGS }, 779d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "parent", libxml_parent, METH_VARARGS }, 780d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "type", libxml_type, METH_VARARGS }, 781d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "doc", libxml_doc, METH_VARARGS } 782d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 783d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 784d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) { 785d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *m, *d; 786d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard m = Py_InitModule("_libxml", libxmlMethods); 787d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard d = PyModule_GetDict(m); 788d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyDict_SetItemString(d, "xmlNodeType", (PyObject *)&PyxmlNode_Type); 7891971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard PyDict_SetItemString(d, "xmlXPathContextType", (PyObject *)&PyxmlXPathContext_Type); 790d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 791d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 792