libxml.c revision 4ea89f04ccd58de6cc4b83195252d0becba1fe69
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>
26d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h"
2796fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h"
28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
290d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf)
300d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a)
31e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#elif defined(WITH_TRIO)
32e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#include "trio.h"
33e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#define vsnprintf trio_vsnprintf
340d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif
350d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard
36d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
37797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */
38a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */
41c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */
42c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */
434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
44d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void);
45d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO:
48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks
50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO 								\
52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            __FILE__, __LINE__);
558e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack/*
568e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * the following vars are used for XPath extensions, but
578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * are also referenced within the parser cleanup routine.
588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */
598e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksInitialized = 0;
608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef struct libxml_xpathCallback {
628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlXPathContextPtr ctx;
638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlChar *name;
648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    xmlChar *ns_uri;
658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    PyObject *function;
668e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack} libxml_xpathCallback, *libxml_xpathCallbackPtr;
678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef libxml_xpathCallback libxml_xpathCallbackArray[];
688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksAllocd = 10;
698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic libxml_xpathCallbackArray *libxml_xpathCallbacks = NULL;
708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksNb = 0;
71c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************
734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *		Memory debug interface					*
754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/
774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
78c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#if 0
794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr);
804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size);
81d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size);
824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str);
83c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0;
864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0;
874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0;
894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL;
904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL;
914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL;
924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL;
934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
94f93a866079364a006189683eaa07f94c867389d1Daniel Veillardstatic void
95f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlErrorInitialize(void); /* forward declare */
96f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
974e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
98c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlMemoryUsed(PyObject * self ATTRIBUTE_UNUSED,
99c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack        PyObject * args ATTRIBUTE_UNUSED)
100529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard{
101529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    long ret;
102529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    PyObject *py_retval;
103529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
104529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    ret = xmlMemUsed();
105529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
106529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    py_retval = libxml_longWrap(ret);
107529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard    return (py_retval);
108529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard}
109529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard
110529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel VeillardPyObject *
111c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlDebugMemory(PyObject * self ATTRIBUTE_UNUSED, PyObject * args)
112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1134e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int activate;
1144e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *py_retval;
1154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    long ret;
1164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate))
118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
1194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1204e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY
1214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_xmlDebugMemory(%d) called\n", activate);
1224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (activate != 0) {
125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebug == 0) {
126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * First initialize the library and grab the old memory handlers
128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * and switch the library to memory debugging
129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlMemGet((xmlFreeFunc *) & freeFunc,
131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlMallocFunc *) & mallocFunc,
132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlReallocFunc *) & reallocFunc,
133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlStrdupFunc *) & strdupFunc);
134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) &&
135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (reallocFunc == xmlMemRealloc) &&
136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (strdupFunc == xmlMemoryStrdup)) {
137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
139f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                /*
140f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * cleanup first, because some memory has been
141f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * allocated with the non-debug malloc in xmlInitParser
142f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 * when the python module was imported
143f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                 */
144f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                xmlCleanupParser();
145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         xmlMemRealloc, xmlMemoryStrdup);
147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (ret < 0)
148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    goto error;
149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
150f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                /* reinitialize */
151f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                xmlInitParser();
152f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                libxml_xmlErrorInitialize();
153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (libxmlMemoryDebugActivated == 0) {
156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxmlMemoryAllocatedBase = xmlMemUsed();
157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebug = 1;
162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 1;
1634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    } else {
164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebugActivated == 1)
165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else
167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 0;
1694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  error:
1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    py_retval = libxml_longWrap(ret);
172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
176f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlPythonCleanupParser(PyObject *self ATTRIBUTE_UNUSED,
177f93a866079364a006189683eaa07f94c867389d1Daniel Veillard                              PyObject *args ATTRIBUTE_UNUSED) {
178f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
1798e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    int ix;
1808e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    long freed = -1;
181f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
182f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    if (libxmlMemoryDebug) {
183f93a866079364a006189683eaa07f94c867389d1Daniel Veillard        freed = xmlMemUsed();
184f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    }
185f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
186f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    xmlCleanupParser();
1878e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    /*
1888e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     * Need to confirm whether we really want to do this (required for
1898e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     * memcheck) in all cases...
1908e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack     */
1918e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
1928e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    if (libxml_xpathCallbacks != NULL) {	/* if ext funcs declared */
1938e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	for (ix=0; ix<libxml_xpathCallbacksNb; ix++) {
1948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	    if ((*libxml_xpathCallbacks)[ix].name != NULL)
1958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	        xmlFree((*libxml_xpathCallbacks)[ix].name);
1968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	    if ((*libxml_xpathCallbacks)[ix].ns_uri != NULL)
1978e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	        xmlFree((*libxml_xpathCallbacks)[ix].ns_uri);
1988e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	}
1998e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacksNb = 0;
2008e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack        xmlFree(libxml_xpathCallbacks);
2018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacks = NULL;
2028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    }
203f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
204f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    if (libxmlMemoryDebug) {
205f93a866079364a006189683eaa07f94c867389d1Daniel Veillard        freed -= xmlMemUsed();
206f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	libxmlMemoryAllocatedBase -= freed;
207f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	if (libxmlMemoryAllocatedBase < 0)
208f93a866079364a006189683eaa07f94c867389d1Daniel Veillard	    libxmlMemoryAllocatedBase = 0;
209f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    }
210f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
211f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    Py_INCREF(Py_None);
212f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    return(Py_None);
213f93a866079364a006189683eaa07f94c867389d1Daniel Veillard}
214f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
215f93a866079364a006189683eaa07f94c867389d1Daniel VeillardPyObject *
216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                     ATTRIBUTE_UNUSED PyObject * args)
218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
2204e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (libxmlMemoryDebug != 0)
221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlMemoryDump();
2224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    Py_INCREF(Py_None);
223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
2244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
228c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Handling Python FILE I/O at the C level			*
229c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	The raw I/O attack diectly the File objects, while the		*
230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	other routines address the ioWrapper instance instead		*
231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
234c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref:
236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) {
242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file, *ret;
243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileCloseUnref\n");
246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
249118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "close", (char *) "()");
250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
251c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(file);
254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw:
259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel
264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) {
269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileReadRaw: %d\n", len);
276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
277c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
279118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len);
280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
281c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is NULL\n");
282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is not a String\n");
293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead:
300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel.
305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) {
310c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileRead: %d\n", len);
317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
320118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len);
321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
322c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is NULL\n");
323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
327c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is not a String\n");
334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite:
341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel.
346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written
348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) {
351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *string;
3536cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *ret = NULL;
354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int written = -1;
355c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileWrite: %d\n", len);
358c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    string = PyString_FromStringAndSize(buffer, len);
362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (string == NULL) return(-1);
3636cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_write")) {
3646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)",
3656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
3666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "write")) {
3676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "write", (char *) "(O)",
3686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
3696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
370c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(string);
371c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is NULL\n");
373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyInt_Check(ret)) {
375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = (int) PyInt_AsLong(ret);
376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (ret == Py_None) {
378c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = len;
379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is not an Int nor None\n");
382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(written);
385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose:
389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) {
3956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file, *ret = NULL;
396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
397c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileClose\n");
399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
4026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_close")) {
4036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()");
4046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "flush")) {
4056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "flush", (char *) "()");
4066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
407c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
408c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
409c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
413a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
415c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile:
416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
424118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr
425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file,
426c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncodingHandlerPtr encoder) {
427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr ret;
428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocOutputBuffer(encoder);
432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->writecallback = xmlPythonFileWrite;
436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
441c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
442c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr buffer;
449c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
450c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate",
452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
455118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	handler = xmlFindCharEncodingHandler((const char *) encoding);
456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
457c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlOutputBufferCreatePythonFile(file, handler);
458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n");
460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlOutputBufferPtrWrap(buffer);
461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
4636cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard/**
4656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * libxml_outputBufferGetPythonFile:
4666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * @buffer:  the I/O buffer
4676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
4686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * read the Python I/O from the CObject
4696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
4706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * Returns the new parser output or NULL
4716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard */
4726cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardstatic PyObject *
4736cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self,
4746cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard                                    PyObject *args) {
4756cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *buffer;
4766cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file;
4776cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr obj;
4786cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4796cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile",
4806cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard			  &buffer))
4816cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(NULL);
4826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    obj = PyoutputBuffer_Get(buffer);
4846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj == NULL) {
4856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: obj == NULL\n");
4876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4896cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4906cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj->closecallback != xmlPythonFileClose) {
4916cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4926cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: not a python file wrapper\n");
4936cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4946cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4966cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    file = (PyObject *) obj->context;
4976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (file == NULL) {
4986cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
5006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
5016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    Py_INCREF(file);
5026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(file);
5036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
5046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
5066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
5076cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
5086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
5096cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
5106cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
5116cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5126cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out))
5136cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
5146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
515263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    /* Buffer may already have been destroyed elsewhere. This is harmless. */
516263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (out == NULL) {
517263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	Py_INCREF(Py_None);
518263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	return(Py_None);
519263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    }
5206cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5216cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferClose(out);
5226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
5236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
5246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
5256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
5276cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
5286cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
5296cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
5306cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
5316cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
5326cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5336cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out))
5346cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
5356cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
5366cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
5376cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferFlush(out);
5386cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
5396cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
5406cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
541263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
542263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject *
543263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
544263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *py_retval;
545263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int c_retval;
546263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlOutputBufferPtr buf;
547263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_buf;
548263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlDocPtr cur;
549263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_cur;
550263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    char * encoding;
551263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
552263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding))
553263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard        return(NULL);
554263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
555263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
556263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
557263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    c_retval = xmlSaveFileTo(buf, cur, encoding);
558263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	/* xmlSaveTo() freed the memory pointed to by buf, so record that in the
559263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	 * Python object. */
560263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
561263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
562263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    return(py_retval);
563263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard}
564263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
565263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject *
566263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
567263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *py_retval;
568263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int c_retval;
569263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlOutputBufferPtr buf;
570263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_buf;
571263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    xmlDocPtr cur;
572263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    PyObject *pyobj_cur;
573263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    char * encoding;
574263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    int format;
575263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
576263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format))
577263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard        return(NULL);
578263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf);
579263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur);
580263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard
581263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format);
582263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	/* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that
583263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	 * in the Python object */
584263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard	((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL;
585263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
586263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    return(py_retval);
587263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard}
588a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
589c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
590c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
591c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
592c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile:
593c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
594c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
595c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
596c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
597c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
598c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
599c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
600c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
601118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr
602c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file,
603c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncoding encoding) {
604c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr ret;
605c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
606c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
607c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
608c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocParserInputBuffer(encoding);
609c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
610c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
611c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
612c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->readcallback = xmlPythonFileRead;
613c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
614c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
615c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
616c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
617c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
618c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
619c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
620c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
621c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
622c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
623c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
624c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
625c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr buffer;
626c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
627c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
628c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate",
629c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
630c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
631c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
632118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	enc = xmlParseCharEncoding((const char *) encoding);
633c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
634c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlParserInputBufferCreatePythonFile(file, enc);
635c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
636c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n");
637c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlParserInputBufferPtrWrap(buffer);
638c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
639c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
640c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
641c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
642c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
643c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Providing the resolver at the Python level		*
644c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
645c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
646c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
647c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL;
648c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext;
649c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
650c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr
651c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID,
652c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			   xmlParserCtxtPtr ctxt) {
653c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputPtr result = NULL;
654c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (pythonExternalEntityLoaderObjext != NULL) {
655c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ret;
656c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ctxtobj;
657c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
658c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt);
659c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
660c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: ready to call\n");
661c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
662c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext,
664118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard		      (char *) "(ssO)", URL, ID, ctxtobj);
665e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	Py_XDECREF(ctxtobj);
666c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
667c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: result ");
668007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard	PyObject_Print(ret, stderr, 0);
669c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("\n");
670c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
672c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (ret != NULL) {
673118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	    if (PyObject_HasAttrString(ret, (char *) "read")) {
674c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		xmlParserInputBufferPtr buf;
675c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
676c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
677c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		if (buf != NULL) {
678c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->context = ret;
679c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->readcallback = xmlPythonFileReadRaw;
680c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->closecallback = xmlPythonFileCloseRaw;
681c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    result = xmlNewIOInputStream(ctxt, buf,
682c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			                         XML_CHAR_ENCODING_NONE);
683c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		}
6844ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#if 0
685c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    } else {
6864ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		if (URL != NULL)
6874ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		    printf("pythonExternalEntityLoader: can't read %s\n",
6884ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard		           URL);
6894ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#endif
690c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
691c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    if (result == NULL) {
692c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		Py_DECREF(ret);
693c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard	    } else if (URL != NULL) {
694c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack		result->filename = (char *) xmlStrdup((const xmlChar *)URL);
695c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard		result->directory = xmlParserGetDirectory((const char *) URL);
696c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
697c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	}
698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
699c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((result == NULL) && (defaultExternalEntityLoader != NULL)) {
700c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	result = defaultExternalEntityLoader(URL, ID, ctxt);
701c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(result);
703c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
704c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
707c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
708c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *loader;
709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader",
711c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&loader))
712c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
713c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
714c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
715c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("libxml_xmlSetEntityLoader\n");
716c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
717c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (defaultExternalEntityLoader == NULL)
718c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	defaultExternalEntityLoader = xmlGetExternalEntityLoader();
719c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
720c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    pythonExternalEntityLoaderObjext = loader;
721c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlSetExternalEntityLoader(pythonExternalEntityLoader);
722c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
723c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = PyInt_FromLong(0);
724c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
725c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
726c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
727c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
728c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
729c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
7303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
732d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
7331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
73433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
73533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
73633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
73733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
743d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
74533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
746797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
747797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartElement(%s) called\n", name);
748797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
750d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startElement"))
75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "start"))
75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
75433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
75933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (attrs == NULL) {
763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            dict = PyDict_New();
76433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
76533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                attrname = PyString_FromString((char *) attrs[i]);
76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
76933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    attrvalue = PyString_FromString((char *) attrs[i]);
77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
77833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
77933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "startElement",
781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
78233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
783d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "start",
784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
78733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
78833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
78933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
79033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
79233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
79333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
79633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
798797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
799797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartDocument() called\n");
800797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startDocument")) {
803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "startDocument", NULL);
805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
80733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
80833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
80933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
81033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
81133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
81233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
81433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
81533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
81633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
817797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
818797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndDocument() called\n");
819797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
821d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endDocument")) {
822d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "endDocument", NULL);
824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
82633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
82833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
82933caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
83033caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
83433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
83533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
83733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
83833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
83933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
840797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
841797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndElement(%s) called\n", name);
842797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
84333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endElement")) {
845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "endElement",
846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
84933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    } else if (PyObject_HasAttrString(handler, (char *) "end")) {
851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "end",
852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
855797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard        Py_XDECREF(result);
85633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
85933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
86033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
86333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
86433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
865797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
866797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonReference(%s) called\n", name);
867797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
86833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "reference")) {
870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "reference",
871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
87433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
87533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
87833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
87933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
88333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
885797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
886797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCharacters(%s, %d) called\n", ch, len);
887797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
88833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "characters"))
890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
89333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "characters",
896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "data",
899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
90233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
90633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
90733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
90933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
91133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
913797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
914797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);
915797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace"))
91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
92133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
92333caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
924d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler,
925d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "ignorableWhitespace",
926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "data",
930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
93233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
93333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
93533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
93633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
93933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
94033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
942797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
943797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonProcessingInstruction(%s, %s) called\n", target, data);
944797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
94533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
946d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) {
947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *)
948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     "processingInstruction",
949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ss", target, data);
95033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
95133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
95433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
95533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
95833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
960797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
961797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonComment(%s) called\n", value);
962797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "comment")) {
965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "comment", (char *) "s",
967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                value);
968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
97033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
97133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
97233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
97333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
97433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
97533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
97833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
97933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
982797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
983797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonWarning(%s) called\n", msg);
984797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "warning")) {
98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "warning", (char *) "s",
993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
99633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
99733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
100033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
100133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
100433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
100533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1008797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1009797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonError(%s) called\n", msg);
1010797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
101133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "error")) {
101333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
101433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "error", (char *) "s",
1019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
1020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
102233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
102333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
102533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
102633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
102733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
103033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
103133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1034797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1035797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonFatalError(%s) called\n", msg);
1036797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "fatalError")) {
103933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
104033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1043d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "fatalError",
1045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "s", buf);
1046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
104833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
104933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
105133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
105233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
105333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
1056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
105733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
105833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1059797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1060797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCdataBlock(%s, %d) called\n", ch, len);
1061797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
106233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "cdataBlock"))
1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "cdata"))
1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
106733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
1068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdataBlock",
1071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdata",
1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
107833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
107933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
108033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
108133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
108233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
108333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
108433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
108633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
108733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
108833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
108933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1090797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1091797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonExternalSubset(%s, %s, %s) called\n",
1092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, externalID, systemID);
1093797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
109433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "externalSubset")) {
109633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
1097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "externalSubset",
1098d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "sss", name, externalID,
1099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                systemID);
110033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
110133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
110233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
110333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
110433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
110533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
110633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
110733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
110833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
110933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
111033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
111133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
111233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
111333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
111433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "entityDecl")) {
1116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "entityDecl",
1117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sisss", name, type,
1118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     publicId, systemId, content);
1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
112133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
112233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
112333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
112433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
112833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
113133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
113333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
113433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
113533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
113633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "notationDecl")) {
1138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "notationDecl",
1139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, publicId,
1140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     systemId);
1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
114333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
114433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
114533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
114633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
114733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
114833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
114933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
115033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
115133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
115233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
1153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
115433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
115533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
115633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
115733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
115833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
115933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
116033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
116133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
116233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) {
116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
116533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
116633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
116733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
116833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
116933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
117033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
1171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            newName = PyString_FromString((char *) node->name);
117233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
117333caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
117433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
1175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "attributeDecl",
1176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ssiisO", elem, name, type,
1177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     def, defaultValue, nameList);
1178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
118033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
118133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
118233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
118333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
118433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
118533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
118633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
118733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
1188d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                  int type, ATTRIBUTE_UNUSED xmlElementContentPtr content)
118933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
119033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
119133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
119233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
119333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
119433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "elementDecl")) {
1196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* TODO: wrap in an elementContent object */
1197d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
1199d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = Py_None;
1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
1201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "elementDecl",
1202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "siO", name, type, obj);
1203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
120533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
120633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
120733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
120833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
120933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
121033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
121133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
121233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
121333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
121433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
121533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
121633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
121733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
121833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
121933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) {
1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "unparsedEntityDecl",
1223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "ssss", name, publicId, systemId,
1224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                notationName);
1225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
122733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
122833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
122933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
123033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
123133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
123233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
123333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
123433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
123533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
123633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
123733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1238797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1239797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonInternalSubset(%s, %s, %s) called\n",
1240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, ExternalID, SystemID);
1241797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
124233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "internalSubset")) {
1244d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "internalSubset",
1245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, ExternalID,
1246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     SystemID);
1247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
124933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
125033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
125133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
125233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
125333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
125433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
1255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonIsStandalone, */
1256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasInternalSubset, */
1257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasExternalSubset, */
1258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonResolveEntity, */
1259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetEntity, */
126033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
126133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
126233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
126333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
126433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
1265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* OBSOLETED pythonSetDocumentLocator, */
126633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
126733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
126833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
126933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
127033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
127133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
127233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
127333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
127433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
127533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
127633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
127733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
1278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetParameterEntity, */
127933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
128033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
1281a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    1,
1282a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,			/* TODO mograte to SAX2 */
1283a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,
1284871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack    NULL,
1285a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL
128633caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
1287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
12883ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
12893ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12903ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
12913ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12923ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
12931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
12941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1295d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           PyObject * args)
1297d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
12993ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
130133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
13023ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13033ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
13043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
13053ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk,
1308d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13101971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
13118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13141971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
13153ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
132033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
13213ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1323a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
13245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1326d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                            PyObject * args)
1328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1329656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
13314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1332d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
133333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
13344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
13364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
13374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1339d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk,
1340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
13474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1349d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
135233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
1353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                   XML_CHAR_ENCODING_NONE);
13544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1356656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1357656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1358656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1359656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
13604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
13614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13628d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
13658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    int recover;
1366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
13678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
13688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX,
1371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &URI, &recover))
1372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n",
1376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, recover);
13778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
13788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
13818d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
13828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
13838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
13848d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
1385f2531afe41a2232669302ceb49161d5689971ed9Daniel Veillard    xmlSAXUserParseFile(SAX, pyobj_SAX, URI);
13868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
13888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
13898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13908d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1393656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1394d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
1395d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
13968d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
13978d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI,
1401d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &encoding))
1402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
14038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14048d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
14058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n",
1406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, encoding);
14078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
14088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1410d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
14118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
14128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
14138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
14148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
14158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX);
14168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
1418656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1419656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1420656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1421656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
14228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
14238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
14255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
14275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
14295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
14315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
14325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1433e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */
1434ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard/*
1435ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * disabled the loop, the repeated call to vsnprintf without reset of ap
1436ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * in case the initial buffer was too small segfaulted on x86_64
1437ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * we now directly vsnprintf on a large buffer.
1438ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard */
1439e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char *
1440e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap)
1441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int chars;
1443e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    char *str;
1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1445ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    str = (char *) xmlMalloc(1000);
1446e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (str == NULL)
1447e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return NULL;
1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1449ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    chars = vsnprintf(str, 999, msg, ap);
1450ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    if (chars >= 998)
1451ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        str[999] = 0;
1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1453e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return str;
1454e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1455e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1456e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void
1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg,
1458e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard                           ...)
1459e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    va_list ap;
14615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
14625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
14635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
1464ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    char str[1000];
14655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
14675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
14685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
14695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
1472d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_start(ap, msg);
1473007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard        vfprintf(stderr, msg, ap);
1474d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(ap);
14755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1476e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_start(ap, msg);
1477ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        if (vsnprintf(str, 999, msg, ap) >= 998)
1478ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard	    str[999] = 0;
1479e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_end(ap);
1480d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        list = PyTuple_New(2);
1482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1484ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        message = libxml_charPtrConstWrap(str);
1485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 1, message);
1486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(list);
1488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(result);
14895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
14905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
14915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void)
1494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
14955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
14965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
14975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
14985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
1499781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
15005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
15015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1502c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
1504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                               PyObject * args)
1505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
15065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
15075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
15085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
15095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1511d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
1512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &pyobj_ctx))
1513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
15145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
15168e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx,
1517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_f);
15185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
15195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
15225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
15255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
15285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
15295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
15315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
15325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
15335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
15365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1538e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1539e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************
1540e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1541e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *                      Per parserCtxt error handler                    *
1542e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1543e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/
1544e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1545417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct
1546417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1547417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *f;
1548417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *arg;
1549417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt;
1550417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr;
1551417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1552417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1554e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1555e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *list;
1556e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *result;
1557417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1558e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1560e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR
1561850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
1562e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif
1563e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1564417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr)ctx;
1565417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1566e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1567417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
1568417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XINCREF(pyCtxt->arg);
1570417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrWrap(str));
1571417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, Py_None);
1573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
1575417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (result == NULL)
1576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {
1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyErr_Print();
1579e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(list);
1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(result);
1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1584417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1586417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1587417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap));
1591417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1592417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1593417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1594417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1595417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1596417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1597417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1598417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1599417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1600417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap));
1601417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1602417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1603417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1605417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...)
1606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...)
1616417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1618417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1622e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1623e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1624c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1625417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1626e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1627e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *py_retval;
1628e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1629e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1630e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1631e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_f;
1632e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_arg;
1633e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1634417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler",
1635e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard		          &pyobj_ctxt, &pyobj_f, &pyobj_arg))
1636e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1637e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1638e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (ctxt->_private == NULL) {
1639e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt));
1640e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	if (pyCtxt == NULL) {
1641e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    py_retval = libxml_intWrap(-1);
1642e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    return(py_retval);
1643e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	}
1644e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt));
1645e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	ctxt->_private = pyCtxt;
1646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1647e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    else {
1648417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1649e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1650e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    /* TODO: check f is a function ! */
1651417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->f);
1652e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_f);
1653417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->f = pyobj_f;
1654417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->arg);
1655e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_arg);
1656417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->arg = pyobj_arg;
1657e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1658417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (pyobj_f != Py_None) {
1659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler;
1660417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler;
1661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler;
1662417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler;
1663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1665417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = xmlParserError;
1666417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = xmlParserValidityError;
1667417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = xmlParserWarning;
1668417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = xmlParserValidityWarning;
1669417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1670e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1671e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    py_retval = libxml_intWrap(1);
1672e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return(py_retval);
1673e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1674e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1675c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1676417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1677e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1678417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *py_retval;
1679417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1680e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1681417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *pyobj_ctxt;
1682e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1683417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler",
1684417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard		          &pyobj_ctxt))
1685417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard        return(NULL);
1686417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1687417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    py_retval = PyTuple_New(2);
1688417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt->_private != NULL) {
1689417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1690e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1691417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
1692417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->f);
1693417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
1694417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->arg);
1695417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1696417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1697417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* no python error handler registered */
1698417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
1699417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1700417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
1701417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1702e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1703417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(py_retval);
1704e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1705e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1706c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1707417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
1708e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1709e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1710417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1711e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt))
1713e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1715417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1716417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt != NULL) {
1717417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private;
1718417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	if (pyCtxt) {
1719417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->f);
1720417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
1721417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    xmlFree(pyCtxt);
1722e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	}
1723417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	xmlFreeParserCtxt(ctxt);
1724e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1725e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1726417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1727417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(Py_None);
1728e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1729e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1730850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard/***
1731850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard * xmlValidCtxt stuff
1732850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard */
1733850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1734850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef struct
1735850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1736850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *warn;
1737850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *error;
1738850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *arg;
1739850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} xmlValidCtxtPyCtxt;
1740850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr;
1741850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1742850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1743850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1744850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1745850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1746850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1747850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1748850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1749850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1750850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1751850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1752850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1753850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1754850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1755850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1756850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1757850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1758850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1759850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
1760850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1761850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1762850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1763850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1764850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1765850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1766850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1767850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1768850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1769850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1770850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, int severity, char *str)
1771850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1772850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1773850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1774850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1775850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1776850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1777850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1778850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1779850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1780850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1781850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1782850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1783850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1784850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1785850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1786850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
1787850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1788850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1789850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1790850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1791850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1792850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1793850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1794850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1795850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1796850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1797850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1798850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1799850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1800850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1801850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1802850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1803850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1804850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1805850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1806850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1807850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1808850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1809850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1810850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1811850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1812850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1813850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1814850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1815850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1816850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic PyObject *
1817850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1818850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1819850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *py_retval;
1820850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_error;
1821850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_warn;
1822850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_ctx;
1823850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_arg = Py_None;
1824850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPtr ctxt;
1825850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1826850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1827850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (!PyArg_ParseTuple
1828850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
1829850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        return (NULL);
1830850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1831850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1832850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
1833850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1834850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1835850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt = PyValidCtxt_Get(pyobj_ctx);
1836850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt));
1837850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (pyCtxt == NULL) {
1838850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            py_retval = libxml_intWrap(-1);
1839850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            return(py_retval);
1840850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1841850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt));
1842850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1843850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1844850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    /* TODO: check warn and error is a function ! */
1845850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->error);
1846850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_error);
1847850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->error = pyobj_error;
1848850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1849850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->warn);
1850850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_warn);
1851850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->warn = pyobj_warn;
1852850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1853850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->arg);
1854850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_arg);
1855850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->arg = pyobj_arg;
1856850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1857850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->error = libxml_xmlValidCtxtErrorFuncHandler;
1858850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler;
1859850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->userData = pyCtxt;
1860850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1861850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    py_retval = libxml_intWrap(1);
1862850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    return (py_retval);
1863850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1864850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
186525c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1866bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
186725c90c589b256f0925f081198c1525134a491e31Daniel Veillardlibxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
186825c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPtr cur;
186925c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
187025c90c589b256f0925f081198c1525134a491e31Daniel Veillard    PyObject *pyobj_cur;
187125c90c589b256f0925f081198c1525134a491e31Daniel Veillard
187225c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur))
187325c90c589b256f0925f081198c1525134a491e31Daniel Veillard        return(NULL);
187425c90c589b256f0925f081198c1525134a491e31Daniel Veillard    cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur);
187525c90c589b256f0925f081198c1525134a491e31Daniel Veillard
187625c90c589b256f0925f081198c1525134a491e31Daniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData);
187725c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (pyCtxt != NULL)
187825c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {
187925c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->error);
188025c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->warn);
188125c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->arg);
188225c90c589b256f0925f081198c1525134a491e31Daniel Veillard            xmlFree(pyCtxt);
188325c90c589b256f0925f081198c1525134a491e31Daniel Veillard    }
188425c90c589b256f0925f081198c1525134a491e31Daniel Veillard
188525c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlFreeValidCtxt(cur);
188625c90c589b256f0925f081198c1525134a491e31Daniel Veillard    Py_INCREF(Py_None);
188725c90c589b256f0925f081198c1525134a491e31Daniel Veillard    return(Py_None);
188825c90c589b256f0925f081198c1525134a491e31Daniel Veillard}
188925c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
1891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
189226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *                      Per xmlTextReader error handler                 *
189326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
189426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/
189526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
189626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct
189726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
189826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *f;
189926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *arg;
190026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt;
190126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr;
190226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
190326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void
190426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg,
190526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard				  const char *msg,
1906417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  int severity,
1907417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  xmlTextReaderLocatorPtr locator)
190826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
190926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg;
191026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *list;
191126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *result;
191226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1913417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
191426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
191526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XINCREF(pyCtxt->arg);
191626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg));
1917417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1918417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator));
191926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
192026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (result == NULL)
192126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
1922417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
192326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyErr_Print();
192426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
192526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(list);
192626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(result);
192726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
192826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1929c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
193026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
193126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
193226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
193326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
193426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
193526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
193626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
193726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_f;
193826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_arg;
193926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
194026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
194126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg))
194226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
194326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
194426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* clear previous error handler */
194526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
194626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
1947c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
194826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
194926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
195026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
195126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
195226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
195326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
195426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	else {
195526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /*
195626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there already an arg, and it's not ours,
195726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there is definitely something wrong going on here...
195826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * we don't know how to free it, so we bail out...
195926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     */
196026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
196126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
196226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
196326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
196426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderSetErrorHandler(reader,NULL,NULL);
196526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* set new error handler */
196626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (pyobj_f != Py_None)
196726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
196826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt));
196926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	if (pyCtxt == NULL) {
197026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
197126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
197226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
197326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_f);
197426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->f = pyobj_f;
197526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_arg);
197626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->arg = pyobj_arg;
1977c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	xmlTextReaderSetErrorHandler(reader,
1978c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	    (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback,
1979c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	                             pyCtxt);
198026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
198126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
198226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = libxml_intWrap(1);
198326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
198426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
198526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1986c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
198726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
198826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
198926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
199026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
199126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
199226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
199326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
199426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
199526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
199626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader))
199726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
199826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
199926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
200026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = PyTuple_New(2);
2001c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) {
200226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* ok, it's our error handler! */
200326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
200426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
200526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->f);
200626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
200726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->arg);
200826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
200926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    else
201026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
201126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* f is null or it's not our error handler */
201226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
201326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
201426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
201526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
201626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
201726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
201826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
201926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2020c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
202126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
202226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
202326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
202426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
202526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
202626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
202726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2028157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader))
2029157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard        return(NULL);
2030157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyCObject_Check(pyobj_reader)) {
2031bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2032bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2033bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
203426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
2035bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    if (reader == NULL) {
2036bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2037bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2038bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
203926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
204026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
204126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
2042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
204326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
204426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
204526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
204626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
204726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
204826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
204926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/*
205026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * else, something wrong happened, because the error handler is
205126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * not owned by the python bindings...
205226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 */
205326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
205426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
205526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlFreeTextReader(reader);
205626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_INCREF(Py_None);
205726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(Py_None);
205826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
205926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
206026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************
206126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
2062a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
2063a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
2064a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
2065a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2066a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
2068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2069a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
2070a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
207170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
207270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
207370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
207470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
2075a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2076a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
207770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
2078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
207970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
208070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
208270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
208370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
2084a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name,
2086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ns_uri);
2087a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2088a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
208970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
209070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
209170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (                    /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
20948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack						(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
20958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack               (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
20968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					current_function = (*libxml_xpathCallbacks)[i].function;
2097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
209870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
209970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
2101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
2102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             name);
2103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
210470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
210570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
2106c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
2107c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
210805349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard    for (i = nargs - 1; i >= 0; i--) {
2109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = valuePop(ctxt);
2110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        cur = libxml_xmlXPathObjectPtrWrap(obj);
2111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, i + 1, cur);
2112a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2113a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
2114a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
2115a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2116a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
2117a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
2118a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2119a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2120a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
2121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name,
2122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                              const xmlChar * ns_uri)
2123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2124a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2126a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2127a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
2128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctxt, name, ns_uri);
2129a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
213070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
213170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
213270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
213370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
213470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
213570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
21378e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) &&
21388e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
21398e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (libxml_xmlXPathFuncCallback);
2141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2142a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (NULL);
2144a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2145a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2146a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void)
2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2149a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2150a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2151a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
2152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
2153a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2154a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2155a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
2156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
21578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc(
21588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
2159a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
21608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    for (i = 0; i < libxml_xpathCallbacksAllocd; i++) {
21618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ctx = NULL;
21628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].name = NULL;
21638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ns_uri = NULL;
21648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].function = NULL;
2165a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2166a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
2167a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2168a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2169a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
2170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self,
2171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                PyObject * args)
2172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2173a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
2174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
2175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
2176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
2177a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
2178a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
2179a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
2180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name,
2184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &ns_uri, &pyobj_f))
2185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
2188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacksInitialize();
2190a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
2191a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2192a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_intWrap(-1);
2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (py_retval);
2195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2196a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
2198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctx, name, ns_uri);
2199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
22018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	if ((ctx == (*libxml_xpathCallbacks)[i].ctx) &&
22028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
22038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XINCREF(pyobj_f);
22058e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            Py_XDECREF((*libxml_xpathCallbacks)[i].function);
22068e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (*libxml_xpathCallbacks)[i].function = pyobj_f;
2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = 1;
2208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            goto done;
2209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2210a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
22118e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) {
22128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			libxml_xpathCallbacksAllocd+=10;
22138e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc(
22148e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacks,
22158e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
22168e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    }
22178e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    i = libxml_xpathCallbacksNb++;
22188e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    Py_XINCREF(pyobj_f);
22198e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ctx = ctx;
22208e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].name = xmlStrdup(name);
22218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri);
22228e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].function = pyobj_f;
2223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        c_retval = 1;
22248e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
2225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  done:
2226a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
2227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2228a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2229a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
22301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
22311971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
2232d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
2233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
2234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
2235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:name", &obj))
2243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
2248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:{
2256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlDocPtr doc = (xmlDocPtr) cur;
2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = doc->URL;
2259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->name;
2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = ns->prefix;
2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->name;
2275d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2276d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
22771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2279d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2280d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2282d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
2288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj))
2290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
2295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2296d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2297d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2308d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->doc;
2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2315d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->doc;
2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
2319d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
2327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
2328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2329d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj))
2330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
2333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = cur->properties;
2334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
2335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = NULL;
2336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
2337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2347d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:next", &obj))
2348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
2353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2354d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2359d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2361d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) attr->next;
2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) ns->next;
2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->next;
2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2380d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2381d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2382d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2383d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2384d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj))
2392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
2397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2398d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2410faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard                res = (xmlNodePtr) attr->prev;
2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2416faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard            res = cur->prev;
2417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2420d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2424d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2430d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:children", &obj))
2431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
2436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2439d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2443d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2444d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->children;
2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2453d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2455d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->children;
2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2457d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2458d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2467d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2473d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
2479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2484d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->last;
2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->last;
2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj))
2516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
2521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2527d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2530d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->parent;
2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_DECL:
2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_START:
2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_END:
2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->parent;
2544d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2555d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const xmlChar *res = NULL;
2556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2557d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
2563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2565d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
2567d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "element";
2568d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
2570d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute";
2571d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
2573d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "text";
2574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "cdata";
2577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_ref";
2580d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity";
2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
2585d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "pi";
2586d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "comment";
2589d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_xml";
2592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "doctype";
2595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
2597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "fragment";
2598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "notation";
2601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
2603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_html";
2604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "dtd";
2607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
2609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "elem_decl";
2610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute_decl";
2613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_decl";
2616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "namespace";
2619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_start";
2622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
2624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_end";
2625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2628d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_docbook";
2629d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
2634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
26361971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
2641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
264236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
264336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
264436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
264536eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
264836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
264936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
265036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
265136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
265236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2653d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2654d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node))
2655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
265636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
265736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
265836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2659d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
266136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
266236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
266336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
266536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
266636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
266736eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2668f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillardlibxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2669f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard{
2670f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *py_retval;
2671f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr ns, prev;
2672f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNodePtr node;
2673f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *pyobj_node;
2674f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlChar *href;
2675f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr c_retval;
2676f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2677f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (!PyArg_ParseTuple
2678f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href))
2679f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (NULL);
2680f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
2681f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    ns = NULL;
2682f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2683f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2684f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        Py_INCREF(Py_None);
2685f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (Py_None);
2686f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2687f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2688f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (href == NULL) {
2689f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2690f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	node->nsDef = NULL;
2691f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	c_retval = 0;
2692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2693f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    else {
2694f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	prev = NULL;
2695f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	while (ns != NULL) {
2697f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    if (xmlStrEqual(ns->href, href)) {
2698f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		if (prev != NULL)
2699f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    prev->next = ns->next;
2700f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		else
2701f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    node->nsDef = ns->next;
2702f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		ns->next = NULL;
2703f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		c_retval = 0;
2704f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		break;
2705f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    }
2706f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    prev = ns;
2707f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    ns = ns->next;
2708f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	}
2709f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2710f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2711f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    c_retval = ns;
2712f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2713f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    return (py_retval);
2714f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard}
2715f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2716f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel VeillardPyObject *
2717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
271936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
272036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
272136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
272236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
272336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2724d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node))
2725d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
272636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
272736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2728e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard    if ((node == NULL) ||
2729e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard        ((node->type != XML_ELEMENT_NODE) &&
2730e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard	 (node->type != XML_ATTRIBUTE_NODE))) {
2731d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
273336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
273436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
273536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
273736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
273836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2739a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
274036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
274136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
27421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *			Serialization front-end				*
27431e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
27441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/
27451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2747d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2748d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
27491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_retval = NULL;
27501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlChar *c_retval;
27511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
27521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
27531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
27551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
27561e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
27571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node,
2759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &encoding, &format))
2760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
27611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
27621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
27631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
27661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
27671e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len,
2770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                  (const char *) encoding, format);
2771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
2772656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
27731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2774d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferPtr buf;
2775d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlCharEncodingHandlerPtr handler = NULL;
2776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2778d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL)
2779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        encoding = (const char *) htmlGetMetaEncoding(doc);
2781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL) {
2783d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler(encoding);
2784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL) {
2785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /*
2791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         * Fallback to HTML or ASCII when the encoding is unspecified
2792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         */
2793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2795d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
2797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf = xmlAllocOutputBuffer(handler);
2799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf == NULL) {
2800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferFlush(buf);
2805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf->conv != NULL) {
2806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->conv->use;
2807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->conv->content;
2808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->conv->content = NULL;
2809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->buffer->use;
2811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->buffer->content;
2812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->buffer->content = NULL;
2813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (void) xmlOutputBufferClose(buf);
2815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
2816656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
28171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
281895af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack        if (node->type == XML_NAMESPACE_DECL)
281995af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	    doc = NULL;
282095af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	else
282195af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack            doc = node->doc;
2822a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard        if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) {
2823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2833d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2852656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
2853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL)
2858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
2860d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * Fallback to HTML or ASCII when the encoding is unspecified
2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
2871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("HTML");
2873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("ascii");
2875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2894656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
2895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
28991e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
29011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
29021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2903d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
29061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_file = NULL;
29071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    FILE *output;
29081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
29091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
29101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
29121e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
29131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
29141e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlOutputBufferPtr buf;
29151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
29161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node,
2918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &py_file, &encoding, &format))
2919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
29201e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
29211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2923d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29241e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29251e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
2926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    output = PyFile_AsFile(py_file);
29291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (output == NULL) {
2930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29311e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29321e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
29351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
29371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2938d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
29391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2940656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
29411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2942d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding == NULL)
2943d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
29441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2945656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
29461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (encoding != NULL) {
2947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        handler = xmlFindCharEncodingHandler(encoding);
2948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL) {
2949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (PyInt_FromLong((long) -1));
2950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
29511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2953d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2954d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2955d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2956d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
29571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    buf = xmlOutputBufferCreateFile(output, handler);
29601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlSaveFormatFileTo(buf, doc, encoding, format);
2962656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
29631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
29661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
2969656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
29701e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
29731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (PyInt_FromLong((long) len));
29751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
2976a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
29771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************
29791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
2980a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *			Extra stuff					*
2981a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2982a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/
2983a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject *
2984d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2985d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2986a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    PyObject *py_retval;
2987d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    xmlChar *name;
2988a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    xmlNodePtr node;
2989a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name))
2991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2992a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    node = (xmlNodePtr) xmlNewNode(NULL, name);
29933b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG
2994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("NewNode: %s : %p\n", name, (void *) node);
29953b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif
2996a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2997a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    if (node == NULL) {
2998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
3000a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    }
3001a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    py_retval = libxml_xmlNodePtrWrap(node);
3002d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
3003a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard}
3004a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
30055439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30065439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************
30075439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
30085439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *			Local Catalog stuff				*
30095439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
30105439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/
30115439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject *
30125439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
30135439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{
30145439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlChar *URL;
30155439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlParserCtxtPtr ctxt;
30165439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    PyObject *pyobj_ctxt;
30175439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30185439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL))
30195439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard        return(NULL);
30205439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30215439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
30225439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30235439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (URL != NULL) {
30245439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard	ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL);
30255439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    }
30265439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30275439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG
30285439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    printf("LocalCatalog: %s\n", URL);
30295439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif
30305439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30315439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    Py_INCREF(Py_None);
30325439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    return (Py_None);
30335439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard}
30345439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
3035c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
3036c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3037c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************
3038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
3039c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration                                   *
3040c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
3041c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/
3042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3043c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct
3044c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3045c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *warn;
3046c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *error;
3047c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *arg;
3048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt;
3049c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr;
3050c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3051c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3052c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str)
3053c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3054c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
3055c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
3056c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3057c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3058c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3059c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
3060c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3061c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3062c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
3063c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3064c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
3065c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3066c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
3067c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
3068c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
3069c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
3070c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3071c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
3072c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3073c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3074c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3075c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3076c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3077c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3078c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3079c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str)
3080c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3081c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
3082c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
3083c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3084c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3085c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3086c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3087c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3088c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3089c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
3090c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3091c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
3092c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3093c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
3094c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
3095c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
3096c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
3097c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3098c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
3099c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3100c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3101c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3102c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3103c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3104c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3105c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3106c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...)
3107c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3108c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3109c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3110c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3111c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3112c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3113c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3114c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3115c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3116c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...)
3117c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3118c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3119c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3120c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3121c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3122c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3123c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3124c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3125c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3126c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3127c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3128c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *py_retval;
3129c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_error;
3130c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_warn;
3131c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctx;
3132c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_arg = Py_None;
3133c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3134c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3135c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3136c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple
3137c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3138c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return (NULL);
3139c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3140c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3141c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3142c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3143c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3144c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx);
3145c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3146c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3147c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        py_retval = libxml_intWrap(-1);
3148c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(py_retval);
3149c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3150c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3151c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (pyCtxt == NULL)
3152c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3153c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* first time to set the error handlers */
3154c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt));
3155c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt == NULL) {
3156c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            py_retval = libxml_intWrap(-1);
3157c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            return(py_retval);
3158c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3159c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt));
3160c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3161c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3162c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    /* TODO: check warn and error is a function ! */
3163c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->error);
3164c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_error);
3165c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->error = pyobj_error;
3166c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3167c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->warn);
3168c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_warn);
3169c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->warn = pyobj_warn;
3170c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3171c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->arg);
3172c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_arg);
3173c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->arg = pyobj_arg;
3174c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3175c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt);
3176c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3177c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    py_retval = libxml_intWrap(1);
3178c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return (py_retval);
3179c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3180c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3181c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3182c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
3183c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3184c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3185c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctxt;
3186c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3187c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt))
3188c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(NULL);
3189c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt);
3190c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3191c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3192c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3193c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt != NULL)
3194c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        {
3195c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->error);
3196c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->warn);
3197c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->arg);
3198c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            xmlFree(pyCtxt);
3199c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3200c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3201c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3202c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGFreeValidCtxt(ctxt);
3203c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_INCREF(Py_None);
3204c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return(Py_None);
3205c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3206c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3207259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef struct
3208259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3209259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *warn;
3210259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *error;
3211259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *arg;
3212259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} xmlSchemaValidCtxtPyCtxt;
3213259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef xmlSchemaValidCtxtPyCtxt *xmlSchemaValidCtxtPyCtxtPtr;
3214259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3215259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3216259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericErrorFuncHandler(void *ctx, char *str)
3217259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3218259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3219259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3220259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3221259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3222259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3223259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValiditiyGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
3224259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3225259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3226259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3227259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3228259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3229259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3230259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3231259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3232259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->error, list);
3233259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3234259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3235259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3236259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3237259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3238259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3239259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3240259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3241259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3242259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3243259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericWarningFuncHandler(void *ctx, char *str)
3244259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3245259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3246259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3247259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3248259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3249259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3250259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3251259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3252259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3253259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3254259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3255259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3256259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3257259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3258259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3259259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->warn, list);
3260259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3261259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3262259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3263259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3264259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3265259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3266259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3267259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3268259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3269259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3270259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityErrorFunc(void *ctx, const char *msg, ...)
3271259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3272259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3273259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3274259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3275259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3276259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3277259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3278259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3279259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3280259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityWarningFunc(void *ctx, const char *msg, ...)
3281259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3282259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3283259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3284259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3285259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3286259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3287259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3288259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
32896ebf3c4c1a78406d15e8629b4a7b3d52549f0c8bDaniel VeillardPyObject *
3290259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3291259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3292259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *py_retval;
3293259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_error;
3294259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_warn;
3295259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctx;
3296259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_arg = Py_None;
3297259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3298259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3299259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3300259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple
3301259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		(args, (char *) "OOO|O:xmlSchemaSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3302259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return (NULL);
3303259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3304259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3305259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3306259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3307259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3308259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = PySchemaValidCtxt_Get(pyobj_ctx);
3309259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3310259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3311259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		py_retval = libxml_intWrap(-1);
3312259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(py_retval);
3313259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3314259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3315259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (pyCtxt == NULL)
3316259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3317259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* first time to set the error handlers */
3318259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		pyCtxt = xmlMalloc(sizeof(xmlSchemaValidCtxtPyCtxt));
3319259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt == NULL) {
3320259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			py_retval = libxml_intWrap(-1);
3321259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			return(py_retval);
3322259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3323259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		memset(pyCtxt, 0, sizeof(xmlSchemaValidCtxtPyCtxt));
3324259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3325259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3326259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	/* TODO: check warn and error is a function ! */
3327259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->error);
3328259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_error);
3329259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->error = pyobj_error;
3330259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3331259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->warn);
3332259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_warn);
3333259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->warn = pyobj_warn;
3334259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3335259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->arg);
3336259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_arg);
3337259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->arg = pyobj_arg;
3338259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3339259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaSetValidErrors(ctxt, &libxml_xmlSchemaValidityErrorFunc, &libxml_xmlSchemaValidityWarningFunc, pyCtxt);
3340259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3341259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	py_retval = libxml_intWrap(1);
3342259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(py_retval);
3343259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3344259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3345bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
3346259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaFreeValidCtxt(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3347259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3348259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3349259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3350259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctxt;
3351259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3352259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple(args, (char *)"O:xmlSchemaFreeValidCtxt", &pyobj_ctxt))
3353259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(NULL);
3354259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = (xmlSchemaValidCtxtPtr) PySchemaValidCtxt_Get(pyobj_ctxt);
3355259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3356259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3357259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3358259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt != NULL)
3359259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		{
3360259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->error);
3361259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->warn);
3362259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->arg);
3363259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			xmlFree(pyCtxt);
3364259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3365259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3366259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3367259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaFreeValidCtxt(ctxt);
3368259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_INCREF(Py_None);
3369259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(Py_None);
3370259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3371259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3372c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3373c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard/************************************************************************
3378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * XML Canonicalization c14n                                            *
3380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ************************************************************************/
3382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPyxmlNodeSet_Convert(PyObject *py_nodeset, xmlNodeSetPtr *result)
3385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodeSet;
3387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_nodeset))
3390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_nodeset))
3392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_nodeset == Py_None) {
3394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3397d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3398d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3399d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of nodes.");
3400d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3401d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3402d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3403d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3404d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet == NULL) {
3405d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3406d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3407d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3408d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3409d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeNr = 0;
3410d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeMax = (is_tuple
3411d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        ? PyTuple_GET_SIZE(py_nodeset)
3412d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        : PyList_GET_SIZE(py_nodeset));
3413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeTab
3414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        = (xmlNodePtr *) xmlMalloc (nodeSet->nodeMax
3415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                    * sizeof(xmlNodePtr));
3416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet->nodeTab == NULL) {
3417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodeSet);
3418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(nodeSet->nodeTab, 0 ,
3422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard           nodeSet->nodeMax * sizeof(xmlNodePtr));
3423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < nodeSet->nodeMax; ++idx) {
3427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            xmlNodePtr pynode =
3428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyxmlNode_Get (is_tuple
3429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               ? PyTuple_GET_ITEM(py_nodeset, idx)
3430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               : PyList_GET_ITEM(py_nodeset, idx));
3431d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (pynode)
3432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                nodeSet->nodeTab[nodeSet->nodeNr++] = pynode;
3433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = nodeSet;
3436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPystringSet_Convert(PyObject *py_strings, xmlChar *** result)
3441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    /* NOTE: the array should be freed, but the strings are shared
3443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard       with the python strings and so must not be freed. */
3444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3445d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar ** strings;
3446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int count;
3448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int init_index = 0;
3449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_strings))
3451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_strings))
3453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_strings == Py_None) {
3455d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3456d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3457d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3458d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3459d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3460d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of strings.");
3461d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3462d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3463d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3464d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    count = (is_tuple
3465d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             ? PyTuple_GET_SIZE(py_strings)
3466d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             : PyList_GET_SIZE(py_strings));
3467d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3468d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    strings = (xmlChar **) xmlMalloc(sizeof(xmlChar *) * count);
3469d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3470d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (strings == NULL) {
3471d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3472d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3473d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3474d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3475d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(strings, 0 , sizeof(xmlChar *) * count);
3476d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3477d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3478d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3479d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < count; ++idx) {
3480d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            char* s = PyString_AsString
3481d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                (is_tuple
3482d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 ? PyTuple_GET_ITEM(py_strings, idx)
3483d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 : PyList_GET_ITEM(py_strings, idx));
3484d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (s)
3485d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                strings[init_index++] = (xmlChar *)s;
3486d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            else {
3487d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(strings);
3488d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyErr_SetString(PyExc_TypeError,
3489d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                "must be a tuple or list of strings.");
3490d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                return -1;
3491d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3492d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3493d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3494d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3495d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = strings;
3496d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3497d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3498d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3499d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3500d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
3501d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                         PyObject * args)
3502d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3503d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_retval = NULL;
3504d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3506d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3508d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3509d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3510d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3511d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3512d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3513d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3514d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar *doc_txt;
3515d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3516d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3517d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3518d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOi:C14NDocDumpMemory",
3519d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3520d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3521d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3522d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3523d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments))
3524d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3525d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3527d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3529d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3530d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3531d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3532d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3533d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3534d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3535d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3536d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3537d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3538d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3539d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3540d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3541d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3542d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3543d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3544d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3545d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3546d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocDumpMemory(doc,
3547d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  nodes,
3548d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  exclusive,
3549d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  prefixes,
3550d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  with_comments,
3551d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  &doc_txt);
3552d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3553d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3554d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3555d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3556d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3557d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3558d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3559d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3560d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3561d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3562d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3563d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3564d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3565d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocDumpMemory failure.");
3566d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3567d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3568d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3569d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        py_retval = PyString_FromStringAndSize((const char *) doc_txt,
3570d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                               result);
3571d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(doc_txt);
3572d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return py_retval;
3573d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3574d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3575d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3576d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3577d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
3578d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                     PyObject * args)
3579d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3580d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3581d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_file;
3582d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3583d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3584d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3585d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3586d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3587d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3588d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3589d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3590d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    FILE * output;
3591d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlOutputBufferPtr buf;
3592d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3593d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3594d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int len;
3595d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3596d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOiO:C14NDocSaveTo",
3597d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3598d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3599d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3600d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3601d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments,
3602d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &py_file))
3603d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3604d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3605d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3606d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3607d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3608d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3609d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3610d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3611d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
3612d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3613d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3614d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3615d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    output = PyFile_AsFile(py_file);
3616d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (output == NULL) {
3617d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3618d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3619d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3620d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    buf = xmlOutputBufferCreateFile(output, NULL);
3621d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3622d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3623d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3624d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3625d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3626d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3627d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3628d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3629d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3630d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3631d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3632d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3633d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3634d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3635d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3636d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocSaveTo(doc,
3637d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              nodes,
3638d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              exclusive,
3639d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              prefixes,
3640d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              with_comments,
3641d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              buf);
3642d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3643d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3644d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3645d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3646d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3647d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3648d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3649d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3650d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3651d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3652d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3653d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    len = xmlOutputBufferClose(buf);
3654d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3655d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3656d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3657d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocSaveTo failure.");
3658d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3659d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3660d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else
3661d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return PyInt_FromLong((long) len);
3662d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3663d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3664d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3665d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3666d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3667c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brackstatic PyObject *
3668c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
3669c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack
3670c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    PyObject *obj;
3671c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    char *str;
3672d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3673c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj))
3674c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack        return NULL;
3675c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    str = PyCObject_GetDesc(obj);
3676c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    return Py_BuildValue((char *)"s", str);
3677c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack}
3678d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3679a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************
3680a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
3681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
3682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
3683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
3684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
368596fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
3686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "name", libxml_name, METH_VARARGS, NULL},
3687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "children", libxml_children, METH_VARARGS, NULL},
3688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "properties", libxml_properties, METH_VARARGS, NULL},
3689d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "last", libxml_last, METH_VARARGS, NULL},
3690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "prev", libxml_prev, METH_VARARGS, NULL},
3691d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "next", libxml_next, METH_VARARGS, NULL},
3692d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "parent", libxml_parent, METH_VARARGS, NULL},
3693d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "type", libxml_type, METH_VARARGS, NULL},
3694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "doc", libxml_doc, METH_VARARGS, NULL},
3695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL},
3696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    {(char *) "xmlNodeRemoveNsDef", libxml_xmlNodeRemoveNsDef, METH_VARARGS, NULL},
3697850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {(char *)"xmlSetValidErrors", libxml_xmlSetValidErrors, METH_VARARGS, NULL},
369825c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {(char *)"xmlFreeValidCtxt", libxml_xmlFreeValidCtxt, METH_VARARGS, NULL},
3699a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3700d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL},
3701d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL},
3702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL},
37036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
37046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
37056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
3706263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL },
3707263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL },
3708a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
3709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
3710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
37113e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard    {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL },
3712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL },
3713417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL },
3714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL },
371526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL },
371626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL },
371726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL },
37185439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL },
3719c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
3720c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL},
3721c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL},
3722eff45a92da861195551a2050487fcca0492cac7cDaniel Veillard    {(char *)"xmlSchemaSetValidErrors", libxml_xmlSchemaSetValidErrors, METH_VARARGS, NULL},
3723bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillard    {(char *)"xmlSchemaFreeValidCtxt", libxml_xmlSchemaFreeValidCtxt, METH_VARARGS, NULL},
3724c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3725d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3726d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3727d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocDumpMemory", libxml_C14NDocDumpMemory, METH_VARARGS, NULL},
3728d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocSaveTo", libxml_C14NDocSaveTo, METH_VARARGS, NULL},
3729d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3730d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3731c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL},
3732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {NULL, NULL, 0, NULL}
3733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
3734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
37350fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37366361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void);
37370fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
37380fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard
3739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid
3740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void)
3741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
3742af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    static int initialized = 0;
3743af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard
3744af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    if (initialized != 0)
3745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
37468e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
3747f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* intialize the python extension module */
3748f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    Py_InitModule((char *) "libxml2mod", libxmlMethods);
3749f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
3750f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* initialize libxml2 */
3751f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    xmlInitParser();
37525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
37536361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard
3754f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    initialized = 1;
3755f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
37560fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37570fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard    initlibxsltmod();
37580fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
3759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
3760