libxml.c revision 33caa0b8307eccf22010400747830b1967edb292
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
11833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
11933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
12033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
12133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
12233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
12333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
12433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
12533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
12633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
12733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
12833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
12933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
13033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
13133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "startElement"))
13233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
13333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    else if (PyObject_HasAttrString(handler, "start"))
13433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
13533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
13633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
13733caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
13833caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
13933caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
14033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
14133caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
14233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
14333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
14433caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
14533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
14633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                attrname = PyString_FromString(attrs[i]);
14733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
14833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
14933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = PyString_FromString(attrs[i]);
15033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
15133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
15233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
15333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
15433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
15533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
15633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
15733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
15833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
15933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result = PyObject_CallMethod(handler, "startElement",
16033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                         "sO", name, dict);
16133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
16233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result = PyObject_CallMethod(handler, "start",
16333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                         "sO", name, dict);
16433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
16533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
16633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
16733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
16833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
16933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
17033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
17133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
17233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
17333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
17433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
17533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
17633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
17733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
17833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "startDocument")) {
17933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "startDocument", NULL);
18033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
18133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
18233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
18333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
18433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
18533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
18633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
18733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
18833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
18933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
19033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
19133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
19233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
19333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "endDocument")) {
19433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "endDocument", NULL);
19533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
19633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
19733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
19833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
19933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
20033caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
20133caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
20233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
20333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
20433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
20533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
20633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
20733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
20833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
20933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
21033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
21133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
21233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "endElement")) {
21333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "endElement", "s", name);
21433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
21533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
21633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
21733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
21833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
21933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
22033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
22133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
22233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
22333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
22433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
22533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
22633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
22733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "reference")) {
22833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "reference", "s", name);
22933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
23033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
23133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
23233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
23333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
23433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
23533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
23633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
23733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
23833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
23933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
24033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
24133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
24233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
24333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "characters"))
24433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	type = 1;
24533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    else if (PyObject_HasAttrString(handler, "data"))
24633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	type = 2;
24733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
24833caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (type == 1)
24933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    result = PyObject_CallMethod(handler, "characters", "s#", ch, len);
25033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	else if (type == 2)
25133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    result = PyObject_CallMethod(handler, "data", "s#", ch, len);
25233caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
25333caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
25433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
25533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
25633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
25733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
25833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
25933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
26033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
26133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
26233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
26333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
26433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
26533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
26633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "ignorableWhitespace"))
26733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
26833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    else if (PyObject_HasAttrString(handler, "data"))
26933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
27033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
27133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
27233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
27333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyObject_CallMethod(handler, "ignorableWhitespace", "s#",
27433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                    ch, len);
27533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
27633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result = PyObject_CallMethod(handler, "data", "s#", ch, len);
27733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
27833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
27933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
28033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
28133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
28233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
28333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
28433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
28533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
28633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
28733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
28833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
28933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "processingInstruction")) {
29033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
29133caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyObject_CallMethod(handler,
29233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                "ignorableWhitespace", "ss", target, data);
29333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
29433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
29533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
29633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
29733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
29833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
29933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
30033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
30133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
30233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
30333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
30433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "comment")) {
30533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "comment", "s", value);
30633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
30733caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
30833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
30933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
31033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
31133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
31233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
31333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
31433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
31533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
31633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
31733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
31833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
31933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
32033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
32133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "warning")) {
32233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
32333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
32433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	va_end(args);
32533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	buf[1023] = 0;
32633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "warning", "s", buf);
32733caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
32833caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
32933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
33033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
33133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
33233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
33333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
33433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
33533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
33633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
33733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
33833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
33933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
34033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
34133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
34233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "error")) {
34333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
34433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
34533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	va_end(args);
34633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	buf[1023] = 0;
34733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "error", "s", buf);
34833caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
34933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
35033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
35133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
35233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
35333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
35433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
35533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
35633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
35733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
35833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
35933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
36033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
36133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
36233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
36333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "fatalError")) {
36433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
36533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
36633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	va_end(args);
36733caa0b8307eccf22010400747830b1967edb292Daniel Veillard	buf[1023] = 0;
36833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "fatalError", "s", buf);
36933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
37033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
37133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
37233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
37333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
37433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
37533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
37633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
37733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
37833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
37933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
38033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
38133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
38233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
38333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "cdataBlock"))
38433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	type = 1;
38533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    else if (PyObject_HasAttrString(handler, "cdata"))
38633caa0b8307eccf22010400747830b1967edb292Daniel Veillard	type = 2;
38733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
38833caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (type == 1)
38933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    result = PyObject_CallMethod(handler, "cdataBlock", "s#", ch, len);
39033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	else if (type == 2)
39133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    result = PyObject_CallMethod(handler, "cdata", "s#", ch, len);
39233caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
39333caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
39433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
39533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
39633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
39733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
39833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
39933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
40033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
40133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
40233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
40333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
40433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
40533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
40633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
40733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "externalSubset")) {
40833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
40933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyObject_CallMethod(handler, "externalSubset",
41033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                "sss", name, externalID, systemID);
41133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
41233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
41333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
41433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
41533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
41633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
41733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
41833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
41933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
42033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
42133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
42233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
42333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
42433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
42533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
42633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "entityDecl")) {
42733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "entityDecl",
42833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "sisss", name, type, publicId,
42933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     systemId, content);
43033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
43133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
43233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
43333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
43433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
43533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
43633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
43733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
43833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
43933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
44033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
44133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
44233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
44333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
44433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
44533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
44633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
44733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
44833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "notationDecl")) {
44933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "notationDecl",
45033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "sss", name, publicId, systemId);
45133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
45233caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
45333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
45433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
45533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
45633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
45733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
45833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
45933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
46033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
46133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
46233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
46333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * defaultValue,
46433caa0b8307eccf22010400747830b1967edb292Daniel Veillard		    xmlEnumerationPtr tree)
46533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
46633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
46733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
46833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
46933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
47033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
47133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
47233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
47333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
47433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "attributeDecl")) {
47533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
47633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
47733caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
47833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
47933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
48033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
48133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
48233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            newName = PyString_FromString(node->name);
48333caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
48433caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
48533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
48633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "attributeDecl",
48733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "ssiisO", elem, name, type, def,
48833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     defaultValue, nameList);
48933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
49033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
49133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
49233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
49333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
49433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
49533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
49633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
49733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
49833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
49933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  int type, xmlElementContentPtr content)
50033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
50133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
50233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
50333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
50433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
50533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
50633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "elementDecl")) {
50733caa0b8307eccf22010400747830b1967edb292Daniel Veillard	/* TODO: wrap in an elementContent object */
50833caa0b8307eccf22010400747830b1967edb292Daniel Veillard	printf("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
50933caa0b8307eccf22010400747830b1967edb292Daniel Veillard	obj = Py_None;
51033caa0b8307eccf22010400747830b1967edb292Daniel Veillard	/* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
51133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "elementDecl",
51233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "siO", name, type, obj);
51333caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
51433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
51533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
51633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
51733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
51833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
51933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
52033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
52133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
52233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
52333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
52433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
52533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
52633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
52733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
52833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
52933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
53033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "unparsedEntityDecl")) {
53133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "unparsedEntityDecl",
53233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "ssss", name, publicId, systemId,
53333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     notationName);
53433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
53533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
53633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
53733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
53833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
53933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
54033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
54133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
54233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
54333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
54433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
54533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
54633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
54733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
54833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (PyObject_HasAttrString(handler, "internalSubset")) {
54933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result = PyObject_CallMethod(handler, "internalSubset",
55033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                                     "sss", name, ExternalID, SystemID);
55133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	if (PyErr_Occurred())
55233caa0b8307eccf22010400747830b1967edb292Daniel Veillard	    PyErr_Print();
55333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
55433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
55533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
55633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
55733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
55833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
55933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonIsStandalone, */
56033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonHasInternalSubset, */
56133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonHasExternalSubset, */
56233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonResolveEntity, */
56333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonGetEntity, */
56433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
56533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
56633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
56733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
56833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
56933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* OBSOLETED pythonSetDocumentLocator, */
57033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
57133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
57233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
57333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
57433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
57533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
57633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
57733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
57833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
57933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
58033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
58133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
58233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    NULL, /* TODO pythonGetParameterEntity, */
58333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
58433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
58533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    1
58633caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
5883ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
5893ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
5903ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
5913ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
5923ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
5931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
5941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
5953ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) {
5963ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *chunk;
5973ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
5983ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlChar *URI;
59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
6003ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
6013ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
6023ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
6033ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
6043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX,
6053ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard		          &chunk, &size, &URI))
6063ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard        return(NULL);
6071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
6083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR
6093ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
6103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard	   pyobj_SAX, chunk, size, URI);
6111971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
6123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
61333caa0b8307eccf22010400747830b1967edb292Daniel Veillard	SAX = &pythonSaxHandler;
61433caa0b8307eccf22010400747830b1967edb292Daniel Veillard	Py_INCREF(pyobj_SAX);
61533caa0b8307eccf22010400747830b1967edb292Daniel Veillard	/* The reference is released in pythonEndDocument() */
6161971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
61733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
6183ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
6193ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    return(pyret);
620a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
6215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
6234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_htmlCreatePushParser(PyObject *self, PyObject *args) {
6244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlChar *chunk;
6254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
6264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlChar *URI;
62733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
6284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
6294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
6304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
6314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
6324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (!PyArg_ParseTuple(args, "Oziz:htmlCreatePushParser", &pyobj_SAX,
6334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard		          &chunk, &size, &URI))
6344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard        return(NULL);
6354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
6364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_ERROR
6374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
6384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	   pyobj_SAX, chunk, size, URI);
6394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
6404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
64133caa0b8307eccf22010400747830b1967edb292Daniel Veillard	SAX = &pythonSaxHandler;
64233caa0b8307eccf22010400747830b1967edb292Daniel Veillard	Py_INCREF(pyobj_SAX);
64333caa0b8307eccf22010400747830b1967edb292Daniel Veillard	/* The reference is released in pythonEndDocument() */
6444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
64533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
6464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard	                           XML_CHAR_ENCODING_NONE);
6474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
6484e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    return(pyret);
6494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
6504e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
6515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
6525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
6535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
6545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
6555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
6565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
6585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
6595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
6615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) {
6625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       size;
6635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    int       chars;
6645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *larger;
6655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    va_list   ap;
6665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    char     *str;
6675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
6685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
6695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
6705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
6725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
6735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
6745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
6775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_start(ap, msg);
6785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	vfprintf(stdout, msg, ap);
6795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	va_end(ap);
6805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
6815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	str = (char *) xmlMalloc(150);
6825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	if (str == NULL)
6835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    return;
6845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	size = 150;
6865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
6875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	while (1) {
6885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_start(ap, msg);
6895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    chars = vsnprintf(str, size, msg, ap);
6905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    va_end(ap);
6915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((chars > -1) && (chars < size))
6925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		break;
6935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if (chars > -1)
6945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += chars + 1;
6955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    else
6965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		size += 100;
6975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    if ((larger = (char *) xmlRealloc(str, size)) == NULL) {
6985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		xmlFree(str);
6995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		return;
7005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    }
7015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	    str = larger;
7025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	}
7035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	list = PyTuple_New(2);
7055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
7065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
7075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	message = libxml_charPtrWrap(str);
7085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	PyTuple_SetItem(list, 1, message);
7095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
7105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(list);
7115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(result);
7125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
7135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
7145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
7165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) {
7175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
7185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
7195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
7205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
7215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
7225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject *
7245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) {
7255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
7265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
7275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
7285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f,
7305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard		          &pyobj_ctx))
7315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard        return(NULL);
7325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
7345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f);
7355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
7365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
7385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
7395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
7405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
7415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard	Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
7425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
7435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
7455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
7465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
7485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
7495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
7505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
7515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
7525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    return(py_retval);
7535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
754a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
755a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
756a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
757a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
758a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
759a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
760a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0;
761a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
762a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback {
763a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
764a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
765a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
766a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *function;
767a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr;
768a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10];
769a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0;
770a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10;
771a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
772a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */
773a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL;
774a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
775a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
776a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) {
777a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
778a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
779a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
780a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
781a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
782a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncCallback called\n");
783a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
784a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
785a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    list = PyTuple_New(nargs);
786a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < nargs;i++) {
787a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	obj = valuePop(ctxt);
788a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	cur = libxml_xmlXPathObjectPtrWrap(obj);
789a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	PyTuple_SetItem(list, i, cur);
790a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
791a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
792a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
793a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
794a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
795a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
796a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
797a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
798a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
799a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name,
800a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	                      const xmlChar *ns_uri) {
801a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
802a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
803a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
804a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctxt, name, ns_uri);
805a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
806a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
807a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
808a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
809a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
810a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    current_function = libxml_xpathCallbacks[i].function;
811a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    return(libxml_xmlXPathFuncCallback);
812a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
813a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
814a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
815a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(NULL);
816a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
817a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
818a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
819a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) {
820a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
821a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
822a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
823a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return;
824a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
825a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
827a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
828a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
829a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < 10;i++) {
830a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ctx = NULL;
831a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].name = NULL;
832a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ns_uri = NULL;
833a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = NULL;
834a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
835a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    current_function = NULL;
836a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
837a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
838a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
839a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
8407fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) {
841a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
842a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
843a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
844a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
845a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
846a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
847a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
848a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
849a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
850a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx,
851a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard		          &name, &ns_uri, &pyobj_f))
852a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        return(NULL);
853a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
854a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
855a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
856a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacksInitialize();
857a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
858a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
859a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
860a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	py_retval = libxml_intWrap(-1);
861a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return(py_retval);
862a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
863a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
864a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
865a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
866a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctx, name, ns_uri);
867a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
868a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
869a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctx == libxml_xpathCallbacks[i].ctx) &&
870a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
871a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
872a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XINCREF(pyobj_f);
873a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XDECREF(libxml_xpathCallbacks[i].function);
874a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    libxml_xpathCallbacks[i].function = pyobj_f;
875a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    c_retval = 1;
876a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    goto done;
877a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
878a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
879a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
880a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	printf("libxml_registerXPathFunction() table full\n");
881a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
882a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	i = libxml_xpathCallbacksNb++;
883a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	Py_XINCREF(pyobj_f);
884a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
885a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
886a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
887a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = pyobj_f;
8889589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard	c_retval = 1;
889a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone:
891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
892a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(py_retval);
893a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
894a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
8951971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
8961971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
897d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
898d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
899d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
900d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
901d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args)
902d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
903d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
904d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
905d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
906d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
907d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:name", &obj))
908d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
909d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
910d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
911d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
912d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
913d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
914d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
915d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
916d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
917d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
918d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
919d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
920d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE: {
921d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlDocPtr doc = (xmlDocPtr) cur;
922d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = doc->URL;
923d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
924d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
926d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
927d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->name;
928d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
929d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
930d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
931d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
932d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = ns->prefix;
933d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
934d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
935d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
936d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->name;
937d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
938d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
9391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
940d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
944d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
945d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args)
946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
950d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
951d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:doc", &obj))
952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
957d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
958d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
959d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
960d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
961d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
962d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
963d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
964d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
965d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
966d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
967d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
968d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
969d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->doc;
970d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
971d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
972d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
973d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
974d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
975d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
976d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->doc;
977d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
978d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
979d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
980d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
981d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
982d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
983d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
984d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args)
985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
986d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
989d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
990d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:properties", &obj))
991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
992d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = cur->properties;
995d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = NULL;
997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
998d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1000d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1002d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args)
1003d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1004d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1005d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1006d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1007d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1008d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:next", &obj))
1009d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1010d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1011d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1012d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1013d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
1014d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1015d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1016d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1017d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1018d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1019d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1020d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1021d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1022d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1023d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1024d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1025d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1026d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
1027d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1028d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1029d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
1030d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
1031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) ns->next;
1032d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1033d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1034d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1035d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
1036d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1038d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1039d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1041d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1042d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1043d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1044d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args)
1045d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1046d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1047d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1048d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1050d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:prev", &obj))
1051d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1053d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1054d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1055d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
1056d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1057d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1058d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1059d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1060d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1061d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1062d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1063d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1064d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1065d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1067d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
1069d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1070d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
1071d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1072d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1073d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1074d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
1075d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1076d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1077d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1078d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1079d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1080d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1081d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1082d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args)
1083d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1084d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1085d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1086d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1087d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1088d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:children", &obj))
1089d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1090d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1091d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1092d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1093d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
1094d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1095d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1096d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1097d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
1098d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
1099d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
1100d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
1101d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
1102d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1103d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1104d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1105d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1106d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
1108d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->children;
1109d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->children;
1113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1114d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1117d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1118d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1119d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1120d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1121d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1123d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1124d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args)
1125d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1126d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1127d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1128d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1129d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
1131d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1133d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1134d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1135d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
1136d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1137d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1138d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1139d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
1140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
1141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
1142d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
1143d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
1144d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1145d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1146d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1147d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1148d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1149d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
1150d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->last;
1151d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1152d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1153d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->last;
1155d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1156d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1157d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1158d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1159d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1160d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1161d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1162d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1163d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1164d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1165d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args)
1166d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1167d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1168d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1169d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1170d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1171d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:parent", &obj))
1172d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1173d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1174d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1175d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1176d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
1177d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1178d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1180d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1181d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1182d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1183d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1184d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1185d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1186d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1187d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1188d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1189d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->parent;
1190d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1191d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_DECL:
1192d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
1193d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_START:
1194d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_END:
1195d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1196d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1197d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1198d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->parent;
1199d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1200d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1201d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1202d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1203d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1204d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1205d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1206d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args)
1207d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1208d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1209d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1210d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
1211d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
1213d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1214d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1215d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1216d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1217d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
1218d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1219d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1220d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1221d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
1222d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "element"; break;
1223d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
1224d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute"; break;
1225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
1226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "text"; break;
1227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
1228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "cdata"; break;
1229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
1230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_ref"; break;
1231d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
1232d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity"; break;
1233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
1234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "pi"; break;
1235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
1236d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "comment"; break;
1237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
1238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_xml"; break;
1239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
1240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "doctype"; break;
1241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
1242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "fragment"; break;
1243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
1244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "notation"; break;
1245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
1246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_html"; break;
1247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
1248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "dtd"; break;
1249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
1250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "elem_decl"; break;
1251d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
1252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute_decl"; break;
1253d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
1254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_decl"; break;
1255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
1256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "namespace"; break;
1257d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
1258d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_start"; break;
1259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
1260d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_end"; break;
1261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1262d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1263d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_docbook"; break;
1264d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1265d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1266d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
1268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
12701971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
1271d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1273d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1274d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
1275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
127636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
127736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
127836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
127936eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
128036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNsDefs(PyObject *self, PyObject *args) {
128136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
128236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
128336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
128436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
128536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
128636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if (!PyArg_ParseTuple(args, "O:xmlNodeGetNsDefs", &pyobj_node))
128736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard        return(NULL);
128836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
128936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
129036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
129136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	Py_INCREF(Py_None);
129236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	return(Py_None);
129336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
129436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
129536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
129636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    return(py_retval);
129736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
129836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
129936eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
130036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNs(PyObject *self, PyObject *args) {
130136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
130236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
130336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
130436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
130536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
130636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if (!PyArg_ParseTuple(args, "O:xmlNodeGetNs", &pyobj_node))
130736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard        return(NULL);
130836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
130936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
131036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
131136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	Py_INCREF(Py_None);
131236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	return(Py_None);
131336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
131436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
131536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
131636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    return(py_retval);
131736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
131836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
131936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
132036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
1321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
1322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
1323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
1324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
132596fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
1326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "name", libxml_name, METH_VARARGS },
1327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "children", libxml_children, METH_VARARGS },
1328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "properties", libxml_properties, METH_VARARGS },
1329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "last", libxml_last, METH_VARARGS },
1330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "prev", libxml_prev, METH_VARARGS },
1331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "next", libxml_next, METH_VARARGS },
1332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "parent", libxml_parent, METH_VARARGS },
1333d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "type", libxml_type, METH_VARARGS },
1334a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    { "doc", libxml_doc, METH_VARARGS },
1335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
1336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) {
13383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
1339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    m = Py_InitModule("_libxml", libxmlMethods);
13405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
1341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1343