libxml.c revision 4e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79
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>
184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#include <libxml/xmlmemory.h>
19d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h"
2096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h"
21d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
22d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
23a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */
264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
274e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************
284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *		Memory debug interface					*
304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/
324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr);
344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size);
354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemRealloc(void *ptr,size_t size);
364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str);
374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0;
394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0;
404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
414e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0;
424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL;
434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL;
444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL;
454e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL;
464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
484e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_xmlDebugMemory(PyObject *self, PyObject *args) {
494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int activate;
504e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *py_retval;
514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    long ret;
524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
534e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (!PyArg_ParseTuple(args, "i:xmlDebugMemory", &activate))
544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard        return(NULL);
554e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY
574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_xmlDebugMemory(%d) called\n", activate);
584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (activate != 0) {
614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	if (libxmlMemoryDebug == 0) {
624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    /*
634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	     * First initialize the library and grab the old memory handlers
644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	     * and switch the library to memory debugging
654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	     */
664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    xmlMemGet((xmlFreeFunc *) &freeFunc,
674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		      (xmlMallocFunc *)&mallocFunc,
684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		      (xmlReallocFunc *)&reallocFunc,
694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		      (xmlStrdupFunc *) &strdupFunc);
704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) &&
714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		(reallocFunc == xmlMemRealloc) &&
724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		(strdupFunc == xmlMemoryStrdup)) {
734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		libxmlMemoryAllocatedBase = xmlMemUsed();
744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    } else {
754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard			                 xmlMemRealloc, xmlMemoryStrdup);
774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		if (ret < 0)
784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		    goto error;
794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		libxmlMemoryAllocatedBase = xmlMemUsed();
804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    }
814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    xmlInitParser();
824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    ret = 0;
834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	} else if (libxmlMemoryDebugActivated == 0) {
844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    libxmlMemoryAllocatedBase = xmlMemUsed();
854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    ret = 0;
864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	} else {
874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	}
894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	libxmlMemoryDebug = 1;
904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	libxmlMemoryDebugActivated = 1;
914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    } else {
924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	if (libxmlMemoryDebugActivated == 1)
934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
944e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	else
954e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	    ret = 0;
964e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	libxmlMemoryDebugActivated = 0;
974e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
984e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillarderror:
994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    py_retval = libxml_longWrap(ret);
1004e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    return(py_retval);
1014e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1024e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1034e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1044e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_xmlDumpMemory(PyObject *self, PyObject *args) {
1054e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1064e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (libxmlMemoryDebug != 0)
1074e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	xmlMemoryDump();
1084e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    Py_INCREF(Py_None);
1094e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    return(Py_None);
1104e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
1143ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
1171971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
1183ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardtypedef struct pySAXhandler {
1193ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *startDocument;
1203ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    /* TODO !!! */
1213ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard} pySAXhandler, *pySAXhandlerPtr;
122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1233ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
1243ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
1253ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
1263ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
1273ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
1281971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
1291971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) {
1313ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *chunk;
1323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1333ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *URI;
1343ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyobj_SAX;
1353ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
1363ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pySAXhandlerPtr SAXdata = NULL;
1373ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
1383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
1393ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1403ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX,
1413ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard		          &chunk, &size, &URI))
1423ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard        return(NULL);
1431971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
1443ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR
1453ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1463ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard	   pyobj_SAX, chunk, size, URI);
1471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
1483ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1493ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard	printf("xmlCreatePushParser: event interface not supported yet !\n");
1501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard	Py_INCREF(Py_None);
1511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard	return(Py_None);
1521971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
1533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    ret = xmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI);
1543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    return(pyret);
156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_htmlCreatePushParser(PyObject *self, PyObject *args) {
1604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlChar *chunk;
1614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlChar *URI;
1634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyobj_SAX;
1644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
1654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pySAXhandlerPtr SAXdata = NULL;
1664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
1674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
1684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (!PyArg_ParseTuple(args, "Oziz:htmlCreatePushParser", &pyobj_SAX,
1704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		          &chunk, &size, &URI))
1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard        return(NULL);
1724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_ERROR
1744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	   pyobj_SAX, chunk, size, URI);
1764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
1774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	printf("htmlCreatePushParser: event interface not supported yet !\n");
1794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	Py_INCREF(Py_None);
1804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	return(Py_None);
1814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
1824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI,
1834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	                           XML_CHAR_ENCODING_NONE);
1844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    return(pyret);
1864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
1895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
1905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
1915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
1925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
1935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
1955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
1965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) {
1995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       size;
2005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       chars;
2015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *larger;
2025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    va_list   ap;
2035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *str;
2045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
2055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
2065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
2075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
2095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
2105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
2115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
2145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_start(ap, msg);
2155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	vfprintf(stdout, msg, ap);
2165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_end(ap);
2175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
2185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	str = (char *) xmlMalloc(150);
2195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	if (str == NULL)
2205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    return;
2215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	size = 150;
2235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	while (1) {
2255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_start(ap, msg);
2265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    chars = vsnprintf(str, size, msg, ap);
2275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_end(ap);
2285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((chars > -1) && (chars < size))
2295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		break;
2305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if (chars > -1)
2315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += chars + 1;
2325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    else
2335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += 100;
2345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((larger = (char *) xmlRealloc(str, size)) == NULL) {
2355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		xmlFree(str);
2365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		return;
2375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    }
2385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    str = larger;
2395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	}
2405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	list = PyTuple_New(2);
2425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
2435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
2445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	message = libxml_charPtrWrap(str);
2455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 1, message);
2465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
2475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(list);
2485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(result);
2495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
2505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
2515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
2535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) {
2545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
2555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
2565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
2575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
2585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
2595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject *
2615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) {
2625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
2635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
2645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
2655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f,
2675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		          &pyobj_ctx))
2685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard        return(NULL);
2695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
2715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f);
2725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
2735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
2755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
2765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
2775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
2785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
2795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
2805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
2825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
2835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
2855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
2865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
2875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
2885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
2895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    return(py_retval);
2905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
291a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
292a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
293a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
294a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
295a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
296a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
297a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0;
298a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
299a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback {
300a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
301a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
302a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
303a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *function;
304a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr;
305a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10];
306a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0;
307a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10;
308a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
309a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */
310a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL;
311a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
312a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
313a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) {
314a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
315a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
316a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
317a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
318a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
319a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncCallback called\n");
320a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
321a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
322a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    list = PyTuple_New(nargs);
323a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < nargs;i++) {
324a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	obj = valuePop(ctxt);
325a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	cur = libxml_xmlXPathObjectPtrWrap(obj);
326a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	PyTuple_SetItem(list, i, cur);
327a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
328a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
329a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
330a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
331a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
332a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
333a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
334a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
335a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
336a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name,
337a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	                      const xmlChar *ns_uri) {
338a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
339a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
340a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
341a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctxt, name, ns_uri);
342a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
343a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
344a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
345a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
346a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
347a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    current_function = libxml_xpathCallbacks[i].function;
348a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    return(libxml_xmlXPathFuncCallback);
349a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
350a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
351a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
352a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(NULL);
353a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
354a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
355a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
356a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) {
357a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
358a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
359a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
360a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return;
361a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
362a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
363a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
364a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
365a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
366a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < 10;i++) {
367a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ctx = NULL;
368a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].name = NULL;
369a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ns_uri = NULL;
370a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = NULL;
371a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
372a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
373a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
374a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
375a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
376a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
3777fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) {
378a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
379a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
380a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
381a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
382a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
383a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
384a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
385a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
386a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
387a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx,
388a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard		          &name, &ns_uri, &pyobj_f))
389a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        return(NULL);
390a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
391a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
392a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
393a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacksInitialize();
394a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
395a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
396a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
397a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	py_retval = libxml_intWrap(-1);
398a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return(py_retval);
399a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
400a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
401a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
402a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
403a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctx, name, ns_uri);
404a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
405a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
406a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctx == libxml_xpathCallbacks[i].ctx) &&
407a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
408a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
409a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XINCREF(pyobj_f);
410a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XDECREF(libxml_xpathCallbacks[i].function);
411a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    libxml_xpathCallbacks[i].function = pyobj_f;
412a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    c_retval = 1;
413a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    goto done;
414a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
415a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
416a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
417a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	printf("libxml_registerXPathFunction() table full\n");
418a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
419a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	i = libxml_xpathCallbacksNb++;
420a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	Py_XINCREF(pyobj_f);
421a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
422a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
423a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
424a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = pyobj_f;
4259589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard	c_retval = 1;
426a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
427a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone:
428a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
429a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(py_retval);
430a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
431a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
4321971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
4331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
438d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args)
439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:name", &obj))
445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
446d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
448d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
449d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
450d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
451d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
452d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
454d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
456d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE: {
458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlDocPtr doc = (xmlDocPtr) cur;
459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = doc->URL;
460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->name;
465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = ns->prefix;
470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->name;
474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
4761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args)
483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:doc", &obj))
489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
492d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
493d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
494d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
495d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
497d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->doc;
507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->doc;
514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args)
522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:properties", &obj))
528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = cur->properties;
532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = NULL;
534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
535d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
537d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
539d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args)
540d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:next", &obj))
546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
551d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) ns->next;
569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args)
582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:prev", &obj))
588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
597d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
600d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
603d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
606d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
609d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
612d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args)
620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:children", &obj))
626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->children;
646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->children;
650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
651d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
652d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
653d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
654d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
661d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args)
662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
685d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
686d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->last;
688d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
690d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
691d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->last;
692d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
693d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
694d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
695d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
696d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
697d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
700d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args)
703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
704d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:parent", &obj))
709d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
710d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
713d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
715d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
718d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
719d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
720d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
721d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
722d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
723d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
724d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
725d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
726d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->parent;
727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
728d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_DECL:
729d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
730d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_START:
731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_END:
732d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
735d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->parent;
736d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
737d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
738d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
739d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
740d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
741d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
742d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
743d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args)
744d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
745d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
746d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
747d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
748d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
749d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
750d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
751d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
752d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
753d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
754d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
756d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
757d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
758d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "element"; break;
760d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
761d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute"; break;
762d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
763d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "text"; break;
764d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
765d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "cdata"; break;
766d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
767d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_ref"; break;
768d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
769d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity"; break;
770d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
771d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "pi"; break;
772d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
773d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "comment"; break;
774d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
775d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_xml"; break;
776d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
777d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "doctype"; break;
778d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
779d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "fragment"; break;
780d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
781d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "notation"; break;
782d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
783d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_html"; break;
784d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
785d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "dtd"; break;
786d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
787d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "elem_decl"; break;
788d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
789d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute_decl"; break;
790d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
791d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_decl"; break;
792d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
793d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "namespace"; break;
794d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
795d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_start"; break;
796d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
797d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_end"; break;
798d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
799d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
800d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_docbook"; break;
801d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
802d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
803d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
804d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
805d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
806d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
8071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
808d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
809d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
810d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
811d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
812d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
813d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
814d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
815d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
816d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
81796fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
818d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "name", libxml_name, METH_VARARGS },
819d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "children", libxml_children, METH_VARARGS },
820d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "properties", libxml_properties, METH_VARARGS },
821d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "last", libxml_last, METH_VARARGS },
822d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "prev", libxml_prev, METH_VARARGS },
823d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "next", libxml_next, METH_VARARGS },
824d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "parent", libxml_parent, METH_VARARGS },
825d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "type", libxml_type, METH_VARARGS },
826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    { "doc", libxml_doc, METH_VARARGS },
827d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
828d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
829d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) {
8303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
831d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    m = Py_InitModule("_libxml", libxmlMethods);
8325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
833d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
834d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
835