libxml.c revision c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6
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 *
70fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard * If compiled with MERGED_MODULES, the entry point will be used to
80fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard * initialize both the libxml2 and the libxslt wrappers
90fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard *
103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * See Copyright for the status of this software.
113ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *
123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * daniel@veillard.com
133ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard */
14d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <Python.h>
15c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#include <fileobject.h>
16a1196ed4142269343ac98e698f195966886319e1Daniel Veillard/* #include "config.h" */
17f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlmemory.h>
18d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/parser.h>
19d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/tree.h>
20a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpath.h>
215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#include <libxml/xmlerror.h>
22a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpathInternals.h>
234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#include <libxml/xmlmemory.h>
24c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#include <libxml/xmlIO.h>
25d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#include <libxml/c14n.h>
26438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#include <libxml/xmlreader.h>
27da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard#include <libxml/xmlsave.h>
28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h"
2996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h"
30d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
310d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf)
320d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a)
33e306260f543aa4c47e8087b2eb013bb7586d801fKoop Mast#elif defined(WITH_TRIO) && !defined(vsnprintf)
34e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#include "trio.h"
35e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#define vsnprintf trio_vsnprintf
360d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif
370d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard
38d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
39797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */
40a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */
43c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */
44c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */
454e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
46d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void);
47d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO:
50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks
52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO 								\
54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
55c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
56c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            __FILE__, __LINE__);
578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack/*
588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * the following vars are used for XPath extensions, but
598e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * are also referenced within the parser cleanup routine.
608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */
618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksInitialized = 0;
628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef struct libxml_xpathCallback {
648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlXPathContextPtr ctx;
658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlChar *name;
668e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlChar *ns_uri;
678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    PyObject *function;
688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack} libxml_xpathCallback, *libxml_xpathCallbackPtr;
698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef libxml_xpathCallback libxml_xpathCallbackArray[];
708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksAllocd = 10;
718e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic libxml_xpathCallbackArray *libxml_xpathCallbacks = NULL;
728e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksNb = 0;
73c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************
754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *		Memory debug interface					*
774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/
794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
80c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#if 0
814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr);
824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size);
83d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size);
844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str);
85c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0;
884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0;
894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0;
914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL;
924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL;
934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL;
944e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL;
954e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
96f93a866079364a006189683eaa07f94c867389d1Daniel Veillardstatic void
97f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlErrorInitialize(void); /* forward declare */
98f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
100c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlMemoryUsed(PyObject * self ATTRIBUTE_UNUSED,
101c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack        PyObject * args ATTRIBUTE_UNUSED)
102529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard{
103529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    long ret;
104529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    PyObject *py_retval;
105529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
106529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    ret = xmlMemUsed();
107529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
108529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    py_retval = libxml_longWrap(ret);
109529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    return (py_retval);
110529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard}
111529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
112529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel VeillardPyObject *
113c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlDebugMemory(PyObject * self ATTRIBUTE_UNUSED, PyObject * args)
114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int activate;
1164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *py_retval;
1174e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    long ret;
1184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate))
120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
1214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY
1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_xmlDebugMemory(%d) called\n", activate);
1244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
1254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (activate != 0) {
127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebug == 0) {
128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * First initialize the library and grab the old memory handlers
130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * and switch the library to memory debugging
131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlMemGet((xmlFreeFunc *) & freeFunc,
133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlMallocFunc *) & mallocFunc,
134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlReallocFunc *) & reallocFunc,
135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlStrdupFunc *) & strdupFunc);
136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) &&
137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (reallocFunc == xmlMemRealloc) &&
138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (strdupFunc == xmlMemoryStrdup)) {
139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
141f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                /*
142f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * cleanup first, because some memory has been
143f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * allocated with the non-debug malloc in xmlInitParser
144f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * when the python module was imported
145f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 */
146f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                xmlCleanupParser();
147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         xmlMemRealloc, xmlMemoryStrdup);
149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (ret < 0)
150d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    goto error;
151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
152f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                /* reinitialize */
153f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                xmlInitParser();
154f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                libxml_xmlErrorInitialize();
155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (libxmlMemoryDebugActivated == 0) {
158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxmlMemoryAllocatedBase = xmlMemUsed();
159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebug = 1;
164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 1;
1654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    } else {
166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebugActivated == 1)
167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else
169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 0;
1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  error:
1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    py_retval = libxml_longWrap(ret);
174d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
178f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlPythonCleanupParser(PyObject *self ATTRIBUTE_UNUSED,
179f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                              PyObject *args ATTRIBUTE_UNUSED) {
180f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
1818e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    int ix;
1828e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    long freed = -1;
183f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
184f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    if (libxmlMemoryDebug) {
185f93a866079364a006189683eaa07f94c867389d1Daniel Veillard        freed = xmlMemUsed();
186f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    }
187f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
188f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    xmlCleanupParser();
1898e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    /*
1908e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     * Need to confirm whether we really want to do this (required for
1918e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     * memcheck) in all cases...
1928e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     */
1938e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
1948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    if (libxml_xpathCallbacks != NULL) {	/* if ext funcs declared */
1958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	for (ix=0; ix<libxml_xpathCallbacksNb; ix++) {
1968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	    if ((*libxml_xpathCallbacks)[ix].name != NULL)
1978e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	        xmlFree((*libxml_xpathCallbacks)[ix].name);
1988e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	    if ((*libxml_xpathCallbacks)[ix].ns_uri != NULL)
1998e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	        xmlFree((*libxml_xpathCallbacks)[ix].ns_uri);
2008e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	}
2018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacksNb = 0;
2028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack        xmlFree(libxml_xpathCallbacks);
2038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacks = NULL;
2048e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    }
205f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
206f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    if (libxmlMemoryDebug) {
207f93a866079364a006189683eaa07f94c867389d1Daniel Veillard        freed -= xmlMemUsed();
208f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	libxmlMemoryAllocatedBase -= freed;
209f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	if (libxmlMemoryAllocatedBase < 0)
210f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	    libxmlMemoryAllocatedBase = 0;
211f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    }
212f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
213f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    Py_INCREF(Py_None);
214f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    return(Py_None);
215f93a866079364a006189683eaa07f94c867389d1Daniel Veillard}
216f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
217f93a866079364a006189683eaa07f94c867389d1Daniel VeillardPyObject *
218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                     ATTRIBUTE_UNUSED PyObject * args)
220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
2224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (libxmlMemoryDebug != 0)
223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlMemoryDump();
2244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    Py_INCREF(Py_None);
225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
2264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Handling Python FILE I/O at the C level			*
231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	The raw I/O attack diectly the File objects, while the		*
232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	other routines address the ioWrapper instance instead		*
233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
234c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref:
238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) {
244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file, *ret;
245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileCloseUnref\n");
248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
249c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
251118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "close", (char *) "()");
252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(file);
256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw:
261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel
266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) {
271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
277c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileReadRaw: %d\n", len);
278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
279c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
281118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len);
282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is NULL\n");
284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is not a String\n");
295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead:
302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel.
307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
310c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) {
312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileRead: %d\n", len);
319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
320c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
322118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len);
323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is NULL\n");
325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
327c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is not a String\n");
336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite:
343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel.
348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written
350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) {
353c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *string;
3556cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *ret = NULL;
356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int written = -1;
357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
358c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileWrite: %d\n", len);
360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
363c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    string = PyString_FromStringAndSize(buffer, len);
364c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (string == NULL) return(-1);
3656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_write")) {
3666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)",
3676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
3686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "write")) {
3696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "write", (char *) "(O)",
3706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
3716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(string);
373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is NULL\n");
375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyInt_Check(ret)) {
377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = (int) PyInt_AsLong(ret);
378c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (ret == Py_None) {
380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = len;
381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is not an Int nor None\n");
384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(written);
387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose:
391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
395c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) {
3976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file, *ret = NULL;
398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileClose\n");
401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
402c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
403c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
4046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_close")) {
4056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()");
4066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "flush")) {
4076cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "flush", (char *) "()");
4086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
409c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
413c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
415a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile:
418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
424c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
426118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr
427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file,
428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncodingHandlerPtr encoder) {
429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr ret;
430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocOutputBuffer(encoder);
434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->writecallback = xmlPythonFileWrite;
438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
441c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
442c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
449c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
450c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr buffer;
451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate",
454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
455c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
457118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	handler = xmlFindCharEncodingHandler((const char *) encoding);
458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlOutputBufferCreatePythonFile(file, handler);
460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n");
462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlOutputBufferPtrWrap(buffer);
463c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
464c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
4656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard/**
4676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * libxml_outputBufferGetPythonFile:
4686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * @buffer:  the I/O buffer
4696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
4706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * read the Python I/O from the CObject
4716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
4726cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * Returns the new parser output or NULL
4736cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard */
4746cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardstatic PyObject *
4756cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self,
4766cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard                                    PyObject *args) {
4776cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *buffer;
4786cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file;
4796cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr obj;
4806cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4816cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile",
4826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard			  &buffer))
4836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(NULL);
4846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    obj = PyoutputBuffer_Get(buffer);
4866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj == NULL) {
4876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: obj == NULL\n");
4896cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4906cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4916cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4926cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj->closecallback != xmlPythonFileClose) {
4936cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4946cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: not a python file wrapper\n");
4956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4966cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4986cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    file = (PyObject *) obj->context;
4996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (file == NULL) {
5006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
5016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
5026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
5036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    Py_INCREF(file);
5046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(file);
5056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
5066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
5086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
5096cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
5106cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
5116cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
5126cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
5136cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out))
5156cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
5166cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
517263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    /* Buffer may already have been destroyed elsewhere. This is harmless. */
518263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (out == NULL) {
519263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	Py_INCREF(Py_None);
520263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	return(Py_None);
521263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    }
5226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferClose(out);
5246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
5256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
5266cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
5276cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
5296cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
5306cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
5316cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
5326cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
5336cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
5346cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5356cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out))
5366cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
5376cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
5386cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5396cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferFlush(out);
5406cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
5416cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
5426cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
543263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
544263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject *
545263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
546263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *py_retval;
547263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int c_retval;
548263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlOutputBufferPtr buf;
549263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_buf;
550263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlDocPtr cur;
551263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_cur;
552263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    char * encoding;
553263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
554263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding))
555263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard        return(NULL);
556263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
557263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
558263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
559263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    c_retval = xmlSaveFileTo(buf, cur, encoding);
560263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	/* xmlSaveTo() freed the memory pointed to by buf, so record that in the
561263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	 * Python object. */
562263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
563263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
564263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    return(py_retval);
565263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard}
566263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
567263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject *
568263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
569263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *py_retval;
570263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int c_retval;
571263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlOutputBufferPtr buf;
572263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_buf;
573263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlDocPtr cur;
574263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_cur;
575263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    char * encoding;
576263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int format;
577263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
578263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format))
579263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard        return(NULL);
580263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
581263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
582263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
583263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format);
584263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	/* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that
585263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	 * in the Python object */
586263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
587263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
588263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    return(py_retval);
589263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard}
590a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
591c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
592c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
593c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
594c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile:
595c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
596c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
597c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
598c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
599c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
600c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
601c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
602c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
603118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr
604c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file,
605c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncoding encoding) {
606c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr ret;
607c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
608c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
609c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
610c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocParserInputBuffer(encoding);
611c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
612c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
613c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
614c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->readcallback = xmlPythonFileRead;
615c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
616c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
617c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
618c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
619c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
620c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
621c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
622c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
623c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
624c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
625c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
626c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
627c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr buffer;
628c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
629c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
630c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate",
631c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
632c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
633c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
634118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	enc = xmlParseCharEncoding((const char *) encoding);
635c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
636c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlParserInputBufferCreatePythonFile(file, enc);
637c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
638c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n");
639c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlParserInputBufferPtrWrap(buffer);
640c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
641c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
642c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
643c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
644c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
645c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Providing the resolver at the Python level		*
646c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
647c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
648c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
649c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL;
650c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext;
651c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
652c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr
653c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID,
654c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			   xmlParserCtxtPtr ctxt) {
655c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputPtr result = NULL;
656c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (pythonExternalEntityLoaderObjext != NULL) {
657c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ret;
658c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ctxtobj;
659c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
660c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt);
661c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
662c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: ready to call\n");
663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
664c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
665c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext,
666118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard		      (char *) "(ssO)", URL, ID, ctxtobj);
667e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	Py_XDECREF(ctxtobj);
668c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
669c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: result ");
670007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard	PyObject_Print(ret, stderr, 0);
671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("\n");
672c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
673c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
674c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (ret != NULL) {
675118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	    if (PyObject_HasAttrString(ret, (char *) "read")) {
676c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		xmlParserInputBufferPtr buf;
677c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
678c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
679c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		if (buf != NULL) {
680c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->context = ret;
681c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->readcallback = xmlPythonFileReadRaw;
682c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->closecallback = xmlPythonFileCloseRaw;
683c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    result = xmlNewIOInputStream(ctxt, buf,
684c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			                         XML_CHAR_ENCODING_NONE);
685c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		}
6864ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#if 0
687c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    } else {
6884ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		if (URL != NULL)
6894ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		    printf("pythonExternalEntityLoader: can't read %s\n",
6904ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		           URL);
6914ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#endif
692c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
693c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    if (result == NULL) {
694c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		Py_DECREF(ret);
695c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard	    } else if (URL != NULL) {
696c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack		result->filename = (char *) xmlStrdup((const xmlChar *)URL);
697c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard		result->directory = xmlParserGetDirectory((const char *) URL);
698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
699c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	}
700c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
701c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((result == NULL) && (defaultExternalEntityLoader != NULL)) {
702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	result = defaultExternalEntityLoader(URL, ID, ctxt);
703c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
704c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(result);
705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
707c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
708c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *loader;
711c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
712c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader",
713c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&loader))
714c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
715c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
716c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
717c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("libxml_xmlSetEntityLoader\n");
718c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
719c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (defaultExternalEntityLoader == NULL)
720c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	defaultExternalEntityLoader = xmlGetExternalEntityLoader();
721c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
722c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    pythonExternalEntityLoaderObjext = loader;
723c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlSetExternalEntityLoader(pythonExternalEntityLoader);
724c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
725c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = PyInt_FromLong(0);
726c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
727c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
728c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
729c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
730c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
731c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
7323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
7351971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
73633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
73733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
74333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
748797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
749797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartElement(%s) called\n", name);
750797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startElement"))
75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "start"))
75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
75933caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
76233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
76333caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (attrs == NULL) {
765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            dict = PyDict_New();
76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                attrname = PyString_FromString((char *) attrs[i]);
77033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    attrvalue = PyString_FromString((char *) attrs[i]);
77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
778a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard		Py_DECREF(attrname);
779a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard		Py_DECREF(attrvalue);
78033caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
78133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
78233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "startElement",
785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
78633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "start",
788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
79233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
79333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
79633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
79733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
79833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
79933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
80033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
802797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
803797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartDocument() called\n");
804797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
80533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startDocument")) {
807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "startDocument", NULL);
809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
81133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
81233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
81433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
81533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
81633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
81733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
81833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
81933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
821797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
822797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndDocument() called\n");
823797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endDocument")) {
826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "endDocument", NULL);
828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
83033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
83433caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
83533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
83733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
83833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
83933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
84033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
84133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
84233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
84333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
844797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
845797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndElement(%s) called\n", name);
846797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
84733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endElement")) {
849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "endElement",
850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
85333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    } else if (PyObject_HasAttrString(handler, (char *) "end")) {
855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "end",
856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
859797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard        Py_XDECREF(result);
86033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
86333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
86433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
86533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
86633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
86733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
86833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
869797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
870797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonReference(%s) called\n", name);
871797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
87233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "reference")) {
874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "reference",
875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
87833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
88233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
88333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
88533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
88733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
88833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
889797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
890797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCharacters(%s, %d) called\n", ch, len);
891797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
89233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "characters"))
894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
89733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "characters",
900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
902d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "data",
903d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
90633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
90733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
90933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
91033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
91133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
91333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
91533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
917797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
918797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);
919797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace"))
92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
923d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
92433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
92633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler,
929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "ignorableWhitespace",
930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "data",
934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
93633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
93933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
94033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
94433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
94533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
946797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
947797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonProcessingInstruction(%s, %s) called\n", target, data);
948797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
94933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) {
951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *)
952d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     "processingInstruction",
953d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ss", target, data);
95433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
95533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
95833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
95933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
96033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
96133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
96233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
964797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
965797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonComment(%s) called\n", value);
966797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
96733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "comment")) {
969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "comment", (char *) "s",
971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                value);
972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
97433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
97833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
97933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
98233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
98333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
986797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
987797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonWarning(%s) called\n", msg);
988797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
98933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "warning")) {
99133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
99233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
996d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "warning", (char *) "s",
997d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
100033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
100133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
100433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
100533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
100833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
100933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
101033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
101133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1012797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1013797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonError(%s) called\n", msg);
1014797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
101533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "error")) {
101733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
101833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1022d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "error", (char *) "s",
1023d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
1024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
102633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
102733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
103033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
103133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
103433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1038797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1039797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonFatalError(%s) called\n", msg);
1040797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
104133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "fatalError")) {
104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "fatalError",
1049d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "s", buf);
1050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
105233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
105333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
105633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
105733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
105833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
105933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
1060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
106133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
106233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1063797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1064797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCdataBlock(%s, %d) called\n", ch, len);
1065797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
106633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "cdataBlock"))
1068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "cdata"))
1070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
107133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdataBlock",
1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
1077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdata",
1079d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1080d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
108233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
108333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
108433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
108633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
108733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
108833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
108933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
109033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
109133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
109233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
109333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1094797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1095797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonExternalSubset(%s, %s, %s) called\n",
1096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, externalID, systemID);
1097797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
109833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "externalSubset")) {
110033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
1101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "externalSubset",
1102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "sss", name, externalID,
1103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                systemID);
110433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
110533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
110633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
110733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
110833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
110933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
111033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
111133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
111233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
111333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
111433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
111533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
111633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
111733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
111833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "entityDecl")) {
1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "entityDecl",
1121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sisss", name, type,
1122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     publicId, systemId, content);
1123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
112533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
112733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
112833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
113133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
113333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
113433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
113533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
113633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
113733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
113833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
113933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
114033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "notationDecl")) {
1142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "notationDecl",
1143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, publicId,
1144d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     systemId);
1145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
114733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
114833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
114933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
115033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
115133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
115233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
115333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
115433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
115533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
115633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
1157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
115833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
115933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
116033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
116133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
116233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
116333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
116533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
116633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) {
116833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
116933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
117033caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
117133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
117233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
117333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
117433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
1175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            newName = PyString_FromString((char *) node->name);
117633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
1177a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard	    Py_DECREF(newName);
117833caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
117933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
1180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "attributeDecl",
1181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ssiisO", elem, name, type,
1182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     def, defaultValue, nameList);
1183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
118533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
118633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
118733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
118833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
118933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
119033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
119133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
119233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
1193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                  int type, ATTRIBUTE_UNUSED xmlElementContentPtr content)
119433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
119533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
119633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
119733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
119833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
119933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "elementDecl")) {
1201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* TODO: wrap in an elementContent object */
1202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
1204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = Py_None;
1205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
1206d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "elementDecl",
1207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "siO", name, type, obj);
1208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
121033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
121133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
121233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
121333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
121433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
121533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
121633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
121733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
121833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
121933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
122033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
122133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
122233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
122333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
122433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) {
1226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "unparsedEntityDecl",
1228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "ssss", name, publicId, systemId,
1229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                notationName);
1230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1231d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
123233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
123333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
123433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
123533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
123633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
123733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
123833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
123933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
124033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
124133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
124233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1243797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1244797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonInternalSubset(%s, %s, %s) called\n",
1245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, ExternalID, SystemID);
1246797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
124733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "internalSubset")) {
1249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "internalSubset",
1250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, ExternalID,
1251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     SystemID);
1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
125433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
125533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
125633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
125733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
125833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
125933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
1260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonIsStandalone, */
1261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasInternalSubset, */
1262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasExternalSubset, */
1263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonResolveEntity, */
1264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetEntity, */
126533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
126633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
126733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
126833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
126933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
1270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* OBSOLETED pythonSetDocumentLocator, */
127133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
127233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
127333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
127433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
127533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
127633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
127733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
127833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
127933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
128033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
128133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
128233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
1283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetParameterEntity, */
128433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
128533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
1286a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    1,
1287a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,			/* TODO mograte to SAX2 */
1288a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,
1289871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack    NULL,
1290a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL
129133caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
1292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
12933ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
12943ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12953ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
12963ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12973ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
12981971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
12991971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1301d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           PyObject * args)
1302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
13043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
130633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
13073ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
13093ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
13103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk,
1313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
13168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13173ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
13203ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13241971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
132533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
13263ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1328a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
13295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1331d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1332d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                            PyObject * args)
1333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1334656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
13364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
133833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
13394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
13414e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
13424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk,
1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
13524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
135733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
1358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                   XML_CHAR_ENCODING_NONE);
13594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1361656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1362656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1363656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1364656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
13654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
13664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13678d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
13708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    int recover;
1371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
13728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
13738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX,
1376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &URI, &recover))
1377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n",
1381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, recover);
13828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
13838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
13868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
13878d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
13888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
13898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
1390f2531afe41a2232669302ceb49161d5689971ed9Daniel Veillard    xmlSAXUserParseFile(SAX, pyobj_SAX, URI);
13918d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
13938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
13948d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13958d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1397d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1398656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
1400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
14018d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
14028d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
14038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI,
1406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &encoding))
1407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
14088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14098d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
14108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n",
1411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, encoding);
14128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
14138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
14168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
14178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
14188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
14198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
14208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX);
14218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
1423656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1424656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1425656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1426656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
14278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
14288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
14305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
14325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
14345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
14365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
14375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1438e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */
1439ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard/*
1440ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * disabled the loop, the repeated call to vsnprintf without reset of ap
1441ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * in case the initial buffer was too small segfaulted on x86_64
1442ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * we now directly vsnprintf on a large buffer.
1443ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard */
1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char *
1445e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap)
1446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int chars;
1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    char *str;
1449e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1450ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    str = (char *) xmlMalloc(1000);
1451e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (str == NULL)
1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return NULL;
1453e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1454ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    chars = vsnprintf(str, 999, msg, ap);
1455ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    if (chars >= 998)
1456ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        str[999] = 0;
1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1458e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return str;
1459e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1460e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1461e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void
1462e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg,
1463e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard                           ...)
1464e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1465d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    va_list ap;
14665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
14675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
14685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
1469ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    char str[1000];
14705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
14725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
14735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
14745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
1477d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_start(ap, msg);
1478007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard        vfprintf(stderr, msg, ap);
1479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(ap);
14805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1481e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_start(ap, msg);
1482ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        if (vsnprintf(str, 999, msg, ap) >= 998)
1483ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard	    str[999] = 0;
1484e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_end(ap);
1485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        list = PyTuple_New(2);
1487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1489ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        message = libxml_charPtrConstWrap(str);
1490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 1, message);
1491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(list);
1493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(result);
14945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
14955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
14965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void)
1499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
15005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
15015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
15025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
15035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
1504781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
15055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
15065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1507c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
1509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                               PyObject * args)
1510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
15115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
15125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
15135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
15145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1516d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
1517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &pyobj_ctx))
1518d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
15195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
15218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx,
1522d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_f);
15235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
15245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
15275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
15305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
15335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
15345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
15365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
15375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
15385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
15415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1543e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1544e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************
1545e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1546e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *                      Per parserCtxt error handler                    *
1547e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1548e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/
1549e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1550417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct
1551417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1552417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *f;
1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *arg;
1554417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt;
1555417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr;
1556417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1557417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1558417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1560e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *list;
1561e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *result;
1562417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1563e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1564e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1565e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR
1566850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
1567e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif
1568e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr)ctx;
1570417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1571e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
1573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XINCREF(pyCtxt->arg);
1575417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrWrap(str));
1576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, Py_None);
1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1579417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (result == NULL)
1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {
1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyErr_Print();
1584e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(list);
1586417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(result);
1587417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1591417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1592417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1593417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1594417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1595417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap));
1596417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1597417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1598417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1599417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1600417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1601417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1602417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1603417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1605417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap));
1606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...)
1611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1616417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1618417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...)
1621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1622417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1623417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1624417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1625417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1626417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1627e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1628e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1629c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1630417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1631e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1632e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *py_retval;
1633e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1634e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1635e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1636e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_f;
1637e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_arg;
1638e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1639417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler",
1640e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard		          &pyobj_ctxt, &pyobj_f, &pyobj_arg))
1641e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1642e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1643e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (ctxt->_private == NULL) {
1644e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt));
1645e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	if (pyCtxt == NULL) {
1646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    py_retval = libxml_intWrap(-1);
1647e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    return(py_retval);
1648e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	}
1649e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt));
1650e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	ctxt->_private = pyCtxt;
1651e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1652e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    else {
1653417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1654e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1655e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    /* TODO: check f is a function ! */
1656417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->f);
1657e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_f);
1658417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->f = pyobj_f;
1659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->arg);
1660e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_arg);
1661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->arg = pyobj_arg;
1662e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (pyobj_f != Py_None) {
1664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler;
1665417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler;
1666417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler;
1667417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler;
1668417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1669417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1670417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = xmlParserError;
1671417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = xmlParserValidityError;
1672417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = xmlParserWarning;
1673417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = xmlParserValidityWarning;
1674417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1675e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1676e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    py_retval = libxml_intWrap(1);
1677e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return(py_retval);
1678e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1679e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1680c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1681417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1682e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1683417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *py_retval;
1684417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1685e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1686417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *pyobj_ctxt;
1687e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1688417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler",
1689417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard		          &pyobj_ctxt))
1690417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard        return(NULL);
1691417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1692417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    py_retval = PyTuple_New(2);
1693417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt->_private != NULL) {
1694417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1695e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1696417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
1697417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->f);
1698417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
1699417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->arg);
1700417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1701417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1702417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* no python error handler registered */
1703417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
1704417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1705417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
1706417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1707e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1708417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(py_retval);
1709e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1710e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1711c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
1713e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1715417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1716e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1717417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt))
1718e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1719e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1720417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1721417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt != NULL) {
1722417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private;
1723417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	if (pyCtxt) {
1724417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->f);
1725417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
1726417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    xmlFree(pyCtxt);
1727e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	}
1728417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	xmlFreeParserCtxt(ctxt);
1729e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1730e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1731417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1732417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(Py_None);
1733e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1734e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1735850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard/***
1736850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard * xmlValidCtxt stuff
1737850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard */
1738850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1739850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef struct
1740850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1741850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *warn;
1742850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *error;
1743850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *arg;
1744850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} xmlValidCtxtPyCtxt;
1745850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr;
1746850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1747850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1748c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6Stefan Kostlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str)
1749850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1750850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1751850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1752850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1753850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1754850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1755850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1756850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1757850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1758850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1759850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1760850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1761850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1762850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1763850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1764850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
1765850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1766850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1767850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1768850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1769850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1770850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1771850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1772850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1773850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1774850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1775c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6Stefan Kostlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str)
1776850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1777850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1778850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1779850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1780850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1781850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1782850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1783850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1784850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1785850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1786850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1787850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1788850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1789850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1790850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1791850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
1792850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1793850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1794850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1795850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1796850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1797850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1798850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1799850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1800850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1801850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1802850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1803850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1804850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1805850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1806850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1807850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1808850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1809850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1810850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1811850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1812850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1813850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1814850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1815850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1816850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1817850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1818850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1819850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1820850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1821850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic PyObject *
1822850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1823850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1824850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *py_retval;
1825850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_error;
1826850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_warn;
1827850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_ctx;
1828850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_arg = Py_None;
1829850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPtr ctxt;
1830850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1831850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1832850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (!PyArg_ParseTuple
1833850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
1834850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        return (NULL);
1835850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1836850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1837850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
1838850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1839850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1840850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt = PyValidCtxt_Get(pyobj_ctx);
1841850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt));
1842850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (pyCtxt == NULL) {
1843850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            py_retval = libxml_intWrap(-1);
1844850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            return(py_retval);
1845850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1846850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt));
1847850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1848850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1849850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    /* TODO: check warn and error is a function ! */
1850850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->error);
1851850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_error);
1852850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->error = pyobj_error;
1853850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1854850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->warn);
1855850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_warn);
1856850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->warn = pyobj_warn;
1857850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1858850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->arg);
1859850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_arg);
1860850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->arg = pyobj_arg;
1861850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1862850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->error = libxml_xmlValidCtxtErrorFuncHandler;
1863850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler;
1864850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->userData = pyCtxt;
1865850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1866850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    py_retval = libxml_intWrap(1);
1867850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    return (py_retval);
1868850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1869850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
187025c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1871bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
187225c90c589b256f0925f081198c1525134a491e31Daniel Veillardlibxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
187325c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPtr cur;
187425c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
187525c90c589b256f0925f081198c1525134a491e31Daniel Veillard    PyObject *pyobj_cur;
187625c90c589b256f0925f081198c1525134a491e31Daniel Veillard
187725c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur))
187825c90c589b256f0925f081198c1525134a491e31Daniel Veillard        return(NULL);
187925c90c589b256f0925f081198c1525134a491e31Daniel Veillard    cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur);
188025c90c589b256f0925f081198c1525134a491e31Daniel Veillard
188125c90c589b256f0925f081198c1525134a491e31Daniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData);
188225c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (pyCtxt != NULL)
188325c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {
188425c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->error);
188525c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->warn);
188625c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->arg);
188725c90c589b256f0925f081198c1525134a491e31Daniel Veillard            xmlFree(pyCtxt);
188825c90c589b256f0925f081198c1525134a491e31Daniel Veillard    }
188925c90c589b256f0925f081198c1525134a491e31Daniel Veillard
189025c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlFreeValidCtxt(cur);
189125c90c589b256f0925f081198c1525134a491e31Daniel Veillard    Py_INCREF(Py_None);
189225c90c589b256f0925f081198c1525134a491e31Daniel Veillard    return(Py_None);
189325c90c589b256f0925f081198c1525134a491e31Daniel Veillard}
189425c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1895438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#ifdef LIBXML_READER_ENABLED
1896a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
1897a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
189826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *                      Per xmlTextReader error handler                 *
189926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
190026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/
190126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
190226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct
190326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
190426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *f;
190526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *arg;
190626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt;
190726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr;
190826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
190926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void
191026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg,
191126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard				  const char *msg,
1912417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  int severity,
1913417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  xmlTextReaderLocatorPtr locator)
191426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
191526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg;
191626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *list;
191726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *result;
191826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1919417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
192026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
192126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XINCREF(pyCtxt->arg);
192226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg));
1923417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1924417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator));
192526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
192626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (result == NULL)
192726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
1928417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
192926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyErr_Print();
193026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
193126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(list);
193226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(result);
193326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
193426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1935c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
193626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
193726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
193826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
193926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
194026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
194126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
194226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
194326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_f;
194426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_arg;
194526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
194626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
194726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg))
194826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
194926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
195026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* clear previous error handler */
195126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
195226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
1953c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
195426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
195526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
195626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
195726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
195826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
195926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
196026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	else {
196126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /*
196226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there already an arg, and it's not ours,
196326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there is definitely something wrong going on here...
196426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * we don't know how to free it, so we bail out...
196526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     */
196626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
196726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
196826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
196926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
197026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderSetErrorHandler(reader,NULL,NULL);
197126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* set new error handler */
197226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (pyobj_f != Py_None)
197326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
197426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt));
197526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	if (pyCtxt == NULL) {
197626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
197726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
197826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
197926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_f);
198026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->f = pyobj_f;
198126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_arg);
198226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->arg = pyobj_arg;
1983c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	xmlTextReaderSetErrorHandler(reader,
1984c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	    (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback,
1985c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	                             pyCtxt);
198626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
198726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
198826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = libxml_intWrap(1);
198926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
199026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
199126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1992c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
199326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
199426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
199526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
199626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
199726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
199826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
199926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
200026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
200126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
200226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader))
200326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
200426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
200526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
200626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = PyTuple_New(2);
2007c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) {
200826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* ok, it's our error handler! */
200926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
201026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
201126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->f);
201226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
201326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->arg);
201426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
201526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    else
201626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
201726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* f is null or it's not our error handler */
201826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
201926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
202026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
202126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
202226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
202326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
202426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
202526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2026c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
202726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
202826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
202926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
203026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
203126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
203226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
203326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2034157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader))
2035157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard        return(NULL);
2036157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyCObject_Check(pyobj_reader)) {
2037bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2038bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2039bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
204026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
2041bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    if (reader == NULL) {
2042bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2043bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2044bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
204526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
204626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
204726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
2048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
204926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
205026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
205126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
205226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
205326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
205426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
205526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/*
205626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * else, something wrong happened, because the error handler is
205726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * not owned by the python bindings...
205826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 */
205926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
206026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
206126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlFreeTextReader(reader);
206226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_INCREF(Py_None);
206326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(Py_None);
206426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
2065438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#endif
206626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
206726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************
206826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
2069a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
2070a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
2071a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
2072a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2073a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
2075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2076a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
2077a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
207870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
207970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
208070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
208170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
2082a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2083a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
208470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
208670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
208770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
2088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
208970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
209070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
2091a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name,
2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ns_uri);
2094a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2095a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
209670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
209770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
209870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (                    /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
21018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack						(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
21028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack               (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
21038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					current_function = (*libxml_xpathCallbacks)[i].function;
2104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
210570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
210670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
2107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
2108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
2109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             name);
2110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
211170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
211270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
2113c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
2114c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
211505349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard    for (i = nargs - 1; i >= 0; i--) {
2116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = valuePop(ctxt);
2117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        cur = libxml_xmlXPathObjectPtrWrap(obj);
2118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, i + 1, cur);
2119a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2120a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
2121a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
2122a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2123a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
2124a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
2125a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2126a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2127a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
2128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name,
2129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                              const xmlChar * ns_uri)
2130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2131a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2133a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2134a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
2135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctxt, name, ns_uri);
2136a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
213770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
213870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
213970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
214070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
214170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
214270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
21448e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) &&
21458e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
21468e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (libxml_xmlXPathFuncCallback);
2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2149a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2150d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (NULL);
2151a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2152a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2153a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void)
2155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2157a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2158a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
2159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
2160a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2161a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2162a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
2163a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
21648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc(
21658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
2166a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
21678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    for (i = 0; i < libxml_xpathCallbacksAllocd; i++) {
21688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ctx = NULL;
21698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].name = NULL;
21708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ns_uri = NULL;
21718e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].function = NULL;
2172a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2173a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
2174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
2177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self,
2178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                PyObject * args)
2179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
2181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
2182a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
2183a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
2184a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
2185a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
2186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
2187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name,
2191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &ns_uri, &pyobj_f))
2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2193a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2194a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
2195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacksInitialize();
2197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
2198a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_intWrap(-1);
2201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (py_retval);
2202a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2203a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2204a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctx, name, ns_uri);
2206a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
22088e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	if ((ctx == (*libxml_xpathCallbacks)[i].ctx) &&
22098e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
22108e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XINCREF(pyobj_f);
22128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            Py_XDECREF((*libxml_xpathCallbacks)[i].function);
22138e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (*libxml_xpathCallbacks)[i].function = pyobj_f;
2214d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = 1;
2215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            goto done;
2216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2217a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
22188e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) {
22198e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			libxml_xpathCallbacksAllocd+=10;
22208e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc(
22218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacks,
22228e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
22238e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    }
22248e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    i = libxml_xpathCallbacksNb++;
22258e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    Py_XINCREF(pyobj_f);
22268e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ctx = ctx;
22278e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].name = xmlStrdup(name);
22288e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri);
22298e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].function = pyobj_f;
2230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        c_retval = 1;
22318e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  done:
2233a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
2234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2235a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2236a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
22371971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
22381971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
2240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
2242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
2248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:name", &obj))
2250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2251d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2253d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
2255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:{
2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlDocPtr doc = (xmlDocPtr) cur;
2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = doc->URL;
2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->name;
2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2275d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2277d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = ns->prefix;
2278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2281d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->name;
2282d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
22841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2289d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2290d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
2295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj))
2297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2298d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2300d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
2302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2303d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2306d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2308d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2315d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->doc;
2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2319d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2320d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->doc;
2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
23332728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard    xmlNodePtr cur;
2334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
2335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj))
2337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
23392728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard    if ((cur != NULL) && (cur->type == XML_ELEMENT_NODE))
2340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = cur->properties;
2341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
2342d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = NULL;
2343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:next", &obj))
2355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2356d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2358d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2359d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
2360d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2361d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2364d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2366d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) attr->next;
2374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) ns->next;
2380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2382d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->next;
2384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2385d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2398d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj))
2399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2400d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
2404d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2405d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2408d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2410d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2416d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2417faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard                res = (xmlNodePtr) attr->prev;
2418d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2419594e5dfb48ee6fbac1b64155839063648022fc57Daniel Veillard            break;
2420d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2421d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2423d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2424faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard            res = cur->prev;
2425d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2432d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:children", &obj))
2439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
2444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2457d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2458d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->children;
2459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2461d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2462d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2463d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->children;
2464d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2465d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2466d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2467d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2468d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2475d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
2487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->last;
2502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->last;
2507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj))
2524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
2529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->parent;
2543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
254422eda2bc82acd047247df3f88aa9a5ab08d6a434Daniel Veillard	    break;
2545d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_DECL:
2546d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2547d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_START:
2548d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_END:
2549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2552d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->parent;
2553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2560d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2564d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const xmlChar *res = NULL;
2565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2566d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
2572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "element";
2577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute";
2580d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "text";
2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
2585d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "cdata";
2586d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_ref";
2589d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity";
2592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "pi";
2595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
2597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "comment";
2598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_xml";
2601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
2603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "doctype";
2604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "fragment";
2607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
2609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "notation";
2610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_html";
2613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "dtd";
2616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "elem_decl";
2619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute_decl";
2622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
2624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_decl";
2625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
2627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "namespace";
2628d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
2630d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_start";
2631d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
2633d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_end";
2634d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2636d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2637d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_docbook";
2638d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
2643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
26451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
2650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
265136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
265236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
265336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
265436eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2656d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
265736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
265836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
265936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
266036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
266136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2663d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node))
2664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
266536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
266636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
266736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
267036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
267136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
267236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2673d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
267436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
267536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
267636eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2677f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillardlibxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2678f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard{
2679f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *py_retval;
2680f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr ns, prev;
2681f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNodePtr node;
2682f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *pyobj_node;
2683f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlChar *href;
2684f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr c_retval;
2685f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2686f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (!PyArg_ParseTuple
2687f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href))
2688f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (NULL);
2689f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
2690f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    ns = NULL;
2691f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2693f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        Py_INCREF(Py_None);
2694f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (Py_None);
2695f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2697f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (href == NULL) {
2698f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2699f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	node->nsDef = NULL;
2700f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	c_retval = 0;
2701f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2702f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    else {
2703f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	prev = NULL;
2704f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2705f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	while (ns != NULL) {
2706f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    if (xmlStrEqual(ns->href, href)) {
2707f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		if (prev != NULL)
2708f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    prev->next = ns->next;
2709f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		else
2710f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    node->nsDef = ns->next;
2711f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		ns->next = NULL;
2712f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		c_retval = 0;
2713f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		break;
2714f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    }
2715f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    prev = ns;
2716f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    ns = ns->next;
2717f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	}
2718f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2719f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2720f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    c_retval = ns;
2721f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2722f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    return (py_retval);
2723f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard}
2724f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2725f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel VeillardPyObject *
2726d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2727d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
272836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
272936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
273036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
273136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
273236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node))
2734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
273536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
273636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2737e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard    if ((node == NULL) ||
2738e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard        ((node->type != XML_ELEMENT_NODE) &&
2739e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard	 (node->type != XML_ATTRIBUTE_NODE))) {
2740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
274236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
274336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
274436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
274636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
274736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2748a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
274936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
275036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
27511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *			Serialization front-end				*
27521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
27531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/
27541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2755d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2756d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2757d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
27581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_retval = NULL;
27591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlChar *c_retval;
27601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
27611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
27621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
27641e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
27651e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
2766da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    xmlSaveCtxtPtr ctxt;
2767da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    xmlBufferPtr buf;
2768da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    int options = 0;
27691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node,
2771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &encoding, &format))
2772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
27731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
27741e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
27751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
27781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
27791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2781da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	node = NULL;
2782656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
27831e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2785da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	node = NULL;
2786da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard#endif
27871e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
278895af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack        if (node->type == XML_NAMESPACE_DECL)
278995af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	    doc = NULL;
279095af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	else
279195af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack            doc = node->doc;
2792a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard        if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) {
2793656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
2794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2795656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
2796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
28001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2801da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard
2802da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard
2803da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    buf = xmlBufferCreate();
2804da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    if (buf == NULL) {
2805da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	Py_INCREF(Py_None);
2806da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	return (Py_None);
2807da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    }
2808da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    if (format) options |= XML_SAVE_FORMAT;
2809da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    ctxt = xmlSaveToBuffer(buf, encoding, options);
2810da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    if (ctxt == NULL) {
2811da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	xmlBufferFree(buf);
2812da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	Py_INCREF(Py_None);
2813da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	return (Py_None);
2814da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    }
2815da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    if (node == NULL)
2816da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	xmlSaveDoc(ctxt, doc);
2817da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    else
2818da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard	xmlSaveTree(ctxt, node);
2819da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    xmlSaveClose(ctxt);
2820da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard
2821da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    c_retval = buf->content;
2822da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    buf->content = NULL;
2823da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard
2824da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    xmlBufferFree(buf);
2825da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard    py_retval = libxml_charPtrWrap((char *) c_retval);
2826da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard
2827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
28281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
28291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
28331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_file = NULL;
28341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    FILE *output;
28351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
28361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
28371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
28391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
28401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
28411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlOutputBufferPtr buf;
28421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
28431e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node,
2845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &py_file, &encoding, &format))
2846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
28471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
28481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
28491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
28511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
28521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
2853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
28541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
28551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    output = PyFile_AsFile(py_file);
28561e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (output == NULL) {
2857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
28581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
28591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
28601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
28621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
28641e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
28661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2867656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
28681e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding == NULL)
2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
28711e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2872656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
28731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (encoding != NULL) {
2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        handler = xmlFindCharEncodingHandler(encoding);
2875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL) {
2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (PyInt_FromLong((long) -1));
2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
28781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
28791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
28841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
28851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
28861e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    buf = xmlOutputBufferCreateFile(output, handler);
28871e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlSaveFormatFileTo(buf, doc, encoding, format);
2889656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
28901e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
28931e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
2896656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
28971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
29001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (PyInt_FromLong((long) len));
29021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
2903a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
29041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************
29061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
2907a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *			Extra stuff					*
2908a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2909a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/
2910a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject *
2911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2913a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    PyObject *py_retval;
2914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    xmlChar *name;
2915a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    xmlNodePtr node;
2916a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name))
2918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2919a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    node = (xmlNodePtr) xmlNewNode(NULL, name);
29203b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG
2921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("NewNode: %s : %p\n", name, (void *) node);
29223b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif
2923a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2924a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    if (node == NULL) {
2925d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
2927a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    }
2928a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    py_retval = libxml_xmlNodePtrWrap(node);
2929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2930a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard}
2931a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
29325439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29335439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************
29345439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
29355439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *			Local Catalog stuff				*
29365439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
29375439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/
29385439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject *
29395439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
29405439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{
29415439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlChar *URL;
29425439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlParserCtxtPtr ctxt;
29435439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    PyObject *pyobj_ctxt;
29445439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29455439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL))
29465439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard        return(NULL);
29475439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29485439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
29495439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29505439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (URL != NULL) {
29515439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard	ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL);
29525439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    }
29535439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29545439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG
29555439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    printf("LocalCatalog: %s\n", URL);
29565439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif
29575439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
29585439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    Py_INCREF(Py_None);
29595439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    return (Py_None);
29605439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard}
29615439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
2962c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
2963c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2964c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************
2965c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
2966c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration                                   *
2967c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
2968c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/
2969c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2970c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct
2971c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2972c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *warn;
2973c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *error;
2974c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *arg;
2975c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt;
2976c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr;
2977c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2978c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
2979c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str)
2980c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2981c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
2982c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
2983c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
2984c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2985c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
2986c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
2987c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2988c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2989c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
2990c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2991c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
2992c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
2993c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
2994c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
2995c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
2996c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
2997c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2998c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
2999c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3000c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3001c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3002c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3003c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3004c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3005c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3006c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str)
3007c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3008c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
3009c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
3010c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3011c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3012c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3013c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3014c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3015c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3016c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
3017c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3018c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
3019c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3020c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
3021c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
3022c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
3023c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
3024c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3025c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
3026c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3027c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3028c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3029c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3030c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3031c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3032c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3033c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...)
3034c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3035c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3036c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3037c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3039c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3040c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3041c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3043c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...)
3044c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3045c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3046c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3047c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3049c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3050c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3051c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3052c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3053c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3054c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3055c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *py_retval;
3056c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_error;
3057c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_warn;
3058c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctx;
3059c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_arg = Py_None;
3060c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3061c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3062c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3063c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple
3064c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3065c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return (NULL);
3066c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3067c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3068c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3069c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3070c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3071c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx);
3072c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3073c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3074c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        py_retval = libxml_intWrap(-1);
3075c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(py_retval);
3076c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3077c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3078c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (pyCtxt == NULL)
3079c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3080c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* first time to set the error handlers */
3081c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt));
3082c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt == NULL) {
3083c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            py_retval = libxml_intWrap(-1);
3084c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            return(py_retval);
3085c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3086c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt));
3087c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3088c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3089c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    /* TODO: check warn and error is a function ! */
3090c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->error);
3091c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_error);
3092c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->error = pyobj_error;
3093c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3094c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->warn);
3095c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_warn);
3096c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->warn = pyobj_warn;
3097c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3098c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->arg);
3099c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_arg);
3100c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->arg = pyobj_arg;
3101c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3102c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt);
3103c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3104c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    py_retval = libxml_intWrap(1);
3105c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return (py_retval);
3106c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3107c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3108c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3109c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
3110c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3111c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3112c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctxt;
3113c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3114c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt))
3115c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(NULL);
3116c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt);
3117c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3118c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3119c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3120c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt != NULL)
3121c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        {
3122c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->error);
3123c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->warn);
3124c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->arg);
3125c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            xmlFree(pyCtxt);
3126c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3127c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3128c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3129c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGFreeValidCtxt(ctxt);
3130c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_INCREF(Py_None);
3131c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return(Py_None);
3132c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3133c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3134259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef struct
3135259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3136259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *warn;
3137259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *error;
3138259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *arg;
3139259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} xmlSchemaValidCtxtPyCtxt;
3140259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef xmlSchemaValidCtxtPyCtxt *xmlSchemaValidCtxtPyCtxtPtr;
3141259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3142259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3143259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericErrorFuncHandler(void *ctx, char *str)
3144259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3145259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3146259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3147259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3148259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3149259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3150259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValiditiyGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
3151259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3152259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3153259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3154259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3155259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3156259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3157259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3158259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3159259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->error, list);
3160259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3161259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3162259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3163259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3164259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3165259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3166259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3167259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3168259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3169259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3170259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericWarningFuncHandler(void *ctx, char *str)
3171259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3172259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3173259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3174259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3175259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3176259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3177259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3178259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3179259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3180259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3181259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3182259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3183259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3184259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3185259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3186259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->warn, list);
3187259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3188259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3189259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3190259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3191259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3192259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3193259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3194259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3195259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3196259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3197259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityErrorFunc(void *ctx, const char *msg, ...)
3198259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3199259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3200259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3201259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3202259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3203259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3204259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3205259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3206259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3207259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityWarningFunc(void *ctx, const char *msg, ...)
3208259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3209259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3210259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3211259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3212259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3213259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3214259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3215259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
32166ebf3c4c1a78406d15e8629b4a7b3d52549f0c8bDaniel VeillardPyObject *
3217259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3218259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3219259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *py_retval;
3220259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_error;
3221259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_warn;
3222259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctx;
3223259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_arg = Py_None;
3224259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3225259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3226259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3227259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple
3228259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		(args, (char *) "OOO|O:xmlSchemaSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3229259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return (NULL);
3230259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3231259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3232259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3233259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3234259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3235259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = PySchemaValidCtxt_Get(pyobj_ctx);
3236259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3237259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3238259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		py_retval = libxml_intWrap(-1);
3239259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(py_retval);
3240259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3241259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3242259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (pyCtxt == NULL)
3243259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3244259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* first time to set the error handlers */
3245259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		pyCtxt = xmlMalloc(sizeof(xmlSchemaValidCtxtPyCtxt));
3246259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt == NULL) {
3247259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			py_retval = libxml_intWrap(-1);
3248259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			return(py_retval);
3249259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3250259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		memset(pyCtxt, 0, sizeof(xmlSchemaValidCtxtPyCtxt));
3251259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3252259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3253259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	/* TODO: check warn and error is a function ! */
3254259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->error);
3255259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_error);
3256259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->error = pyobj_error;
3257259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3258259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->warn);
3259259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_warn);
3260259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->warn = pyobj_warn;
3261259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3262259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->arg);
3263259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_arg);
3264259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->arg = pyobj_arg;
3265259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3266259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaSetValidErrors(ctxt, &libxml_xmlSchemaValidityErrorFunc, &libxml_xmlSchemaValidityWarningFunc, pyCtxt);
3267259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3268259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	py_retval = libxml_intWrap(1);
3269259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(py_retval);
3270259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3271259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3272bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
3273259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaFreeValidCtxt(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3274259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3275259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3276259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3277259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctxt;
3278259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3279259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple(args, (char *)"O:xmlSchemaFreeValidCtxt", &pyobj_ctxt))
3280259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(NULL);
3281259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = (xmlSchemaValidCtxtPtr) PySchemaValidCtxt_Get(pyobj_ctxt);
3282259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3283259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3284259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3285259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt != NULL)
3286259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		{
3287259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->error);
3288259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->warn);
3289259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->arg);
3290259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			xmlFree(pyCtxt);
3291259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3292259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3293259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3294259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaFreeValidCtxt(ctxt);
3295259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_INCREF(Py_None);
3296259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(Py_None);
3297259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3298259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3299c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3300c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3301d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3302d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3303d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3304d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard/************************************************************************
3305d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3306d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * XML Canonicalization c14n                                            *
3307d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3308d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ************************************************************************/
3309d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3310d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3311d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPyxmlNodeSet_Convert(PyObject *py_nodeset, xmlNodeSetPtr *result)
3312d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3313d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodeSet;
3314d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3315d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3316d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_nodeset))
3317d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3318d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_nodeset))
3319d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3320d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_nodeset == Py_None) {
3321d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3322d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3323d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3324d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3325d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3326d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of nodes.");
3327d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3328d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3329d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3330d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3331d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet == NULL) {
3332d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3333d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3334d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3335d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3336d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeNr = 0;
3337d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeMax = (is_tuple
3338d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        ? PyTuple_GET_SIZE(py_nodeset)
3339d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        : PyList_GET_SIZE(py_nodeset));
3340d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeTab
3341d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        = (xmlNodePtr *) xmlMalloc (nodeSet->nodeMax
3342d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                    * sizeof(xmlNodePtr));
3343d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet->nodeTab == NULL) {
3344d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodeSet);
3345d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3346d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3347d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3348d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(nodeSet->nodeTab, 0 ,
3349d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard           nodeSet->nodeMax * sizeof(xmlNodePtr));
3350d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3351d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3352d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3353d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < nodeSet->nodeMax; ++idx) {
3354d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            xmlNodePtr pynode =
3355d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyxmlNode_Get (is_tuple
3356d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               ? PyTuple_GET_ITEM(py_nodeset, idx)
3357d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               : PyList_GET_ITEM(py_nodeset, idx));
3358d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (pynode)
3359d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                nodeSet->nodeTab[nodeSet->nodeNr++] = pynode;
3360d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3361d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3362d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = nodeSet;
3363d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3364d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3365d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3366d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3367d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPystringSet_Convert(PyObject *py_strings, xmlChar *** result)
3368d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3369d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    /* NOTE: the array should be freed, but the strings are shared
3370d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard       with the python strings and so must not be freed. */
3371d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3372d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar ** strings;
3373d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int count;
3375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int init_index = 0;
3376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_strings))
3378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_strings))
3380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_strings == Py_None) {
3382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of strings.");
3388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    count = (is_tuple
3392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             ? PyTuple_GET_SIZE(py_strings)
3393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             : PyList_GET_SIZE(py_strings));
3394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    strings = (xmlChar **) xmlMalloc(sizeof(xmlChar *) * count);
3396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3397d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (strings == NULL) {
3398d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3399d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3400d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3401d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3402d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(strings, 0 , sizeof(xmlChar *) * count);
3403d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3404d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3405d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3406d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < count; ++idx) {
3407d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            char* s = PyString_AsString
3408d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                (is_tuple
3409d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 ? PyTuple_GET_ITEM(py_strings, idx)
3410d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 : PyList_GET_ITEM(py_strings, idx));
3411d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (s)
3412d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                strings[init_index++] = (xmlChar *)s;
3413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            else {
3414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(strings);
3415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyErr_SetString(PyExc_TypeError,
3416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                "must be a tuple or list of strings.");
3417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                return -1;
3418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = strings;
3423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
3428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                         PyObject * args)
3429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_retval = NULL;
3431d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar *doc_txt;
3442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3445d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOi:C14NDocDumpMemory",
3446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments))
3451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3455d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3456d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3457d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3458d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3459d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3460d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3461d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3462d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3463d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3464d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3465d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3466d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3467d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3468d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3469d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3470d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3471d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3472d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3473d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocDumpMemory(doc,
3474d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  nodes,
3475d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  exclusive,
3476d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  prefixes,
3477d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  with_comments,
3478d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  &doc_txt);
3479d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3480d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3481d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3482d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3483d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3484d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3485d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3486d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3487d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3488d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3489d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3490d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3491d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3492d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocDumpMemory failure.");
3493d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3494d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3495d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3496d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        py_retval = PyString_FromStringAndSize((const char *) doc_txt,
3497d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                               result);
3498d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(doc_txt);
3499d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return py_retval;
3500d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3501d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3502d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3503d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3504d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
3505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                     PyObject * args)
3506d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3508d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_file;
3509d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3510d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3511d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3512d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3513d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3514d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3515d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3516d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3517d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    FILE * output;
3518d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlOutputBufferPtr buf;
3519d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3520d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3521d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int len;
3522d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3523d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOiO:C14NDocSaveTo",
3524d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3525d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3527d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments,
3529d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &py_file))
3530d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3531d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3532d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3533d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3534d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3535d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3536d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3537d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3538d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
3539d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3540d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3541d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3542d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    output = PyFile_AsFile(py_file);
3543d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (output == NULL) {
3544d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3545d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3546d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3547d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    buf = xmlOutputBufferCreateFile(output, NULL);
3548d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3549d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3550d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3551d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3552d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3553d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3554d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3555d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3556d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3557d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3558d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3559d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3560d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3561d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3562d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3563d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocSaveTo(doc,
3564d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              nodes,
3565d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              exclusive,
3566d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              prefixes,
3567d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              with_comments,
3568d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              buf);
3569d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3570d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3571d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3572d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3573d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3574d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3575d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3576d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3577d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3578d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3579d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3580d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    len = xmlOutputBufferClose(buf);
3581d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3582d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3583d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3584d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocSaveTo failure.");
3585d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3586d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3587d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else
3588d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return PyInt_FromLong((long) len);
3589d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3590d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3591d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3592d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3593d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3594c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brackstatic PyObject *
3595c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
3596c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack
3597c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    PyObject *obj;
3598c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    char *str;
3599d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3600c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj))
3601c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack        return NULL;
3602c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    str = PyCObject_GetDesc(obj);
3603c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    return Py_BuildValue((char *)"s", str);
3604c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack}
3605d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
360640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brackstatic PyObject *
360740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Bracklibxml_compareNodesEqual(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
360840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
360940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    PyObject *py_node1, *py_node2;
361040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    xmlNodePtr node1, node2;
361140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
361240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    if (!PyArg_ParseTuple(args, (char *)"OO:compareNodesEqual",
361340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack		&py_node1, &py_node2))
361440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack        return NULL;
361540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    /* To compare two node objects, we compare their pointer addresses */
361640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    node1 = PyxmlNode_Get(py_node1);
361740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    node2 = PyxmlNode_Get(py_node2);
361840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    if ( node1 == node2 )
361940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack        return Py_BuildValue((char *)"i", 1);
362040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    else
362140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack        return Py_BuildValue((char *)"i", 0);
362240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
362340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack}
362440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
362540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brackstatic PyObject *
362640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Bracklibxml_nodeHash(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
362740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
362840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    PyObject *py_node1;
362940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    xmlNodePtr node1;
363040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
363140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    if (!PyArg_ParseTuple(args, (char *)"O:nodeHash", &py_node1))
363240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack	    return NULL;
363340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    /* For simplicity, we use the node pointer address as a hash value */
363440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    node1 = PyxmlNode_Get(py_node1);
363540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
363640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    return PyLong_FromVoidPtr(node1);
363740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
363840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack}
363940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack
3640a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************
3641a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
3642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
3643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
3644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
3645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
364696fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
3647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "name", libxml_name, METH_VARARGS, NULL},
3648d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "children", libxml_children, METH_VARARGS, NULL},
3649d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "properties", libxml_properties, METH_VARARGS, NULL},
3650d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "last", libxml_last, METH_VARARGS, NULL},
3651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "prev", libxml_prev, METH_VARARGS, NULL},
3652d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "next", libxml_next, METH_VARARGS, NULL},
3653d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "parent", libxml_parent, METH_VARARGS, NULL},
3654d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "type", libxml_type, METH_VARARGS, NULL},
3655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "doc", libxml_doc, METH_VARARGS, NULL},
3656d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL},
3657f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    {(char *) "xmlNodeRemoveNsDef", libxml_xmlNodeRemoveNsDef, METH_VARARGS, NULL},
3658850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {(char *)"xmlSetValidErrors", libxml_xmlSetValidErrors, METH_VARARGS, NULL},
365925c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {(char *)"xmlFreeValidCtxt", libxml_xmlFreeValidCtxt, METH_VARARGS, NULL},
3660a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3661d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL},
3662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL},
3663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL},
36646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
36656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
36666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
3667263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL },
3668263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL },
3669a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
3670c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
3671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
36723e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard    {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL },
3673417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL },
3674417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL },
3675e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL },
3676438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#ifdef LIBXML_READER_ENABLED
367726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL },
367826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL },
367926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL },
3680438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#endif
36815439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL },
3682c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
3683c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL},
3684c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL},
3685eff45a92da861195551a2050487fcca0492cac7cDaniel Veillard    {(char *)"xmlSchemaSetValidErrors", libxml_xmlSchemaSetValidErrors, METH_VARARGS, NULL},
3686bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillard    {(char *)"xmlSchemaFreeValidCtxt", libxml_xmlSchemaFreeValidCtxt, METH_VARARGS, NULL},
3687c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3688d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3689d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3690d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocDumpMemory", libxml_C14NDocDumpMemory, METH_VARARGS, NULL},
3691d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocSaveTo", libxml_C14NDocSaveTo, METH_VARARGS, NULL},
3692d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3693d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3694c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL},
369540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    {(char *) "compareNodesEqual", libxml_compareNodesEqual, METH_VARARGS, NULL},
369640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack    {(char *) "nodeHash", libxml_nodeHash, METH_VARARGS, NULL},
3697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {NULL, NULL, 0, NULL}
3698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
3699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
37000fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37016361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void);
37020fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
37030fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard
3704d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid
3705d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void)
3706d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
3707af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    static int initialized = 0;
3708af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard
3709af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    if (initialized != 0)
3710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
37118e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
3712f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* intialize the python extension module */
3713f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    Py_InitModule((char *) "libxml2mod", libxmlMethods);
3714f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
3715f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* initialize libxml2 */
3716f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    xmlInitParser();
37175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
37186361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard
3719f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    initialized = 1;
3720f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
37210fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37220fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard    initlibxsltmod();
37230fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
3724d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
3725