libxml.c revision 3ce5257b293ed75d8feb18ed7ab18ea2b52510bd
13ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/*
23ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * libxml.c: this modules implements the main part of the glue of the
33ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *           libxml2 library and the Python interpreter. It provides the
43ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *           entry points where an automatically generated stub is either
53ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *           unpractical or would not match cleanly the Python model.
63ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *
73ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * See Copyright for the status of this software.
83ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *
93ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * daniel@veillard.com
103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard */
11d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <Python.h>
12f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlmemory.h>
13d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/parser.h>
14d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/tree.h>
15a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpath.h>
165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#include <libxml/xmlerror.h>
17a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpathInternals.h>
18d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h"
1996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h"
20d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
21d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
22a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
24d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
25d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
26d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
273ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
29d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
313ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardtypedef struct pySAXhandler {
323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *startDocument;
333ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    /* TODO !!! */
343ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard} pySAXhandler, *pySAXhandlerPtr;
35d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
363ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
373ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
393ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
403ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
433ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) {
443ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *chunk;
453ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
463ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *URI;
473ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyobj_SAX;
483ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
493ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pySAXhandlerPtr SAXdata = NULL;
503ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
513ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
523ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX,
543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard		          &chunk, &size, &URI))
553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard        return(NULL);
561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
573ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR
583ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
593ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard	   pyobj_SAX, chunk, size, URI);
601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
613ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
623ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard	printf("xmlCreatePushParser: event interface not supported yet !\n");
631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard	Py_INCREF(Py_None);
641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard	return(Py_None);
651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
663ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    ret = xmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI);
673ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    return(pyret);
69a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) {
825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       size;
835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       chars;
845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *larger;
855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    va_list   ap;
865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *str;
875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_start(ap, msg);
985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	vfprintf(stdout, msg, ap);
995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_end(ap);
1005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	str = (char *) xmlMalloc(150);
1025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	if (str == NULL)
1035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    return;
1045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	size = 150;
1065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	while (1) {
1085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_start(ap, msg);
1095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    chars = vsnprintf(str, size, msg, ap);
1105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_end(ap);
1115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((chars > -1) && (chars < size))
1125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		break;
1135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if (chars > -1)
1145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += chars + 1;
1155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    else
1165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += 100;
1175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((larger = (char *) xmlRealloc(str, size)) == NULL) {
1185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		xmlFree(str);
1195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		return;
1205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    }
1215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    str = larger;
1225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	}
1235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	list = PyTuple_New(2);
1255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	message = libxml_charPtrWrap(str);
1285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 1, message);
1295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(list);
1315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(result);
1325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
1335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) {
1375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
1385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
1395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
1405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
1415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject *
1445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) {
1455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
1465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
1475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
1485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f,
1505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		          &pyobj_ctx))
1515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard        return(NULL);
1525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
1545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f);
1555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
1565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
1595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
1605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
1625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
1635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
1655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
1665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
1685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
1695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
1705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    return(py_retval);
1735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
177a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
178a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
179a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0;
181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
182a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback {
183a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
184a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
185a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *function;
187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr;
188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10];
189a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0;
190a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10;
191a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
192a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */
193a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL;
194a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
196a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) {
197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
198a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
200a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
201a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
202a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncCallback called\n");
203a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
204a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
205a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    list = PyTuple_New(nargs);
206a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < nargs;i++) {
207a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	obj = valuePop(ctxt);
208a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	cur = libxml_xmlXPathObjectPtrWrap(obj);
209a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	PyTuple_SetItem(list, i, cur);
210a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
211a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
212a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
213a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
214a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
215a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
216a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
217a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
218a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
219a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name,
220a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	                      const xmlChar *ns_uri) {
221a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
222a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
223a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
224a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctxt, name, ns_uri);
225a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
226a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
227a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
228a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
229a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
230a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    current_function = libxml_xpathCallbacks[i].function;
231a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    return(libxml_xmlXPathFuncCallback);
232a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
233a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
234a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
235a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(NULL);
236a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
237a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
238a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
239a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) {
240a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
241a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
242a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
243a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return;
244a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
245a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
246a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
247a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
248a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
249a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < 10;i++) {
250a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ctx = NULL;
251a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].name = NULL;
252a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ns_uri = NULL;
253a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = NULL;
254a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
255a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
256a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
257a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
258a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
259a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
2607fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) {
261a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
262a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
263a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
264a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
265a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
266a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
267a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
268a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
269a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
270a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx,
271a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard		          &name, &ns_uri, &pyobj_f))
272a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        return(NULL);
273a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
274a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
275a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
276a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacksInitialize();
277a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
278a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
279a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
280a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	py_retval = libxml_intWrap(-1);
281a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return(py_retval);
282a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
283a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
284a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
285a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
286a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctx, name, ns_uri);
287a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
288a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
289a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctx == libxml_xpathCallbacks[i].ctx) &&
290a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
291a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
292a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XINCREF(pyobj_f);
293a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XDECREF(libxml_xpathCallbacks[i].function);
294a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    libxml_xpathCallbacks[i].function = pyobj_f;
295a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    c_retval = 1;
296a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    goto done;
297a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
298a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
299a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
300a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	printf("libxml_registerXPathFunction() table full\n");
301a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
302a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	i = libxml_xpathCallbacksNb++;
303a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	Py_XINCREF(pyobj_f);
304a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
305a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
306a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
307a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = pyobj_f;
3089589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard	c_retval = 1;
309a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
310a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone:
311a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
312a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(py_retval);
313a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
314a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
3151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
3161971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
319d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args)
322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:name", &obj))
328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
333d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE: {
341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlDocPtr doc = (xmlDocPtr) cur;
342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = doc->URL;
343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->name;
348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = ns->prefix;
353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
354d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
356d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->name;
357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
358d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
3591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
360d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
361d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
362d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
363d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
364d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
365d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args)
366d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
367d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
368d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
369d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
370d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
371d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:doc", &obj))
372d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
373d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
374d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
375d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
376d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
377d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
380d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
381d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
382d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
383d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
384d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
385d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->doc;
390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->doc;
397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
398d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
400d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
404d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args)
405d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
406d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
407d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
408d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
409d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
410d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:properties", &obj))
411d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
412d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
413d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
414d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = cur->properties;
415d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
416d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = NULL;
417d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
420d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args)
423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
424d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:next", &obj))
429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
438d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
446d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
448d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
449d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
450d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
451d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) ns->next;
452d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
454d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
456d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args)
465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:prev", &obj))
471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
492d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
493d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
494d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
495d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
497d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args)
503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:children", &obj))
509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->children;
529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->children;
533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
535d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
537d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
539d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
540d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args)
545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
551d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->last;
571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->last;
575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args)
586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:parent", &obj))
592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
597d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
600d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
603d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
606d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
609d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->parent;
610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_DECL:
612d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_START:
614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_END:
615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->parent;
619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args)
627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "element"; break;
643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute"; break;
645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "text"; break;
647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "cdata"; break;
649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_ref"; break;
651d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
652d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity"; break;
653d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
654d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "pi"; break;
655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "comment"; break;
657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_xml"; break;
659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "doctype"; break;
661d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "fragment"; break;
663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "notation"; break;
665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_html"; break;
667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "dtd"; break;
669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "elem_decl"; break;
671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute_decl"; break;
673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_decl"; break;
675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "namespace"; break;
677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_start"; break;
679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_end"; break;
681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_docbook"; break;
684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
685d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
686d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
688d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
6901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
691d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
692d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
693d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
694d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
695d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
696d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
697d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
70096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "name", libxml_name, METH_VARARGS },
702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "children", libxml_children, METH_VARARGS },
703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "properties", libxml_properties, METH_VARARGS },
704d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "last", libxml_last, METH_VARARGS },
705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "prev", libxml_prev, METH_VARARGS },
706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "next", libxml_next, METH_VARARGS },
707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "parent", libxml_parent, METH_VARARGS },
708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "type", libxml_type, METH_VARARGS },
709a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    { "doc", libxml_doc, METH_VARARGS },
710d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) {
7133ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    m = Py_InitModule("_libxml", libxmlMethods);
7155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
718