libxml.c revision f9cf6f5a01527406ed0bcbcf5a180d85b5e771de
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		}
684c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    } else {
685c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		printf("pythonExternalEntityLoader: can't read\n");
686c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
687c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    if (result == NULL) {
688c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		Py_DECREF(ret);
689c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard	    } else if (URL != NULL) {
690c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack		result->filename = (char *) xmlStrdup((const xmlChar *)URL);
691c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard		result->directory = xmlParserGetDirectory((const char *) URL);
692c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
693c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	}
694c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
695c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((result == NULL) && (defaultExternalEntityLoader != NULL)) {
696c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	result = defaultExternalEntityLoader(URL, ID, ctxt);
697c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(result);
699c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
700c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
701c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
703c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
704c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *loader;
705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader",
707c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&loader))
708c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
711c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("libxml_xmlSetEntityLoader\n");
712c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
713c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (defaultExternalEntityLoader == NULL)
714c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	defaultExternalEntityLoader = xmlGetExternalEntityLoader();
715c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
716c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    pythonExternalEntityLoaderObjext = loader;
717c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlSetExternalEntityLoader(pythonExternalEntityLoader);
718c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
719c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = PyInt_FromLong(0);
720c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
721c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
722c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
723c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
724c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
725c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
7263ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
728d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
7291971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
73033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
73133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
73233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
73333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
73433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
73533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
73633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
73733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
742797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
743797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartElement(%s) called\n", name);
744797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
74533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startElement"))
74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
748d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "start"))
74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
75033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
75233caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
75433caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (attrs == NULL) {
759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            dict = PyDict_New();
76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
76233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                attrname = PyString_FromString((char *) attrs[i]);
76433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
76533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
766d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    attrvalue = PyString_FromString((char *) attrs[i]);
76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
76933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
77033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "startElement",
777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
77833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "start",
780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
78433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
78533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
78633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
78733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
78833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
78933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
79033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
79233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
79333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
794797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
795797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartDocument() called\n");
796797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startDocument")) {
799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "startDocument", NULL);
801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
80333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
80433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
80533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
80633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
80733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
80833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
80933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
81033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
81133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
81233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
813797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
814797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndDocument() called\n");
815797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
81633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
817d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endDocument")) {
818d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
819d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "endDocument", NULL);
820d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
821d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
82233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
82333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
82533caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
82633caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
82833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
82933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
83033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
83133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
83433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
83533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
836797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
837797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndElement(%s) called\n", name);
838797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
83933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endElement")) {
841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "endElement",
842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
84533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    } else if (PyObject_HasAttrString(handler, (char *) "end")) {
847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "end",
848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
851797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard        Py_XDECREF(result);
85233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
85333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
85433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
85533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
85633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
85933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
86033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
861797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
862797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonReference(%s) called\n", name);
863797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
86433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "reference")) {
866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "reference",
867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
87033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
87133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
87233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
87333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
87433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
87533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
881797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
882797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCharacters(%s, %d) called\n", ch, len);
883797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "characters"))
886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
88933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "characters",
892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "data",
895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
89833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
89933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
90033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
90133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
90233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
90333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
90733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
909797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
910797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);
911797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace"))
91433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
915d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
91733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
91933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
920d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler,
921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "ignorableWhitespace",
922d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
92333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
924d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
925d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "data",
926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
92833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
92933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
93033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
93133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
93233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
93333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
93633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
938797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
939797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonProcessingInstruction(%s, %s) called\n", target, data);
940797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
942d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) {
943d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *)
944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     "processingInstruction",
945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ss", target, data);
94633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
94733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
94833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
94933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
95033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
95133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
95433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
95533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
956797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
957797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonComment(%s) called\n", value);
958797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "comment")) {
961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
962d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "comment", (char *) "s",
963d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                value);
964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
96633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
96733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
96833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
96933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
97033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
97133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
97233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
97333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
97433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
978797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
979797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonWarning(%s) called\n", msg);
980797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
982d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "warning")) {
98333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
985d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
987d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
988d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "warning", (char *) "s",
989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
99233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
99333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
99433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
99533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
99633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
99733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
100033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
100133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1004797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1005797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonError(%s) called\n", msg);
1006797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1008d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "error")) {
100933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
101033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1011d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "error", (char *) "s",
1015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
101833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
101933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
102033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
102133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
102233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
102333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
102533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
102633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
102733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1030797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1031797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonFatalError(%s) called\n", msg);
1032797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1034d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "fatalError")) {
103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
1037d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
1038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
1039d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1040d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "fatalError",
1041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "s", buf);
1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1043d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
104533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
104633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
104733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
104833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
104933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
105133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
1052d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
105333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1055797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1056797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCdataBlock(%s, %d) called\n", ch, len);
1057797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
105833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1059d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "cdataBlock"))
1060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
1061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "cdata"))
1062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
106333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdataBlock",
1067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
1070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdata",
1071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
107433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
107533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
107633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
107733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
107833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
107933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
108033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
108133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
108233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
108333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
108433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1086797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1087797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonExternalSubset(%s, %s, %s) called\n",
1088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, externalID, systemID);
1089797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
109033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1091d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "externalSubset")) {
109233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
1093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "externalSubset",
1094d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "sss", name, externalID,
1095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                systemID);
109633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
109733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
109833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
109933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
110033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
110133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
110233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
110333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
110433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
110533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
110633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
110733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
110833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
110933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
111033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "entityDecl")) {
1112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "entityDecl",
1113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sisss", name, type,
1114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     publicId, systemId, content);
1115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
111733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
111833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
111933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
112033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
112433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
112533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
112733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
112833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
112933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
113133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "notationDecl")) {
1134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "notationDecl",
1135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, publicId,
1136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     systemId);
1137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
113933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
114033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
114133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
114233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
114333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
114433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
114533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
114633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
114733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
114833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
1149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
115033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
115133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
115233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
115333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
115433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
115533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
115633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
115733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
115833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) {
116033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
116133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
116233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
116333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
116533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
116633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
1167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            newName = PyString_FromString((char *) node->name);
116833caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
116933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
117033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
1171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "attributeDecl",
1172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ssiisO", elem, name, type,
1173d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     def, defaultValue, nameList);
1174d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
117633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
117733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
117833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
117933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
118033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
118133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
118233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
118333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
1184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                  int type, ATTRIBUTE_UNUSED xmlElementContentPtr content)
118533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
118633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
118733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
118833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
118933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
119033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "elementDecl")) {
1192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* TODO: wrap in an elementContent object */
1193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
1195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = Py_None;
1196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
1197d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "elementDecl",
1198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "siO", name, type, obj);
1199d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
120133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
120233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
120333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
120433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
120533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
120633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
120733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
120833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
120933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
121033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
121133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
121233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
121333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
121433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
121533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) {
1217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "unparsedEntityDecl",
1219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "ssss", name, publicId, systemId,
1220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                notationName);
1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
122333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
122433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
122533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
122633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
122733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
122833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
122933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
123033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
123133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
123233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
123333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1234797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1235797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonInternalSubset(%s, %s, %s) called\n",
1236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, ExternalID, SystemID);
1237797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
123833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1239d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "internalSubset")) {
1240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "internalSubset",
1241d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, ExternalID,
1242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     SystemID);
1243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1244d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
124533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
124633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
124733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
124833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
124933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
125033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
1251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonIsStandalone, */
1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasInternalSubset, */
1253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasExternalSubset, */
1254d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonResolveEntity, */
1255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetEntity, */
125633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
125733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
125833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
125933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
126033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
1261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* OBSOLETED pythonSetDocumentLocator, */
126233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
126333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
126433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
126533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
126633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
126733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
126833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
126933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
127033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
127133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
127233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
127333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
1274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetParameterEntity, */
127533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
127633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
1277a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    1,
1278a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,			/* TODO mograte to SAX2 */
1279a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,
1280871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack    NULL,
1281a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL
128233caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
1283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
12843ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
12853ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12863ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
12873ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
12883ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
12891971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
12901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1291d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1292d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           PyObject * args)
1293d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1294d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
12953ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
129733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
12983ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
12993ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
13003ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
13013ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk,
1304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13061971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
13078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13101971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
13113ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
131633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
13173ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1319a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
13205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                            PyObject * args)
1324d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1325656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1326d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
13274e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
132933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
13304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
13324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
13334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1334d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk,
1336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
13424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
13434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
13474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
134833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
1349d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                   XML_CHAR_ENCODING_NONE);
13504e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1351d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1352656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1353656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1354656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1355656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
13564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
13574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
13588d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1359d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
13618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    int recover;
1362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
13638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
13648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX,
1367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &URI, &recover))
1368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
13718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n",
1372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, recover);
13738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
13748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
13778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
13788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
13798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
13808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
1381f2531afe41a2232669302ceb49161d5689971ed9Daniel Veillard    xmlSAXUserParseFile(SAX, pyobj_SAX, URI);
13828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
13848d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
13858d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
13868d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1388d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1389656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
1390d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
1391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
13928d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
13938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
13948d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1395d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI,
1397d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &encoding))
1398d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13998d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14008d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
14018d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n",
1402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, encoding);
14038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
14048d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
14078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
14088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
14098d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
14108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
14118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX);
14128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
1414656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else
1415656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    Py_INCREF(Py_None);
1416656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard    return (Py_None);
1417656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
14188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
14198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
14205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
14215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
14235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
14245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
14255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
14275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
14285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1429e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */
1430ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard/*
1431ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * disabled the loop, the repeated call to vsnprintf without reset of ap
1432ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * in case the initial buffer was too small segfaulted on x86_64
1433ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * we now directly vsnprintf on a large buffer.
1434ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard */
1435e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char *
1436e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap)
1437d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int chars;
1439e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    char *str;
1440e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1441ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    str = (char *) xmlMalloc(1000);
1442e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (str == NULL)
1443e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return NULL;
1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1445ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    chars = vsnprintf(str, 999, msg, ap);
1446ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    if (chars >= 998)
1447ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        str[999] = 0;
1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1449e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return str;
1450e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1451e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void
1453e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg,
1454e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard                           ...)
1455e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    va_list ap;
14575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
14585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
14595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
1460ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard    char str[1000];
14615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
14635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
14645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
14655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
1468d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_start(ap, msg);
1469007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard        vfprintf(stderr, msg, ap);
1470d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(ap);
14715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1472e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_start(ap, msg);
1473ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        if (vsnprintf(str, 999, msg, ap) >= 998)
1474ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard	    str[999] = 0;
1475e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_end(ap);
1476d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1477d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        list = PyTuple_New(2);
1478d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1480ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard        message = libxml_charPtrConstWrap(str);
1481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 1, message);
1482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(list);
1484d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(result);
14855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
14865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
14875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
14885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void)
1490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
14915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
14925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
14935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
14945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
1495781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
14965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
14975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1498c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
1500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                               PyObject * args)
1501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
15025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
15035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
15045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
15055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
1508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &pyobj_ctx))
1509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
15105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
15128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx,
1513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_f);
15145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
15155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
15185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1520d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
15215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
15225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
15245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
15255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
15275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
15285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
15295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
15305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
15325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1534e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1535e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************
1536e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1537e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *                      Per parserCtxt error handler                    *
1538e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1539e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/
1540e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1541417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct
1542417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1543417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *f;
1544417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *arg;
1545417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt;
1546417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr;
1547417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1548417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1549417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1550e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1551e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *list;
1552e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *result;
1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1554e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1555e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1556e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR
1557850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
1558e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif
1559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1560417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr)ctx;
1561417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1562e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1563417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
1564417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
1565417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XINCREF(pyCtxt->arg);
1566417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrWrap(str));
1567417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1568417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, Py_None);
1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1570417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
1571417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (result == NULL)
1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {
1573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyErr_Print();
1575e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(list);
1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(result);
1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1579417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1584417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1586417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap));
1587417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1591417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1592417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1593417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1594417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1595417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1596417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap));
1597417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1598417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1599417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1600417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1601417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...)
1602417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1603417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1605417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...)
1612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1616417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1618e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1619e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1620c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1622e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1623e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *py_retval;
1624e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1625e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1626e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1627e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_f;
1628e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_arg;
1629e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1630417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler",
1631e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard		          &pyobj_ctxt, &pyobj_f, &pyobj_arg))
1632e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1633e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1634e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (ctxt->_private == NULL) {
1635e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt));
1636e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	if (pyCtxt == NULL) {
1637e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    py_retval = libxml_intWrap(-1);
1638e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    return(py_retval);
1639e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	}
1640e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt));
1641e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	ctxt->_private = pyCtxt;
1642e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1643e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    else {
1644417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1645e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    /* TODO: check f is a function ! */
1647417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->f);
1648e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_f);
1649417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->f = pyobj_f;
1650417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->arg);
1651e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_arg);
1652417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->arg = pyobj_arg;
1653e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1654417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (pyobj_f != Py_None) {
1655417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler;
1656417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler;
1657417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler;
1658417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler;
1659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1660417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = xmlParserError;
1662417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = xmlParserValidityError;
1663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = xmlParserWarning;
1664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = xmlParserValidityWarning;
1665417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1666e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1667e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    py_retval = libxml_intWrap(1);
1668e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return(py_retval);
1669e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1670e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1671c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1672417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1673e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1674417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *py_retval;
1675417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1676e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1677417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *pyobj_ctxt;
1678e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1679417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler",
1680417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard		          &pyobj_ctxt))
1681417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard        return(NULL);
1682417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1683417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    py_retval = PyTuple_New(2);
1684417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt->_private != NULL) {
1685417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1686e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1687417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
1688417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->f);
1689417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
1690417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->arg);
1691417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1692417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1693417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* no python error handler registered */
1694417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
1695417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1696417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
1697417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1698e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1699417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(py_retval);
1700e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1701e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1702c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1703417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
1704e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1705e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1706417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1707e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1708417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt))
1709e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1710e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1711417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt != NULL) {
1713417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private;
1714417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	if (pyCtxt) {
1715417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->f);
1716417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
1717417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    xmlFree(pyCtxt);
1718e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	}
1719417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	xmlFreeParserCtxt(ctxt);
1720e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1721e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1722417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1723417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(Py_None);
1724e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1725e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1726850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard/***
1727850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard * xmlValidCtxt stuff
1728850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard */
1729850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1730850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef struct
1731850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1732850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *warn;
1733850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *error;
1734850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *arg;
1735850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} xmlValidCtxtPyCtxt;
1736850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr;
1737850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1738850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1739850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1740850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1741850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1742850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1743850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1744850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1745850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1746850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1747850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1748850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1749850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1750850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1751850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1752850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1753850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1754850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1755850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
1756850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1757850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1758850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1759850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1760850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1761850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1762850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1763850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1764850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1765850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1766850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, int severity, char *str)
1767850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1768850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *list;
1769850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *result;
1770850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1771850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1772850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1773850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str);
1774850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1775850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1776850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx;
1777850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1778850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    list = PyTuple_New(2);
1779850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
1780850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
1781850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyCtxt->arg);
1782850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
1783850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (result == NULL)
1784850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {
1785850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	/* TODO: manage for the exception to be propagated... */
1786850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard	PyErr_Print();
1787850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1788850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(list);
1789850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(result);
1790850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1791850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1792850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1793850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1794850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1795850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1796850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1797850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1798850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1799850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1800850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1801850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1802850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void
1803850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1804850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1805850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_list ap;
1806850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1807850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_start(ap, msg);
1808850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1809850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    va_end(ap);
1810850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1811850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1812850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic PyObject *
1813850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1814850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{
1815850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *py_retval;
1816850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_error;
1817850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_warn;
1818850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_ctx;
1819850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    PyObject *pyobj_arg = Py_None;
1820850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPtr ctxt;
1821850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
1822850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1823850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (!PyArg_ParseTuple
1824850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
1825850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard        return (NULL);
1826850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1827850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR
1828850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
1829850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif
1830850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1831850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt = PyValidCtxt_Get(pyobj_ctx);
1832850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt));
1833850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    if (pyCtxt == NULL) {
1834850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            py_retval = libxml_intWrap(-1);
1835850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard            return(py_retval);
1836850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    }
1837850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt));
1838850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1839850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1840850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    /* TODO: check warn and error is a function ! */
1841850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->error);
1842850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_error);
1843850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->error = pyobj_error;
1844850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1845850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->warn);
1846850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_warn);
1847850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->warn = pyobj_warn;
1848850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1849850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XDECREF(pyCtxt->arg);
1850850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    Py_XINCREF(pyobj_arg);
1851850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    pyCtxt->arg = pyobj_arg;
1852850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1853850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->error = libxml_xmlValidCtxtErrorFuncHandler;
1854850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler;
1855850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    ctxt->userData = pyCtxt;
1856850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
1857850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    py_retval = libxml_intWrap(1);
1858850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    return (py_retval);
1859850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard}
1860850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard
186125c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1862bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
186325c90c589b256f0925f081198c1525134a491e31Daniel Veillardlibxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
186425c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPtr cur;
186525c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlValidCtxtPyCtxtPtr pyCtxt;
186625c90c589b256f0925f081198c1525134a491e31Daniel Veillard    PyObject *pyobj_cur;
186725c90c589b256f0925f081198c1525134a491e31Daniel Veillard
186825c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur))
186925c90c589b256f0925f081198c1525134a491e31Daniel Veillard        return(NULL);
187025c90c589b256f0925f081198c1525134a491e31Daniel Veillard    cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur);
187125c90c589b256f0925f081198c1525134a491e31Daniel Veillard
187225c90c589b256f0925f081198c1525134a491e31Daniel Veillard    pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData);
187325c90c589b256f0925f081198c1525134a491e31Daniel Veillard    if (pyCtxt != NULL)
187425c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {
187525c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->error);
187625c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->warn);
187725c90c589b256f0925f081198c1525134a491e31Daniel Veillard            Py_XDECREF(pyCtxt->arg);
187825c90c589b256f0925f081198c1525134a491e31Daniel Veillard            xmlFree(pyCtxt);
187925c90c589b256f0925f081198c1525134a491e31Daniel Veillard    }
188025c90c589b256f0925f081198c1525134a491e31Daniel Veillard
188125c90c589b256f0925f081198c1525134a491e31Daniel Veillard    xmlFreeValidCtxt(cur);
188225c90c589b256f0925f081198c1525134a491e31Daniel Veillard    Py_INCREF(Py_None);
188325c90c589b256f0925f081198c1525134a491e31Daniel Veillard    return(Py_None);
188425c90c589b256f0925f081198c1525134a491e31Daniel Veillard}
188525c90c589b256f0925f081198c1525134a491e31Daniel Veillard
1886a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
1887a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
188826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *                      Per xmlTextReader error handler                 *
188926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
189026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/
189126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
189226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct
189326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
189426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *f;
189526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *arg;
189626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt;
189726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr;
189826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
189926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void
190026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg,
190126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard				  const char *msg,
1902417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  int severity,
1903417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  xmlTextReaderLocatorPtr locator)
190426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
190526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg;
190626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *list;
190726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *result;
190826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1909417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
191026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
191126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XINCREF(pyCtxt->arg);
191226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg));
1913417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1914417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator));
191526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
191626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (result == NULL)
191726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
1918417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
191926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyErr_Print();
192026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
192126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(list);
192226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(result);
192326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
192426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1925c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
192626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
192726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
192826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
192926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
193026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
193126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
193226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
193326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_f;
193426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_arg;
193526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
193626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
193726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg))
193826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
193926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
194026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* clear previous error handler */
194126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
194226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
1943c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
194426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
194526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
194626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
194726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
194826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
194926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
195026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	else {
195126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /*
195226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there already an arg, and it's not ours,
195326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there is definitely something wrong going on here...
195426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * we don't know how to free it, so we bail out...
195526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     */
195626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
195726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
195826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
195926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
196026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderSetErrorHandler(reader,NULL,NULL);
196126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* set new error handler */
196226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (pyobj_f != Py_None)
196326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
196426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt));
196526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	if (pyCtxt == NULL) {
196626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
196726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
196826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
196926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_f);
197026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->f = pyobj_f;
197126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_arg);
197226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->arg = pyobj_arg;
1973c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	xmlTextReaderSetErrorHandler(reader,
1974c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	    (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback,
1975c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	                             pyCtxt);
197626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
197726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
197826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = libxml_intWrap(1);
197926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
198026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
198126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1982c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
198326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
198426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
198526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
198626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
198726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
198826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
198926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
199026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
199126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
199226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader))
199326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
199426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
199526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
199626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = PyTuple_New(2);
1997c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) {
199826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* ok, it's our error handler! */
199926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
200026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
200126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->f);
200226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
200326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->arg);
200426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
200526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    else
200626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
200726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* f is null or it's not our error handler */
200826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
200926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
201026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
201126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
201226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
201326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
201426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
201526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2016c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
201726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
201826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
201926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
202026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
202126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
202226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
202326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
2024157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader))
2025157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard        return(NULL);
2026157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyCObject_Check(pyobj_reader)) {
2027bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2028bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2029bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
203026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
2031bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    if (reader == NULL) {
2032bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
2033bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
2034bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
203526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
203626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
203726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
2038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
203926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
204026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
204126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
204226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
204326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
204426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
204526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/*
204626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * else, something wrong happened, because the error handler is
204726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * not owned by the python bindings...
204826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 */
204926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
205026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
205126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlFreeTextReader(reader);
205226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_INCREF(Py_None);
205326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(Py_None);
205426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
205526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
205626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************
205726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
2058a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
2059a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
2060a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
2061a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2062a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
2064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2065a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
2066a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
206770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
206870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
206970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
207070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
2071a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2072a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
207370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
2074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
207570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
207670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
2077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
207870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
207970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
2080a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name,
2082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ns_uri);
2083a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2084a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
208570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
208670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
208770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
2089d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (                    /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
20908e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack						(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
20918e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack               (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
20928e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					current_function = (*libxml_xpathCallbacks)[i].function;
2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
209470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
209570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
2096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
2097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
2098d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             name);
2099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
210070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
210170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
2102c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
2103c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
210405349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard    for (i = nargs - 1; i >= 0; i--) {
2105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = valuePop(ctxt);
2106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        cur = libxml_xmlXPathObjectPtrWrap(obj);
2107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, i + 1, cur);
2108a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2109a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
2110a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
2111a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2112a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
2113a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
2114a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2115a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2116a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
2117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name,
2118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                              const xmlChar * ns_uri)
2119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2120a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2122a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2123a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
2124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctxt, name, ns_uri);
2125a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
212670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
212770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
212870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
212970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
213070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
213170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
2132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
21338e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) &&
21348e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
21358e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack					(xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (libxml_xmlXPathFuncCallback);
2137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2138a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (NULL);
2140a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2141a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2142a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void)
2144d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2145a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2146a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2147a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
2149a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2150a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2151a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
2152a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
21538e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc(
21548e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
2155a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
21568e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    for (i = 0; i < libxml_xpathCallbacksAllocd; i++) {
21578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ctx = NULL;
21588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].name = NULL;
21598e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].ns_uri = NULL;
21608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			(*libxml_xpathCallbacks)[i].function = NULL;
2161a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2162a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
2163a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2164a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2165a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
2166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self,
2167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                PyObject * args)
2168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2169a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
2170a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
2171a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
2172a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
2173a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
2174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
2175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
2176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
2177a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name,
2180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &ns_uri, &pyobj_f))
2181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2182a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2183a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
2184a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
2185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacksInitialize();
2186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
2187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
2188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_intWrap(-1);
2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (py_retval);
2191a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
2192a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
2193a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctx, name, ns_uri);
2195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
21978e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	if ((ctx == (*libxml_xpathCallbacks)[i].ctx) &&
21988e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) &&
21998e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) {
2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XINCREF(pyobj_f);
22018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            Py_XDECREF((*libxml_xpathCallbacks)[i].function);
22028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack            (*libxml_xpathCallbacks)[i].function = pyobj_f;
2203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = 1;
2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            goto done;
2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2206a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
22078e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) {
22088e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack			libxml_xpathCallbacksAllocd+=10;
22098e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack	libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc(
22108e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacks,
22118e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack		libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback));
22128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    }
22138e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    i = libxml_xpathCallbacksNb++;
22148e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    Py_XINCREF(pyobj_f);
22158e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ctx = ctx;
22168e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].name = xmlStrdup(name);
22178e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri);
22188e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack    (*libxml_xpathCallbacks)[i].function = pyobj_f;
2219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        c_retval = 1;
22208e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
2221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  done:
2222a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
2223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2224a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
2225a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
22261971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
22271971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
2228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
2229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
2230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
2231d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2236d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
2237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2238d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:name", &obj))
2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:{
2252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlDocPtr doc = (xmlDocPtr) cur;
2253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2254d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = doc->URL;
2255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->name;
2261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = ns->prefix;
2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->name;
2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
22731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2274d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2276d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2277d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2280d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2282d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
2284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2285d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj))
2286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2289d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
2291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2293d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2294d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2299d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2301d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->doc;
2305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2308d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->doc;
2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2313d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2314d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
2315d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2316d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2319d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
2323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
2324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2325d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj))
2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
2329d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = cur->properties;
2330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
2331d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = NULL;
2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
2333d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:next", &obj))
2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2351d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2352d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2357d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2359d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2361d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) attr->next;
2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) ns->next;
2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->next;
2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2374d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2375d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2376d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2377d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2380d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2382d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2383d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2384d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2385d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj))
2388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
2393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2395d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2398d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2401d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2403d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2406faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard                res = (xmlNodePtr) attr->prev;
2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2410d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2412faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard            res = cur->prev;
2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2414d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2415d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2416d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2417d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2420d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2424d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2426d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:children", &obj))
2427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
2432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2434d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2435d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2436d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2437d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2439d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2444d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2445d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->children;
2447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->children;
2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2453d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2455d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2463d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2469d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
2475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2477d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2478d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2480d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->last;
2490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->last;
2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2511d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj))
2512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
2517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2519d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2520d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2527d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2528d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2530d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->parent;
2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_DECL:
2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_START:
2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_END:
2536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->parent;
2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2547d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const xmlChar *res = NULL;
2552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
2559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2561d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
2563d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "element";
2564d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
2566d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute";
2567d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
2569d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "text";
2570d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
2572d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "cdata";
2573d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
2575d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_ref";
2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
2578d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity";
2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
2581d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "pi";
2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
2584d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "comment";
2585d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
2587d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_xml";
2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
2590d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "doctype";
2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
2593d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "fragment";
2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
2596d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "notation";
2597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
2599d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_html";
2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
2602d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "dtd";
2603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
2605d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "elem_decl";
2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
2608d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute_decl";
2609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
2611d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_decl";
2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
2614d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "namespace";
2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
2617d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_start";
2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
2620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_end";
2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_docbook";
2625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
2630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
26321971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
2637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
263836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
263936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
264036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
264136eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
264436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
264536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
264636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
264736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
264836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2649d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2650d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node))
2651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
265236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
265336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
265436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2656d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
265736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
265836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
265936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
266136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
266236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
266336eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2664f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillardlibxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2665f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard{
2666f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *py_retval;
2667f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr ns, prev;
2668f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNodePtr node;
2669f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    PyObject *pyobj_node;
2670f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlChar *href;
2671f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    xmlNsPtr c_retval;
2672f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2673f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (!PyArg_ParseTuple
2674f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href))
2675f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (NULL);
2676f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
2677f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    ns = NULL;
2678f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2679f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2680f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        Py_INCREF(Py_None);
2681f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard        return (Py_None);
2682f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2683f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2684f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    if (href == NULL) {
2685f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2686f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	node->nsDef = NULL;
2687f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	c_retval = 0;
2688f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2689f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    else {
2690f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	prev = NULL;
2691f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	ns = node->nsDef;
2692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	while (ns != NULL) {
2693f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    if (xmlStrEqual(ns->href, href)) {
2694f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		if (prev != NULL)
2695f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    prev->next = ns->next;
2696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		else
2697f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		    node->nsDef = ns->next;
2698f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		ns->next = NULL;
2699f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		c_retval = 0;
2700f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard		break;
2701f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    }
2702f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    prev = ns;
2703f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	    ns = ns->next;
2704f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard	}
2705f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    }
2706f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2707f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    c_retval = ns;
2708f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2709f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    return (py_retval);
2710f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard}
2711f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard
2712f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel VeillardPyObject *
2713d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2714d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
271536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
271636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
271736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
271836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
271936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2720d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node))
2721d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
272236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
272336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2724e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard    if ((node == NULL) ||
2725e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard        ((node->type != XML_ELEMENT_NODE) &&
2726e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard	 (node->type != XML_ATTRIBUTE_NODE))) {
2727d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2728d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
272936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
273036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
273136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
273336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
273436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2735a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
273636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
273736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
27381e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *			Serialization front-end				*
27391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
27401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/
27411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2742d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2743d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2744d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
27451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_retval = NULL;
27461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlChar *c_retval;
27471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
27481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
27491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2750d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
27511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
27521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
27531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node,
2755d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &encoding, &format))
2756d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
27571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
27581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
27591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
27621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
27631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len,
2766d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                  (const char *) encoding, format);
2767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
2768656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
27691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferPtr buf;
2771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlCharEncodingHandlerPtr handler = NULL;
2772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2773d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2774d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL)
2775d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        encoding = (const char *) htmlGetMetaEncoding(doc);
2777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2778d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL) {
2779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler(encoding);
2780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL) {
2781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2783d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /*
2787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         * Fallback to HTML or ASCII when the encoding is unspecified
2788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         */
2789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
2793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf = xmlAllocOutputBuffer(handler);
2795d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf == NULL) {
2796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferFlush(buf);
2801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf->conv != NULL) {
2802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->conv->use;
2803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->conv->content;
2804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->conv->content = NULL;
2805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->buffer->use;
2807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->buffer->content;
2808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->buffer->content = NULL;
2809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (void) xmlOutputBufferClose(buf);
2811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
2812656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
28131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
281495af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack        if (node->type == XML_NAMESPACE_DECL)
281595af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	    doc = NULL;
281695af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack	else
281795af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack            doc = node->doc;
2818a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard        if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) {
2819d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2820d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2821d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2822d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2833d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2848656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
2849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL)
2854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
2856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2860d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * Fallback to HTML or ASCII when the encoding is unspecified
2866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
2867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("HTML");
2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("ascii");
2871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2890656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
2891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
28951e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
28971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
28981e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
29021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_file = NULL;
29031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    FILE *output;
29041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
29051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
29061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2907d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
29081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
29091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
29101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlOutputBufferPtr buf;
29111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
29121e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node,
2914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &py_file, &encoding, &format))
2915d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
29161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
29171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29181e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29201e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
2922d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29231e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29241e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    output = PyFile_AsFile(py_file);
29251e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (output == NULL) {
2926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
29271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
29311e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
29331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
29351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2936656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
29371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2938d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding == NULL)
2939d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
29401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2941656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
29421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (encoding != NULL) {
2943d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        handler = xmlFindCharEncodingHandler(encoding);
2944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL) {
2945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (PyInt_FromLong((long) -1));
2946d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
29471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2952d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
29531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
29541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    buf = xmlOutputBufferCreateFile(output, handler);
29561e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2957d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlSaveFormatFileTo(buf, doc, encoding, format);
2958656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED
29591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
29621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2963d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
2965656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */
29661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
29691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (PyInt_FromLong((long) len));
29711e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
2972a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
29731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
29741e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************
29751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
2976a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *			Extra stuff					*
2977a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2978a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/
2979a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject *
2980d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2981d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2982a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    PyObject *py_retval;
2983d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    xmlChar *name;
2984a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    xmlNodePtr node;
2985a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name))
2987d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2988a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    node = (xmlNodePtr) xmlNewNode(NULL, name);
29893b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG
2990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("NewNode: %s : %p\n", name, (void *) node);
29913b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif
2992a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2993a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    if (node == NULL) {
2994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
2996a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    }
2997a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    py_retval = libxml_xmlNodePtrWrap(node);
2998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2999a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard}
3000a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
30015439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30025439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************
30035439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
30045439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *			Local Catalog stuff				*
30055439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
30065439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/
30075439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject *
30085439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
30095439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{
30105439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlChar *URL;
30115439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlParserCtxtPtr ctxt;
30125439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    PyObject *pyobj_ctxt;
30135439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30145439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL))
30155439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard        return(NULL);
30165439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30175439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
30185439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30195439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (URL != NULL) {
30205439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard	ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL);
30215439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    }
30225439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30235439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG
30245439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    printf("LocalCatalog: %s\n", URL);
30255439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif
30265439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
30275439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    Py_INCREF(Py_None);
30285439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    return (Py_None);
30295439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard}
30305439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
3031c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
3032c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3033c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************
3034c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
3035c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration                                   *
3036c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
3037c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/
3038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3039c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct
3040c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3041c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *warn;
3042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *error;
3043c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *arg;
3044c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt;
3045c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr;
3046c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3047c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str)
3049c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3050c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
3051c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
3052c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3053c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3054c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3055c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
3056c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3057c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3058c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
3059c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3060c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
3061c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3062c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
3063c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
3064c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
3065c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
3066c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3067c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
3068c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3069c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3070c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3071c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3072c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3073c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3074c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3075c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str)
3076c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3077c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
3078c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
3079c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3080c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3081c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3082c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3083c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3084c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3085c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
3086c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3087c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
3088c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3089c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
3090c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
3091c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
3092c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
3093c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3094c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
3095c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
3096c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3097c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
3098c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
3099c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3100c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3101c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3102c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...)
3103c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3104c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3105c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3106c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3107c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3108c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3109c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3110c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3111c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
3112c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...)
3113c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3114c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
3115c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3116c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
3117c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3118c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
3119c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3120c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3121c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3122c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3123c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
3124c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *py_retval;
3125c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_error;
3126c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_warn;
3127c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctx;
3128c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_arg = Py_None;
3129c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3130c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3131c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3132c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple
3133c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3134c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return (NULL);
3135c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3136c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
3137c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3138c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3139c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3140c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx);
3141c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3142c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3143c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        py_retval = libxml_intWrap(-1);
3144c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(py_retval);
3145c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3146c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3147c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (pyCtxt == NULL)
3148c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3149c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* first time to set the error handlers */
3150c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt));
3151c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt == NULL) {
3152c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            py_retval = libxml_intWrap(-1);
3153c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            return(py_retval);
3154c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3155c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt));
3156c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3157c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3158c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    /* TODO: check warn and error is a function ! */
3159c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->error);
3160c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_error);
3161c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->error = pyobj_error;
3162c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3163c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->warn);
3164c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_warn);
3165c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->warn = pyobj_warn;
3166c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3167c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->arg);
3168c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_arg);
3169c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->arg = pyobj_arg;
3170c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3171c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt);
3172c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3173c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    py_retval = libxml_intWrap(1);
3174c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return (py_retval);
3175c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3176c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3177c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
3178c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
3179c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
3180c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
3181c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctxt;
3182c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3183c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt))
3184c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(NULL);
3185c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt);
3186c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3187c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3188c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
3189c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt != NULL)
3190c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        {
3191c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->error);
3192c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->warn);
3193c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->arg);
3194c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            xmlFree(pyCtxt);
3195c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
3196c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
3197c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3198c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGFreeValidCtxt(ctxt);
3199c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_INCREF(Py_None);
3200c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return(Py_None);
3201c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
3202c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3203259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef struct
3204259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3205259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *warn;
3206259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *error;
3207259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *arg;
3208259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} xmlSchemaValidCtxtPyCtxt;
3209259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef xmlSchemaValidCtxtPyCtxt *xmlSchemaValidCtxtPyCtxtPtr;
3210259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3211259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3212259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericErrorFuncHandler(void *ctx, char *str)
3213259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3214259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3215259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3216259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3217259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3218259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3219259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValiditiyGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
3220259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3221259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3222259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3223259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3224259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3225259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3226259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3227259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3228259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->error, list);
3229259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3230259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3231259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3232259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3233259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3234259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3235259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3236259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3237259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3238259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3239259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericWarningFuncHandler(void *ctx, char *str)
3240259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3241259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *list;
3242259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *result;
3243259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3244259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3245259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3246259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
3247259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3248259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3249259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx;
3250259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3251259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	list = PyTuple_New(2);
3252259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
3253259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyTuple_SetItem(list, 1, pyCtxt->arg);
3254259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyCtxt->arg);
3255259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	result = PyEval_CallObject(pyCtxt->warn, list);
3256259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (result == NULL)
3257259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3258259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* TODO: manage for the exception to be propagated... */
3259259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		PyErr_Print();
3260259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3261259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(list);
3262259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(result);
3263259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3264259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3265259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3266259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityErrorFunc(void *ctx, const char *msg, ...)
3267259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3268259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3269259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3270259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3271259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
3272259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3273259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3274259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3275259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void
3276259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityWarningFunc(void *ctx, const char *msg, ...)
3277259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3278259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_list ap;
3279259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3280259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_start(ap, msg);
3281259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	libxml_xmlSchemaValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
3282259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	va_end(ap);
3283259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3284259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
32856ebf3c4c1a78406d15e8629b4a7b3d52549f0c8bDaniel VeillardPyObject *
3286259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3287259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3288259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *py_retval;
3289259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_error;
3290259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_warn;
3291259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctx;
3292259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_arg = Py_None;
3293259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3294259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3295259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3296259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple
3297259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		(args, (char *) "OOO|O:xmlSchemaSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
3298259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return (NULL);
3299259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3300259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR
3301259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	printf("libxml_xmlSchemaSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
3302259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif
3303259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3304259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = PySchemaValidCtxt_Get(pyobj_ctx);
3305259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
3306259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3307259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		py_retval = libxml_intWrap(-1);
3308259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(py_retval);
3309259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3310259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3311259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (pyCtxt == NULL)
3312259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3313259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		/* first time to set the error handlers */
3314259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		pyCtxt = xmlMalloc(sizeof(xmlSchemaValidCtxtPyCtxt));
3315259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt == NULL) {
3316259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			py_retval = libxml_intWrap(-1);
3317259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			return(py_retval);
3318259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3319259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		memset(pyCtxt, 0, sizeof(xmlSchemaValidCtxtPyCtxt));
3320259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3321259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3322259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	/* TODO: check warn and error is a function ! */
3323259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->error);
3324259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_error);
3325259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->error = pyobj_error;
3326259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3327259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->warn);
3328259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_warn);
3329259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->warn = pyobj_warn;
3330259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3331259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XDECREF(pyCtxt->arg);
3332259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_XINCREF(pyobj_arg);
3333259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	pyCtxt->arg = pyobj_arg;
3334259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3335259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaSetValidErrors(ctxt, &libxml_xmlSchemaValidityErrorFunc, &libxml_xmlSchemaValidityWarningFunc, pyCtxt);
3336259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3337259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	py_retval = libxml_intWrap(1);
3338259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(py_retval);
3339259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3340259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3341bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject *
3342259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaFreeValidCtxt(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
3343259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{
3344259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPtr ctxt;
3345259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaValidCtxtPyCtxtPtr pyCtxt;
3346259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	PyObject *pyobj_ctxt;
3347259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3348259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (!PyArg_ParseTuple(args, (char *)"O:xmlSchemaFreeValidCtxt", &pyobj_ctxt))
3349259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		return(NULL);
3350259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	ctxt = (xmlSchemaValidCtxtPtr) PySchemaValidCtxt_Get(pyobj_ctxt);
3351259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3352259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
3353259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	{
3354259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		if (pyCtxt != NULL)
3355259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		{
3356259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->error);
3357259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->warn);
3358259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			Py_XDECREF(pyCtxt->arg);
3359259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard			xmlFree(pyCtxt);
3360259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard		}
3361259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	}
3362259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3363259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	xmlSchemaFreeValidCtxt(ctxt);
3364259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	Py_INCREF(Py_None);
3365259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard	return(Py_None);
3366259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard}
3367259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard
3368c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3369c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
3370d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3371d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3372d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3373d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard/************************************************************************
3374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * XML Canonicalization c14n                                            *
3376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *                                                                      *
3377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ************************************************************************/
3378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPyxmlNodeSet_Convert(PyObject *py_nodeset, xmlNodeSetPtr *result)
3381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodeSet;
3383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_nodeset))
3386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_nodeset))
3388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_nodeset == Py_None) {
3390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of nodes.");
3396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3397d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3398d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3399d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet));
3400d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet == NULL) {
3401d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3402d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3403d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3404d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3405d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeNr = 0;
3406d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeMax = (is_tuple
3407d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        ? PyTuple_GET_SIZE(py_nodeset)
3408d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        : PyList_GET_SIZE(py_nodeset));
3409d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    nodeSet->nodeTab
3410d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        = (xmlNodePtr *) xmlMalloc (nodeSet->nodeMax
3411d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                    * sizeof(xmlNodePtr));
3412d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodeSet->nodeTab == NULL) {
3413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodeSet);
3414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(nodeSet->nodeTab, 0 ,
3418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard           nodeSet->nodeMax * sizeof(xmlNodePtr));
3419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < nodeSet->nodeMax; ++idx) {
3423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            xmlNodePtr pynode =
3424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyxmlNode_Get (is_tuple
3425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               ? PyTuple_GET_ITEM(py_nodeset, idx)
3426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                               : PyList_GET_ITEM(py_nodeset, idx));
3427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (pynode)
3428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                nodeSet->nodeTab[nodeSet->nodeNr++] = pynode;
3429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3431d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = nodeSet;
3432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int
3436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPystringSet_Convert(PyObject *py_strings, xmlChar *** result)
3437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    /* NOTE: the array should be freed, but the strings are shared
3439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard       with the python strings and so must not be freed. */
3440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar ** strings;
3442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int is_tuple = 0;
3443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int count;
3444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int init_index = 0;
3445d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (PyTuple_Check(py_strings))
3447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 1;
3448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (PyList_Check(py_strings))
3449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        is_tuple = 0;
3450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else if (py_strings == Py_None) {
3451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        *result = NULL;
3452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return 0;
3453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3455d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError,
3456d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "must be a tuple or list of strings.");
3457d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3458d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3459d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3460d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    count = (is_tuple
3461d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             ? PyTuple_GET_SIZE(py_strings)
3462d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard             : PyList_GET_SIZE(py_strings));
3463d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3464d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    strings = (xmlChar **) xmlMalloc(sizeof(xmlChar *) * count);
3465d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3466d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (strings == NULL) {
3467d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_MemoryError, "");
3468d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return -1;
3469d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3470d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3471d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    memset(strings, 0 , sizeof(xmlChar *) * count);
3472d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3473d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {
3474d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        int idx;
3475d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        for (idx=0; idx < count; ++idx) {
3476d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            char* s = PyString_AsString
3477d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                (is_tuple
3478d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 ? PyTuple_GET_ITEM(py_strings, idx)
3479d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                 : PyList_GET_ITEM(py_strings, idx));
3480d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (s)
3481d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                strings[init_index++] = (xmlChar *)s;
3482d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            else {
3483d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(strings);
3484d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                PyErr_SetString(PyExc_TypeError,
3485d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                "must be a tuple or list of strings.");
3486d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                return -1;
3487d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3488d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3489d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3490d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3491d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    *result = strings;
3492d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    return 0;
3493d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3494d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3495d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3496d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
3497d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                         PyObject * args)
3498d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3499d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_retval = NULL;
3500d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3501d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3502d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3503d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3504d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3506d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3508d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3509d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3510d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar *doc_txt;
3511d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3512d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3513d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3514d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOi:C14NDocDumpMemory",
3515d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3516d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3517d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3518d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3519d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments))
3520d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3521d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3522d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3523d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3524d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3525d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3527d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3529d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3530d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3531d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3532d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3533d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3534d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3535d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3536d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3537d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3538d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3539d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3540d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3541d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3542d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocDumpMemory(doc,
3543d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  nodes,
3544d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  exclusive,
3545d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  prefixes,
3546d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  with_comments,
3547d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                  &doc_txt);
3548d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3549d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3550d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3551d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3552d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3553d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3554d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3555d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3556d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3557d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3558d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3559d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3560d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3561d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocDumpMemory failure.");
3562d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3563d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3564d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else {
3565d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        py_retval = PyString_FromStringAndSize((const char *) doc_txt,
3566d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                                               result);
3567d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(doc_txt);
3568d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return py_retval;
3569d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3570d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3571d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3572d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject *
3573d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self,
3574d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                     PyObject * args)
3575d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{
3576d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_doc;
3577d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *py_file;
3578d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_nodes;
3579d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int exclusive;
3580d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    PyObject *pyobj_prefixes;
3581d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int with_comments;
3582d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3583d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlDocPtr doc;
3584d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlNodeSetPtr nodes;
3585d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlChar **prefixes = NULL;
3586d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    FILE * output;
3587d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    xmlOutputBufferPtr buf;
3588d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3589d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int result;
3590d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    int len;
3591d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3592d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOiOiO:C14NDocSaveTo",
3593d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_doc,
3594d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_nodes,
3595d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &exclusive,
3596d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &pyobj_prefixes,
3597d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &with_comments,
3598d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                          &py_file))
3599d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return (NULL);
3600d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3601d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc);
3602d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (!doc) {
3603d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad document.");
3604d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3605d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3606d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3607d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
3608d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3609d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3610d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3611d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    output = PyFile_AsFile(py_file);
3612d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (output == NULL) {
3613d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_TypeError, "bad file.");
3614d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3615d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3616d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    buf = xmlOutputBufferCreateFile(output, NULL);
3617d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3618d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes);
3619d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) return NULL;
3620d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3621d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (exclusive) {
3622d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        result = PystringSet_Convert(pyobj_prefixes, &prefixes);
3623d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        if (result < 0) {
3624d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            if (nodes) {
3625d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes->nodeTab);
3626d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                xmlFree(nodes);
3627d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            }
3628d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard            return NULL;
3629d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        }
3630d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3631d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3632d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    result = xmlC14NDocSaveTo(doc,
3633d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              nodes,
3634d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              exclusive,
3635d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              prefixes,
3636d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              with_comments,
3637d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                              buf);
3638d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3639d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (nodes) {
3640d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes->nodeTab);
3641d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(nodes);
3642d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3643d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (prefixes) {
3644d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlChar ** idx = prefixes;
3645d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        while (*idx) xmlFree(*(idx++));
3646d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        xmlFree(prefixes);
3647d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3648d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3649d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    len = xmlOutputBufferClose(buf);
3650d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3651d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    if (result < 0) {
3652d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        PyErr_SetString(PyExc_Exception,
3653d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard                        "libxml2 xmlC14NDocSaveTo failure.");
3654d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return NULL;
3655d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    }
3656d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    else
3657d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard        return PyInt_FromLong((long) len);
3658d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard}
3659d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3660d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3661d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3662d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3663c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brackstatic PyObject *
3664c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
3665c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack
3666c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    PyObject *obj;
3667c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    char *str;
3668d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3669c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj))
3670c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack        return NULL;
3671c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    str = PyCObject_GetDesc(obj);
3672c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    return Py_BuildValue((char *)"s", str);
3673c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack}
3674d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard
3675a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************
3676a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
3677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
3678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
3679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
3680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
368196fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
3682d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "name", libxml_name, METH_VARARGS, NULL},
3683d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "children", libxml_children, METH_VARARGS, NULL},
3684d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "properties", libxml_properties, METH_VARARGS, NULL},
3685d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "last", libxml_last, METH_VARARGS, NULL},
3686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "prev", libxml_prev, METH_VARARGS, NULL},
3687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "next", libxml_next, METH_VARARGS, NULL},
3688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "parent", libxml_parent, METH_VARARGS, NULL},
3689d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "type", libxml_type, METH_VARARGS, NULL},
3690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "doc", libxml_doc, METH_VARARGS, NULL},
3691d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL},
3692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard    {(char *) "xmlNodeRemoveNsDef", libxml_xmlNodeRemoveNsDef, METH_VARARGS, NULL},
3693850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard    {(char *)"xmlSetValidErrors", libxml_xmlSetValidErrors, METH_VARARGS, NULL},
369425c90c589b256f0925f081198c1525134a491e31Daniel Veillard    {(char *)"xmlFreeValidCtxt", libxml_xmlFreeValidCtxt, METH_VARARGS, NULL},
3695a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3696d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL},
3697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL},
3698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL},
36996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
37006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
37016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
3702263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL },
3703263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard    { (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL },
3704a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
3705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
3706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
37073e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard    {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL },
3708417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL },
3709417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL },
3710e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL },
371126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL },
371226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL },
371326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL },
37145439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL },
3715c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
3716c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL},
3717c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL},
3718eff45a92da861195551a2050487fcca0492cac7cDaniel Veillard    {(char *)"xmlSchemaSetValidErrors", libxml_xmlSchemaSetValidErrors, METH_VARARGS, NULL},
3719bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillard    {(char *)"xmlSchemaFreeValidCtxt", libxml_xmlSchemaFreeValidCtxt, METH_VARARGS, NULL},
3720c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
3721d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED
3722d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
3723d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocDumpMemory", libxml_C14NDocDumpMemory, METH_VARARGS, NULL},
3724d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard    {(char *)"xmlC14NDocSaveTo", libxml_C14NDocSaveTo, METH_VARARGS, NULL},
3725d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3726d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif
3727c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack    {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL},
3728d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {NULL, NULL, 0, NULL}
3729d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
3730d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
37310fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37326361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void);
37330fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
37340fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard
3735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid
3736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void)
3737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
3738af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    static int initialized = 0;
3739af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard
3740af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    if (initialized != 0)
3741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
37428e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack
3743f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* intialize the python extension module */
3744f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    Py_InitModule((char *) "libxml2mod", libxmlMethods);
3745f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
3746f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    /* initialize libxml2 */
3747f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    xmlInitParser();
37485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
37496361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard
3750f93a866079364a006189683eaa07f94c867389d1Daniel Veillard    initialized = 1;
3751f93a866079364a006189683eaa07f94c867389d1Daniel Veillard
37520fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
37530fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard    initlibxsltmod();
37540fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
3755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
3756