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