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