libxml.c revision c575b997d85d4791d852ad43e175d47a64cf8b3c
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 Veillardstatic void
773a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) {
774a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
775a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
77670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
77770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
77870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
77970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
780a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
781a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
78270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
78370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	return;
78470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
78570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
78670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	return;
78770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
78870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
789a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
79070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, ns_uri);
791a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
792a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
79370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
79470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
79570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
79670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
79770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	if (/* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
79870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
79970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
80070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	    current_function = libxml_xpathCallbacks[i].function;
80170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	}
80270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
80370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
80470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	printf("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
80570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	       name);
80670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard	return;
80770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
80870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
809c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
810c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
811a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < nargs;i++) {
812a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	obj = valuePop(ctxt);
813a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	cur = libxml_xmlXPathObjectPtrWrap(obj);
814c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard	PyTuple_SetItem(list, i + 1, cur);
815a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
816a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
817a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
818a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
819a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
820a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
821a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
822a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
823a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
824a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name,
825a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	                      const xmlChar *ns_uri) {
826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
827a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
828a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
829a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctxt, name, ns_uri);
830a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
83170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
83270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
83370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
83470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
83570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
83670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
837a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
838a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
839a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
840a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
841a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    return(libxml_xmlXPathFuncCallback);
842a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
843a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
844a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(NULL);
845a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
846a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
847a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
848a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) {
849a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
850a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
851a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
852a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return;
853a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
854a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
855a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
856a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
857a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
858a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < 10;i++) {
859a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ctx = NULL;
860a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].name = NULL;
861a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].ns_uri = NULL;
862a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = NULL;
863a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
864a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
865a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
866a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
867a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
8687fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) {
869a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
870a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
871a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
872a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
873a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
874a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
875a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
876a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
877a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
878a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx,
879a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard		          &name, &ns_uri, &pyobj_f))
880a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        return(NULL);
881a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
882a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
883a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
884a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacksInitialize();
885a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
886a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
887a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
888a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	py_retval = libxml_intWrap(-1);
889a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	return(py_retval);
890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
892a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
893a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
894a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	   ctx, name, ns_uri);
895a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
896a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    for (i = 0;i < libxml_xpathCallbacksNb;i++) {
897a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	if ((ctx == libxml_xpathCallbacks[i].ctx) &&
898a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
899a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
900a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XINCREF(pyobj_f);
901a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    Py_XDECREF(libxml_xpathCallbacks[i].function);
902a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    libxml_xpathCallbacks[i].function = pyobj_f;
903a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    c_retval = 1;
904a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	    goto done;
905a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	}
906a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
907a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
908a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	printf("libxml_registerXPathFunction() table full\n");
909a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
910a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	i = libxml_xpathCallbacksNb++;
911a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	Py_XINCREF(pyobj_f);
912a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
913a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
914a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
915a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard	libxml_xpathCallbacks[i].function = pyobj_f;
9169589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard	c_retval = 1;
917a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
918a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone:
919a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
920a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    return(py_retval);
921a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
922a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
9231971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
9241971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
926d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
927d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
928d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
929d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args)
930d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
931d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
932d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
933d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
934d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
935d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:name", &obj))
936d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
937d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
938d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
939d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
940d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
944d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
945d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE: {
949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlDocPtr doc = (xmlDocPtr) cur;
950d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = doc->URL;
951d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->name;
956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
957d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
958d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
959d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
960d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = ns->prefix;
961d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
962d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
963d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
964d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->name;
965d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
966d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
9671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
968d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
969d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
970d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
971d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
972d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
973d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args)
974d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
975d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
976d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
977d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
978d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
979d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:doc", &obj))
980d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
981d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
982d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
983d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
984d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
986d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
989d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
990d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
992d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
995d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->doc;
998d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1000d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
1001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1002d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1003d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1004d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->doc;
1005d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1006d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1007d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
1008d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1009d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1010d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1011d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1012d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args)
1013d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1014d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1015d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
1016d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
1017d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1018d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:properties", &obj))
1019d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1020d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1021d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
1022d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = cur->properties;
1023d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
1024d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	res = NULL;
1025d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
1026d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1027d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1028d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1029d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1030d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args)
1031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1032d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1033d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1034d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1035d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1036d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:next", &obj))
1037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1038d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1039d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1041d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
1042d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1043d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1044d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1045d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1046d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1047d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1048d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1050d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1051d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1053d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1054d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
1055d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1056d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1057d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL: {
1058d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlNsPtr ns = (xmlNsPtr) cur;
1059d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) ns->next;
1060d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1061d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1062d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1063d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
1064d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1065d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1067d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1069d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1070d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1071d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1072d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args)
1073d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1074d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1075d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1076d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1077d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1078d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:prev", &obj))
1079d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1080d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1081d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1082d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1083d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
1084d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1085d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1086d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1087d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1088d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1089d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1090d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1091d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1092d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1093d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1094d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1095d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1096d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (xmlNodePtr) attr->next;
1097d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1098d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
1099d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1100d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1101d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1102d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->next;
1103d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1104d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1105d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1106d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1108d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1109d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args)
1111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1114d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:children", &obj))
1117d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1118d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1119d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1120d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1121d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
1122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1123d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1124d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1125d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
1126d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
1127d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
1128d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
1129d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
1130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1131d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1133d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1134d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1135d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
1136d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->children;
1137d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1138d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1139d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->children;
1141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1142d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1143d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1144d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1145d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1146d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1147d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1148d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1149d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1150d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1151d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1152d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args)
1153d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1155d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1156d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1157d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1158d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
1159d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1160d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1161d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1162d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1163d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
1164d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1165d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1166d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1167d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ELEMENT_NODE:
1168d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_REF_NODE:
1169d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_NODE:
1170d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_PI_NODE:
1171d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_COMMENT_NODE:
1172d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1173d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1174d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1175d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1176d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1177d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DTD_NODE:
1178d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->last;
1179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1180d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1181d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1182d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->last;
1183d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1184d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1185d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1186d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1187d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1188d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1189d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1190d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1191d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1192d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1193d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args)
1194d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1195d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1196d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1197d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1198d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1199d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:parent", &obj))
1200d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1201d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1202d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1203d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1204d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
1205d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1206d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1207d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1208d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCUMENT_NODE:
1209d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_HTML_DOCUMENT_NODE:
1210d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1211d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1213d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1214d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1215d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ATTRIBUTE_NODE: {
1216d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    xmlAttrPtr attr = (xmlAttrPtr) cur;
1217d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = attr->parent;
1218d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	}
1219d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_ENTITY_DECL:
1220d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_NAMESPACE_DECL:
1221d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_START:
1222d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_XINCLUDE_END:
1223d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = NULL;
1224d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	default:
1226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = cur->parent;
1227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    break;
1228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1231d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1232d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args)
1235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1236d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
1239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (!PyArg_ParseTuple(args, "O:last", &obj))
1241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
1246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    switch(cur->type) {
1249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
1250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "element"; break;
1251d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
1252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute"; break;
1253d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
1254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "text"; break;
1255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
1256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "cdata"; break;
1257d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
1258d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_ref"; break;
1259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
1260d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity"; break;
1261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
1262d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "pi"; break;
1263d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
1264d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "comment"; break;
1265d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
1266d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_xml"; break;
1267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
1268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "doctype"; break;
1269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
1270d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "fragment"; break;
1271d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
1272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "notation"; break;
1273d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
1274d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_html"; break;
1275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
1276d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "dtd"; break;
1277d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
1278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "elem_decl"; break;
1279d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
1280d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "attribute_decl"; break;
1281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
1282d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "entity_decl"; break;
1283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
1284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "namespace"; break;
1285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
1286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_start"; break;
1287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
1288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "xinclude_end"; break;
1289d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	case XML_DOCB_DOCUMENT_NODE:
1291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard	    res = (const xmlChar *) "document_docbook"; break;
1292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
1296d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
12981971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
1299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1300d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
1303d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
130436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
130536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
130636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
130736eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
130836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNsDefs(PyObject *self, PyObject *args) {
130936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
131036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
131136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
131236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
131336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
131436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if (!PyArg_ParseTuple(args, "O:xmlNodeGetNsDefs", &pyobj_node))
131536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard        return(NULL);
131636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
131736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
131836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
131936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	Py_INCREF(Py_None);
132036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	return(Py_None);
132136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
132236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
132336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
132436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    return(py_retval);
132536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
132636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
132736eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
132836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNs(PyObject *self, PyObject *args) {
132936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
133036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
133136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
133236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
133336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
133436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if (!PyArg_ParseTuple(args, "O:xmlNodeGetNs", &pyobj_node))
133536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard        return(NULL);
133636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
133736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
133836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
133936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	Py_INCREF(Py_None);
134036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard	return(Py_None);
134136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
134236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
134336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
134436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    return(py_retval);
134536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
134636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
134736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
134836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
1349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
1350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
1351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
1352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
135396fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
1354d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "name", libxml_name, METH_VARARGS },
1355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "children", libxml_children, METH_VARARGS },
1356d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "properties", libxml_properties, METH_VARARGS },
1357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "last", libxml_last, METH_VARARGS },
1358d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "prev", libxml_prev, METH_VARARGS },
1359d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "next", libxml_next, METH_VARARGS },
1360d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "parent", libxml_parent, METH_VARARGS },
1361d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    { "type", libxml_type, METH_VARARGS },
1362a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    { "doc", libxml_doc, METH_VARARGS },
1363d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
1364d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1365d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) {
13663ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
1367d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    m = Py_InitModule("_libxml", libxmlMethods);
13685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
1369d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1370d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1371