libxml.c revision 05349ab2f6995d33f06932aa3cc62cf420ce0477
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>
25d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h"
2696fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h"
27d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
280d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf)
290d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a)
30e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#elif defined(WITH_TRIO)
31e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#include "trio.h"
32e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#define vsnprintf trio_vsnprintf
330d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif
340d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard
35d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
36797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */
37a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */
40c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */
41c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */
424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
43d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void);
44d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
45c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO:
47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks
49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO 								\
51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            __FILE__, __LINE__);
54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
554e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************
564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *		Memory debug interface					*
584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/
604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
61c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#if 0
624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr);
634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size);
64d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size);
654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str);
66c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0;
694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0;
704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0;
724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL;
734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL;
744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL;
754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL;
764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
78d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDebugMemory(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
79d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int activate;
814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *py_retval;
824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    long ret;
834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
84d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate))
85d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY
884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_xmlDebugMemory(%d) called\n", activate);
894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (activate != 0) {
92d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebug == 0) {
93d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
94d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * First initialize the library and grab the old memory handlers
95d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * and switch the library to memory debugging
96d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
97d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlMemGet((xmlFreeFunc *) & freeFunc,
98d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlMallocFunc *) & mallocFunc,
99d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlReallocFunc *) & reallocFunc,
100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlStrdupFunc *) & strdupFunc);
101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) &&
102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (reallocFunc == xmlMemRealloc) &&
103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (strdupFunc == xmlMemoryStrdup)) {
104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         xmlMemRealloc, xmlMemoryStrdup);
108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (ret < 0)
109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    goto error;
110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlInitParser();
113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (libxmlMemoryDebugActivated == 0) {
115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxmlMemoryAllocatedBase = xmlMemUsed();
116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebug = 1;
121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 1;
1224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    } else {
123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebugActivated == 1)
124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else
126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 0;
1284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  error:
1304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    py_retval = libxml_longWrap(ret);
131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                     ATTRIBUTE_UNUSED PyObject * args)
137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (libxmlMemoryDebug != 0)
140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlMemoryDump();
1414e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    Py_INCREF(Py_None);
142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
1434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
144d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
145d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
146d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
147c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Handling Python FILE I/O at the C level			*
148c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	The raw I/O attack diectly the File objects, while the		*
149c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	other routines address the ioWrapper instance instead		*
150c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
151c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
152c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
153c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
154c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref:
155c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
156c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
157c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
158c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
159c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
160c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) {
161c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file, *ret;
162c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
163c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
164c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileCloseUnref\n");
165c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
166c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
167c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
168118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "close", (char *) "()");
169c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
170c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
171c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
172c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(file);
173c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
174c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
175c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
176c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
177c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw:
178c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
179c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
180c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
181c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
182c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel
183c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
184c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
185c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
186c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
187c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) {
188c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
189c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
190c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
191c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
192c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
193c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
194c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileReadRaw: %d\n", len);
195c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
196c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
197c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
198118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len);
199c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
200c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is NULL\n");
201c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
202c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
203c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
204c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
205c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
206c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
207c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
208c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
209c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
210c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
211c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is not a String\n");
212c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
213c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
214c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
215c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
216c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
217c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
218c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead:
219c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
220c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
221c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
222c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
223c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel.
224c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
225c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
226c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
227c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
228c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) {
229c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
234c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileRead: %d\n", len);
236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
239118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len);
240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is NULL\n");
242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
249c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
251c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is not a String\n");
253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite:
260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel.
265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written
267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) {
270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *string;
2726cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *ret = NULL;
273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int written = -1;
274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileWrite: %d\n", len);
277c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
279c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    string = PyString_FromStringAndSize(buffer, len);
281c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (string == NULL) return(-1);
2826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_write")) {
2836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)",
2846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
2856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "write")) {
2866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "write", (char *) "(O)",
2876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	                        string);
2886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(string);
290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is NULL\n");
292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyInt_Check(ret)) {
294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = (int) PyInt_AsLong(ret);
295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (ret == Py_None) {
297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = len;
298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is not an Int nor None\n");
301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(written);
304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose:
308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
310c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) {
3146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file, *ret = NULL;
315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileClose\n");
318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
320c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
3216cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (PyObject_HasAttrString(file, (char *) "io_close")) {
3226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()");
3236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    } else if (PyObject_HasAttrString(file, (char *) "flush")) {
3246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        ret = PyEval_CallMethod(file, (char *) "flush", (char *) "()");
3256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
327c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
332a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile:
335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
343118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr
344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file,
345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncodingHandlerPtr encoder) {
346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr ret;
347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocOutputBuffer(encoder);
351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
353c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->writecallback = xmlPythonFileWrite;
355c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
358c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
363c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
364c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
365c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
366c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
367c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr buffer;
368c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
369c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
370c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate",
371c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
374118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	handler = xmlFindCharEncodingHandler((const char *) encoding);
375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlOutputBufferCreatePythonFile(file, handler);
377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
378c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n");
379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlOutputBufferPtrWrap(buffer);
380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
3826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
3836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard/**
3846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * libxml_outputBufferGetPythonFile:
3856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * @buffer:  the I/O buffer
3866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
3876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * read the Python I/O from the CObject
3886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard *
3896cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * Returns the new parser output or NULL
3906cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard */
3916cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardstatic PyObject *
3926cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self,
3936cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard                                    PyObject *args) {
3946cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *buffer;
3956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *file;
3966cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr obj;
3976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
3986cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile",
3996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard			  &buffer))
4006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(NULL);
4016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    obj = PyoutputBuffer_Get(buffer);
4036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj == NULL) {
4046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: obj == NULL\n");
4066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4076cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4096cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (obj->closecallback != xmlPythonFileClose) {
4106cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	fprintf(stderr,
4116cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	        "outputBufferGetPythonFile: not a python file wrapper\n");
4126cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4136cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4156cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    file = (PyObject *) obj->context;
4166cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (file == NULL) {
4176cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	Py_INCREF(Py_None);
4186cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard	return(Py_None);
4196cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    }
4206cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    Py_INCREF(file);
4216cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(file);
4226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
4236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel VeillardPyObject *
4256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
4266cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
4276cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
4286cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
4296cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
4306cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4316cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out))
4326cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
4336cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
4346cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4356cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferClose(out);
4366cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
4376cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
4386cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
4396cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4406cbd6c0738efb6c55d08f39c0731d46d678858faDaniel VeillardPyObject *
4416cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) {
4426cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *py_retval;
4436cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    int c_retval;
4446cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    xmlOutputBufferPtr out;
4456cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    PyObject *pyobj_out;
4466cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4476cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out))
4486cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard        return(NULL);
4496cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out);
4506cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard
4516cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    c_retval = xmlOutputBufferFlush(out);
4526cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    py_retval = libxml_intWrap((int) c_retval);
4536cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    return(py_retval);
4546cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard}
455a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
457c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile:
460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
463c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
464c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
465c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
466c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
467c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
468118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr
469c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file,
470c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncoding encoding) {
471c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr ret;
472c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
473c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
474c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
475c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocParserInputBuffer(encoding);
476c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
477c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
478c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
479c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->readcallback = xmlPythonFileRead;
480c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
481c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
482c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
483c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
484c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
485c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
486c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
487c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
488c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
489c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
490c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
491c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
492c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr buffer;
493c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
494c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
495c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate",
496c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
497c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
498c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
499118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	enc = xmlParseCharEncoding((const char *) encoding);
500c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
501c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlParserInputBufferCreatePythonFile(file, enc);
502c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
503c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n");
504c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlParserInputBufferPtrWrap(buffer);
505c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
506c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
507c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
508c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
509c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
510c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Providing the resolver at the Python level		*
511c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
512c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
513c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
514c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL;
515c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext;
516c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
517c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr
518c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID,
519c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			   xmlParserCtxtPtr ctxt) {
520c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputPtr result = NULL;
521c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (pythonExternalEntityLoaderObjext != NULL) {
522c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ret;
523c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ctxtobj;
524c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
525c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt);
526c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
527c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: ready to call\n");
528c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
529c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
530c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext,
531118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard		      (char *) "(ssO)", URL, ID, ctxtobj);
532e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	Py_XDECREF(ctxtobj);
533c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
534c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: result ");
535007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard	PyObject_Print(ret, stderr, 0);
536c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("\n");
537c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
538c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
539c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (ret != NULL) {
540118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	    if (PyObject_HasAttrString(ret, (char *) "read")) {
541c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		xmlParserInputBufferPtr buf;
542c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
543c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
544c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		if (buf != NULL) {
545c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->context = ret;
546c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->readcallback = xmlPythonFileReadRaw;
547c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->closecallback = xmlPythonFileCloseRaw;
548c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    result = xmlNewIOInputStream(ctxt, buf,
549c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			                         XML_CHAR_ENCODING_NONE);
550c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		}
551c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    } else {
552c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		printf("pythonExternalEntityLoader: can't read\n");
553c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
554c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    if (result == NULL) {
555c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		Py_DECREF(ret);
556c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard	    } else if (URL != NULL) {
557c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack		result->filename = (char *) xmlStrdup((const xmlChar *)URL);
558c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard		result->directory = xmlParserGetDirectory((const char *) URL);
559c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
560c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	}
561c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
562c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((result == NULL) && (defaultExternalEntityLoader != NULL)) {
563c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	result = defaultExternalEntityLoader(URL, ID, ctxt);
564c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
565c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(result);
566c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
567c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
568c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
569c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
570c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
571c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *loader;
572c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
573c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader",
574c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&loader))
575c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
576c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
577c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
578c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("libxml_xmlSetEntityLoader\n");
579c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
580c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (defaultExternalEntityLoader == NULL)
581c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	defaultExternalEntityLoader = xmlGetExternalEntityLoader();
582c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
583c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    pythonExternalEntityLoaderObjext = loader;
584c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlSetExternalEntityLoader(pythonExternalEntityLoader);
585c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
586c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = PyInt_FromLong(0);
587c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
588c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
589c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
590c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
591c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
592c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
5933ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
5961971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
59733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
59833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
60033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
60133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
60233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
60333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
60433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
60533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
60733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
60833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
609797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
610797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartElement(%s) called\n", name);
611797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
61233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startElement"))
61433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "start"))
61633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
61733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
61833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
61933caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
62033caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
62133caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
62233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
62333caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
62433caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (attrs == NULL) {
626d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            dict = PyDict_New();
62733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
62833caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
62933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
630d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                attrname = PyString_FromString((char *) attrs[i]);
63133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
63233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
633d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    attrvalue = PyString_FromString((char *) attrs[i]);
63433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
63533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
63633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
63733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
63833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
63933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
64033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
64133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
64233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "startElement",
644d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
64533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "start",
647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
648d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
649d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
65033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
65133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
65233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
65333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
65433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
65533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
65633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
65733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
65833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
65933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
66033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
661797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
662797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartDocument() called\n");
663797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
66433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
665d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startDocument")) {
666d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
667d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "startDocument", NULL);
668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
67033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
67133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
67233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
67333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
67433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
67533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
67633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
67733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
67833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
67933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
680797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
681797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndDocument() called\n");
682797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
68333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
684d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endDocument")) {
685d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "endDocument", NULL);
687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
68933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
69033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
69133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
69233caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
69333caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
69433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
69533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
69633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
69733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
69833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
69933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
70033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
70133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
70233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
703797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
704797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndElement(%s) called\n", name);
705797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
70633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
707d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endElement")) {
708d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "endElement",
709d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
711d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
71233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
713d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    } else if (PyObject_HasAttrString(handler, (char *) "end")) {
714d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "end",
715d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
716d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
718797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard        Py_XDECREF(result);
71933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
72033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
72133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
72233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
72333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
72433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
72533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
72633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
72733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
728797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
729797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonReference(%s) called\n", name);
730797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
73133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "reference")) {
733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "reference",
734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
73733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
74133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
74233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
74333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
748797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
749797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCharacters(%s, %d) called\n", ch, len);
750797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "characters"))
753d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
755d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
757d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "characters",
759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "data",
762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
76533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
76933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
77033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
773d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
776797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
777797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);
778797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
77933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace"))
78133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
78433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
78533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
78633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler,
788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "ignorableWhitespace",
789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
79033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "data",
793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
79633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
79833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
79933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
80033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
80233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
80333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
80433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
805797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
806797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonProcessingInstruction(%s, %s) called\n", target, data);
807797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
80833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) {
810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *)
811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     "processingInstruction",
812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ss", target, data);
81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
81433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
81533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
81633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
81733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
81833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
81933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
82133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
82233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
823797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
824797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonComment(%s) called\n", value);
825797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
82633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "comment")) {
828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "comment", (char *) "s",
830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                value);
831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
83433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
83533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
83733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
83833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
83933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
84033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
84133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
84233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
84333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
84433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
845797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
846797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonWarning(%s) called\n", msg);
847797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
84833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "warning")) {
85033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
85133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "warning", (char *) "s",
856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
85933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
86033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
86333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
86433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
86533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
86633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
86733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
86833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
86933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
87033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
871797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
872797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonError(%s) called\n", msg);
873797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
87433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "error")) {
87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "error", (char *) "s",
882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
88533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
88633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
88733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
88833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
88933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
89033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
89133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
89233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
89333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
89433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
89533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
89633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
897797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
898797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonFatalError(%s) called\n", msg);
899797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
90033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "fatalError")) {
90233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
907d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "fatalError",
908d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "s", buf);
909d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
91133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
91333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
91433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
91533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
91633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
91733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
92133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
922797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
923797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCdataBlock(%s, %d) called\n", ch, len);
924797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "cdataBlock"))
927d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "cdata"))
929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
93033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
931d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdataBlock",
934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
935d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
937d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdata",
938d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
939d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
940d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
94433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
94533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
94633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
94733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
94833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
94933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
95033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
95133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
953797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
954797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonExternalSubset(%s, %s, %s) called\n",
955d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, externalID, systemID);
956797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
958d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "externalSubset")) {
95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "externalSubset",
961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "sss", name, externalID,
962d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                systemID);
96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
96433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
96533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
96633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
96733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
96833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
96933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
97033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
97133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
97233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
97333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
97433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
978d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "entityDecl")) {
979d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "entityDecl",
980d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sisss", name, type,
981d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     publicId, systemId, content);
982d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
983d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
98633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
98933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
99033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
99133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
99233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
99333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
99433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
99533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
99633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
99733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1000d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "notationDecl")) {
1001d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "notationDecl",
1002d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, publicId,
1003d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     systemId);
1004d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1005d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
100833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
100933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
101033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
101133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
101233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
101333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
101433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
101533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
101733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
101833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
101933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
102033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
102133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
102233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
102333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
102533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1026d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) {
102733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
103033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
103133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
1034d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            newName = PyString_FromString((char *) node->name);
103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
1038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "attributeDecl",
1039d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ssiisO", elem, name, type,
1040d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     def, defaultValue, nameList);
1041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
104533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
104633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
104733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
104833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
104933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
1051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                  int type, ATTRIBUTE_UNUSED xmlElementContentPtr content)
105233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
105333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
105633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
105733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1058d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "elementDecl")) {
1059d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* TODO: wrap in an elementContent object */
1060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
1062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = Py_None;
1063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "elementDecl",
1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "siO", name, type, obj);
1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
106833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
106933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
107033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
107133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
107233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
107333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
107433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
107533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
107633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
107733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
107833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
107933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
108033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
108133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
108233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1083d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) {
1084d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
1085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "unparsedEntityDecl",
1086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "ssss", name, publicId, systemId,
1087d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                notationName);
1088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1089d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
109033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
109133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
109233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
109333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
109433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
109533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
109633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
109733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
109833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
109933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
110033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1101797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1102797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonInternalSubset(%s, %s, %s) called\n",
1103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, ExternalID, SystemID);
1104797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
110533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "internalSubset")) {
1107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "internalSubset",
1108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, ExternalID,
1109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     SystemID);
1110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
111233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
111333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
111433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
111533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
111633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
111733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
1118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonIsStandalone, */
1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasInternalSubset, */
1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasExternalSubset, */
1121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonResolveEntity, */
1122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetEntity, */
112333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
112433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
112533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
112733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
1128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* OBSOLETED pythonSetDocumentLocator, */
112933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
113133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
113333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
113433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
113533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
113633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
113733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
113833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
113933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
114033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetParameterEntity, */
114233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
114333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
1144a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    1,
1145a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,			/* TODO mograte to SAX2 */
1146a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL,
1147871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack    NULL,
1148a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard    NULL
114933caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
1150d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
11513ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
11523ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
11533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
11543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
11553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
11561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
11571971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           PyObject * args)
1160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
11623ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
11653ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
11663ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
11673ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
11683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk,
1171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
11731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
11748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
11753ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
11771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
11783ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
11821971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
118333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
11843ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
11875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
11884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                            PyObject * args)
1191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
11934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
119533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
11964e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
11974e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
11984e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
11994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk,
1202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
12044e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
12058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
12064e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
12084e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
12094e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1210d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1212d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
12134e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
121433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
1215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                   XML_CHAR_ENCODING_NONE);
12164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
12184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
12194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
12208d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
12238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    int recover;
1224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
12258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
12268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
12278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX,
1229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &URI, &recover))
1230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
12318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
12328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
12338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n",
1234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, recover);
12358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
12368d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1237d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1238d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
12398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
12408d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
12418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
12428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
12438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXParseFileWithData(SAX, URI, recover, pyobj_SAX);
12448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
12468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
12478d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
12488d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
12538d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
12548d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
12558d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI,
1258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &encoding))
1259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
12608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
12618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
12628d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n",
1263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, encoding);
12648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
12658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
12688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
12698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
12708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
12718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
12728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX);
12738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
12758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
12768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
12775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
12785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
12795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
12805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
12815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
12825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
12845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
12855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1286e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */
1287e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char *
1288e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap)
1289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1290d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int size;
1291d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int chars;
1292d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    char *larger;
1293e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    char *str;
1294e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1295e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    str = (char *) xmlMalloc(150);
1296e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (str == NULL)
1297e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return NULL;
1298e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1299e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    size = 150;
1300e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1301e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    while (1) {
1302e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        chars = vsnprintf(str, size, msg, ap);
1303e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        if ((chars > -1) && (chars < size))
1304e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard            break;
1305e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        if (chars > -1)
1306e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard            size += chars + 1;
1307e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        else
1308e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard            size += 100;
1309e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        if ((larger = (char *) xmlRealloc(str, size)) == NULL) {
1310e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard            xmlFree(str);
1311e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard            return NULL;
1312e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        }
1313e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        str = larger;
1314e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1315e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1316e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return str;
1317e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1318e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1319e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void
1320e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg,
1321e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard                           ...)
1322e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    va_list ap;
1324d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    char *str;
13255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
13265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
13275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
13285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
13305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
13315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
13325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
1335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_start(ap, msg);
1336007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard        vfprintf(stderr, msg, ap);
1337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(ap);
13385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1339e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_start(ap, msg);
1340e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        str = libxml_buildMessage(msg,ap);
1341e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        va_end(ap);
1342d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        list = PyTuple_New(2);
1344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        message = libxml_charPtrWrap(str);
1347d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 1, message);
1348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1349d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(list);
1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(result);
13515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
13525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
13535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void)
1356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
13575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
13585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
13595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
13605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
1361781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
13625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
13635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1364c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
1366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                               PyObject * args)
1367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
13685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
13695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
13705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
13715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
1374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &pyobj_ctx))
1375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
13765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
1378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx,
1379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_f);
13805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
13815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
13845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
13855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1386d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
13875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
13885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
13905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
13915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
13935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
13945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
13955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
13965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1397d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
13985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1400e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1401e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************
1402e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1403e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *                      Per parserCtxt error handler                    *
1404e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard *									*
1405e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/
1406e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1407417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct
1408417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1409417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *f;
1410417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *arg;
1411417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt;
1412417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr;
1413417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1414417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1415417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str)
1416e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1417e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *list;
1418e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *result;
1419417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1420e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1421e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1422e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR
1423417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
1424e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif
1425e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1426417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr)ctx;
1427417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1428e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1429417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
1430417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
1431417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XINCREF(pyCtxt->arg);
1432417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrWrap(str));
1433417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1434417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, Py_None);
1435417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1436417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
1437417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (result == NULL)
1438417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {
1439417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
1440417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyErr_Print();
1441e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1442417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(list);
1443417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(result);
1444417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1445417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1446417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1447417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...)
1448417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1449417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1450417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1451417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1452417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap));
1453417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1454417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1455417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1456417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1457417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...)
1458417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1459417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1460417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1461417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1462417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap));
1463417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1464417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1465417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1466417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1467417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...)
1468417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1469417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1470417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1471417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1472417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap));
1473417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1474417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard}
1475417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1476417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void
1477417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...)
1478417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{
1479417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_list ap;
1480417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1481417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_start(ap, msg);
1482417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap));
1483417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    va_end(ap);
1484e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1485e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1486c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1487417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1488e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1489e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *py_retval;
1490e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1491e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1492e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1493e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_f;
1494e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_arg;
1495e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1496417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler",
1497e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard		          &pyobj_ctxt, &pyobj_f, &pyobj_arg))
1498e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1499e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1500e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    if (ctxt->_private == NULL) {
1501e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt));
1502e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	if (pyCtxt == NULL) {
1503e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    py_retval = libxml_intWrap(-1);
1504e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	    return(py_retval);
1505e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	}
1506e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt));
1507e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard	ctxt->_private = pyCtxt;
1508e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1509e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    else {
1510417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1511e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1512e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    /* TODO: check f is a function ! */
1513417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->f);
1514e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_f);
1515417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->f = pyobj_f;
1516417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_XDECREF(pyCtxt->arg);
1517e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    Py_XINCREF(pyobj_arg);
1518417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    pyCtxt->arg = pyobj_arg;
1519e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1520417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (pyobj_f != Py_None) {
1521417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler;
1522417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler;
1523417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler;
1524417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler;
1525417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1526417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1527417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->error = xmlParserError;
1528417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.error = xmlParserValidityError;
1529417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->sax->warning = xmlParserWarning;
1530417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	ctxt->vctxt.warning = xmlParserValidityWarning;
1531417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1532e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1533e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    py_retval = libxml_intWrap(1);
1534e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    return(py_retval);
1535e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1536e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1537c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1538417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
1539e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{
1540417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *py_retval;
1541417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPtr ctxt;
1542e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1543417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyObject *pyobj_ctxt;
1544e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1545417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler",
1546417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard		          &pyobj_ctxt))
1547417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard        return(NULL);
1548417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1549417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    py_retval = PyTuple_New(2);
1550417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt->_private != NULL) {
1551417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private;
1552e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
1554417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->f);
1555417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
1556417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(pyCtxt->arg);
1557417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    }
1558417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    else {
1559417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* no python error handler registered */
1560417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
1561417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1562417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
1563417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	Py_XINCREF(Py_None);
1564e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    }
1565417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(py_retval);
1566e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1567e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1568c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
1570e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    xmlParserCtxtPtr ctxt;
1571e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    PyObject *pyobj_ctxt;
1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    xmlParserCtxtPyCtxtPtr pyCtxt;
1573e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt))
1575e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard        return(NULL);
1576e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard
1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    if (ctxt != NULL) {
1579417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private;
1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	if (pyCtxt) {
1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->f);
1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	    xmlFree(pyCtxt);
1584e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard	}
1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	xmlFreeParserCtxt(ctxt);
1586e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard    }
1587e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    Py_INCREF(Py_None);
1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    return(Py_None);
1590e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard}
1591e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard
1592a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
1593a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
159426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *                      Per xmlTextReader error handler                 *
159526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
159626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/
159726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
159826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct
159926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
160026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *f;
160126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *arg;
160226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt;
160326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr;
160426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
160526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void
160626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg,
160726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard				  const char *msg,
1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  int severity,
1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard				  xmlTextReaderLocatorPtr locator)
161026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
161126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg;
161226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *list;
161326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *result;
161426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    list = PyTuple_New(4);
161626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 0, pyCtxt->arg);
161726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XINCREF(pyCtxt->arg);
161826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg));
1619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 2, libxml_intWrap(severity));
1620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator));
162126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    result = PyEval_CallObject(pyCtxt->f, list);
162226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (result == NULL)
162326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
1624417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard	/* TODO: manage for the exception to be propagated... */
162526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyErr_Print();
162626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
162726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(list);
162826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_XDECREF(result);
162926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
163026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1631c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
163226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
163326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
163426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
163526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
163626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
163726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
163826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
163926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_f;
164026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_arg;
164126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
164226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
164326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg))
164426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
164526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
164626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* clear previous error handler */
164726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
164826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
1649c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
165026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
165126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
165226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
165326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
165426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
165526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
165626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	else {
165726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /*
165826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there already an arg, and it's not ours,
165926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * there is definitely something wrong going on here...
166026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     * we don't know how to free it, so we bail out...
166126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	     */
166226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
166326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
166426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
166526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
166626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderSetErrorHandler(reader,NULL,NULL);
166726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    /* set new error handler */
166826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (pyobj_f != Py_None)
166926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
167026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt));
167126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	if (pyCtxt == NULL) {
167226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    py_retval = libxml_intWrap(-1);
167326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    return(py_retval);
167426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
167526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_f);
167626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->f = pyobj_f;
167726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyobj_arg);
167826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt->arg = pyobj_arg;
1679c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	xmlTextReaderSetErrorHandler(reader,
1680c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	    (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback,
1681c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	                             pyCtxt);
168226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
168326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
168426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = libxml_intWrap(1);
168526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
168626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
168726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1688c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
168926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args)
169026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{
169126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
169226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
169326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
169426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
169526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
169626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *py_retval;
169726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
169826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader))
169926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard        return(NULL);
170026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
170126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
170226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    py_retval = PyTuple_New(2);
1703c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) {
170426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* ok, it's our error handler! */
170526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
170626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, pyCtxt->f);
170726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->f);
170826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, pyCtxt->arg);
170926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(pyCtxt->arg);
171026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
171126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    else
171226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {
171326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/* f is null or it's not our error handler */
171426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 0, Py_None);
171526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
171626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	PyTuple_SetItem(py_retval, 1, Py_None);
171726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	Py_XINCREF(Py_None);
171826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
171926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(py_retval);
172026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
172126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1722c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
172326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
172426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPtr reader;
172526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    PyObject *pyobj_reader;
172626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderPyCtxtPtr pyCtxt;
172726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderErrorFunc f;
172826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    void *arg;
172926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
1730157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader))
1731157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard        return(NULL);
1732157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard    if (!PyCObject_Check(pyobj_reader)) {
1733bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
1734bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
1735bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
173626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader);
1737bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    if (reader == NULL) {
1738bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	Py_INCREF(Py_None);
1739bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard	return(Py_None);
1740bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard    }
174126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
174226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlTextReaderGetErrorHandler(reader,&f,&arg);
174326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    if (arg != NULL) {
1744c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard	if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) {
174526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    /* ok, it's our error handler! */
174626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    pyCtxt = (xmlTextReaderPyCtxtPtr)arg;
174726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->f);
174826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    Py_XDECREF(pyCtxt->arg);
174926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	    xmlFree(pyCtxt);
175026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	}
175126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	/*
175226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * else, something wrong happened, because the error handler is
175326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 * not owned by the python bindings...
175426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard	 */
175526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    }
175626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
175726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    xmlFreeTextReader(reader);
175826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    Py_INCREF(Py_None);
175926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    return(Py_None);
176026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard}
176126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard
176226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************
176326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard *									*
1764a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
1765a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
1766a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
1767a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1768a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0;
1769a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1770a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback {
1771a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
1772a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
1773a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
1774a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *function;
1775a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr;
1776a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10];
1777a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0;
1778a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10;
1779a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1780a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
1781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
1782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1783a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
1784a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
178570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
178670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
178770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
178870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
1789a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1790a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
179170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
1792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
179370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
179470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
1795d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
179670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
179770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
1798a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name,
1800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ns_uri);
1801a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1802a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
180370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
180470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
180570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
1806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (                    /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
1808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard               (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard               (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            current_function = libxml_xpathCallbacks[i].function;
1811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
181270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
181370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
1814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
1816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             name);
1817d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
181870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
181970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
1820c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
1821c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
182205349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard    for (i = nargs - 1; i >= 0; i--) {
1823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = valuePop(ctxt);
1824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        cur = libxml_xmlXPathObjectPtrWrap(obj);
1825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, i + 1, cur);
1826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1827a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
1828a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
1829a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1830a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
1831a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
1832a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1833a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1834a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
1835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name,
1836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                              const xmlChar * ns_uri)
1837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1838a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1840a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1841a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
1842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctxt, name, ns_uri);
1843a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
184470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
184570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
184670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
184770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
184870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
184970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
1850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
1852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (libxml_xmlXPathFuncCallback);
1855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1856a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (NULL);
1858a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1859a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1860a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
1861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void)
1862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1863a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1864a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1865a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
1866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
1867a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1868a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1869a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
1870a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1871a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1872781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksMax; i++) {
1873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].ctx = NULL;
1874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].name = NULL;
1875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].ns_uri = NULL;
1876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].function = NULL;
1877a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1878a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
1879a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1880a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1881a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
1882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self,
1883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                PyObject * args)
1884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1885a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
1886a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
1887a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
1888a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
1889a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
1890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
1891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
1892a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1893a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name,
1896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &ns_uri, &pyobj_f))
1897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
1898a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1899a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
1900a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
1901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacksInitialize();
1902a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
1903a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1904a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
1905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_intWrap(-1);
1906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (py_retval);
1907a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1908a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1909a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
1910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctx, name, ns_uri);
1911a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if ((ctx == libxml_xpathCallbacks[i].ctx) &&
1914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1915d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1916d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XINCREF(pyobj_f);
1917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XDECREF(libxml_xpathCallbacks[i].function);
1918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxml_xpathCallbacks[i].function = pyobj_f;
1919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = 1;
1920d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            goto done;
1921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1922a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1923a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
1924d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf("libxml_registerXPathFunction() table full\n");
1925a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
1926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        i = libxml_xpathCallbacksNb++;
1927d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(pyobj_f);
1928a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
1929a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
1930a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
1931d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].function = pyobj_f;
1932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        c_retval = 1;
1933a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  done:
1935a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
1936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1937a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1938a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
19391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
19401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
1941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
1942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
1943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
1944d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
1950d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:name", &obj))
1952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
1957d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1958d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1959d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1961d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1962d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1963d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:{
1965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlDocPtr doc = (xmlDocPtr) cur;
1966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = doc->URL;
1968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->name;
1974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1975d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1976d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
1977d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
1978d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1979d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = ns->prefix;
1980d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1981d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1982d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1983d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->name;
1984d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
19861971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
1987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1989d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1990d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1995d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
1997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj))
1999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2000d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2002d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2003d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
2004d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2005d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2006d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2007d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2008d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2009d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2010d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2011d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->doc;
2018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2022d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2023d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->doc;
2025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2026d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2027d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
2028d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2029d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2030d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2032d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2033d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2034d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2035d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
2036d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
2037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj))
2039d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2041d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
2042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = cur->properties;
2043d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
2044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = NULL;
2045d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
2046d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2047d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2048d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2051d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2053d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2054d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2055d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:next", &obj))
2057d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2058d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2059d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2060d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2061d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
2062d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2063d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) attr->next;
2076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
2079d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
2080d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) ns->next;
2082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2083d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2084d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->next;
2086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2087d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2088d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2089d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2090d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2091d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2092d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2093d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2094d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2095d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2096d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2097d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2098d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2099d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj))
2101d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2102d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2103d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2104d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2105d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
2106d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2119faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard                res = (xmlNodePtr) attr->prev;
2120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2125faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard            res = cur->prev;
2126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2127d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2128d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2129d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2131d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2134d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2135d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2136d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2137d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2138d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:children", &obj))
2140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2142d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2143d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2144d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
2145d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2146d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2150d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2156d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->children;
2160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->children;
2165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
2166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2170d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2171d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2172d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2173d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2174d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2175d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2177d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2178d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2180d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2181d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2183d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2184d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2185d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2186d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2187d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
2188d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2189d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
2195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2197d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2199d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
2202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->last;
2203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2206d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->last;
2208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2210d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2213d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2214d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2215d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2216d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2217d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2219d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2220d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2221d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2222d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
2223d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj))
2225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
2230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2231d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2233d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
2234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
2235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2238d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2239d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
2241d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
2242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->parent;
2244d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_DECL:
2246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
2247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_START:
2248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_END:
2249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
2250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
2252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->parent;
2253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
2256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2257d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2258d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
2262d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
2263d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const xmlChar *res = NULL;
2265d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
2267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
2268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
2269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2270d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2271d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
2272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2273d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
2275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
2276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "element";
2277d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute";
2280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
2282d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "text";
2283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
2285d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "cdata";
2286d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
2288d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_ref";
2289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
2291d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity";
2292d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
2294d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "pi";
2295d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2296d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
2297d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "comment";
2298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
2300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_xml";
2301d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
2303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "doctype";
2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2305d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "fragment";
2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2308d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "notation";
2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2311d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_html";
2313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2314d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
2315d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "dtd";
2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
2318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "elem_decl";
2319d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
2321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute_decl";
2322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
2324d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_decl";
2325d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
2327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "namespace";
2328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
2330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_start";
2331d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
2333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_end";
2334d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
2336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
2337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_docbook";
2338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
2339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
2341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
2342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
2343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
23451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
2347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
235136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
235236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
235336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
235436eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
235736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
235836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
235936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
236036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
236136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node))
2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
236536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
236636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
236736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
237036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
237136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
237236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
237436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
237536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
237636eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
237936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
238036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
238136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
238236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
238336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node))
2385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
238636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
238736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2388e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard    if ((node == NULL) ||
2389e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard        ((node->type != XML_ELEMENT_NODE) &&
2390e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard	 (node->type != XML_ATTRIBUTE_NODE))) {
2391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
239336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
239436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
239536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
2396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
239736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
239836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
2399a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
240036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
240136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
24021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *			Serialization front-end				*
24031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
24041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/
24051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
24091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_retval = NULL;
24101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlChar *c_retval;
24111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
24121e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
24131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
24151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
24161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
24171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2418d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node,
2419d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &encoding, &format))
2420d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
24211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
24221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
24231e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2424d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2425d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
24261e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
24271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2428d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2429d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len,
2430d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                  (const char *) encoding, format);
2431d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
24321e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2433d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferPtr buf;
2434d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlCharEncodingHandlerPtr handler = NULL;
2435d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2436d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
2437d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL)
2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2439d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        encoding = (const char *) htmlGetMetaEncoding(doc);
2440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL) {
2442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler(encoding);
2443d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL) {
2444d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2445d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /*
2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         * Fallback to HTML or ASCII when the encoding is unspecified
2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         */
2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2453d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2455d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2457d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf = xmlAllocOutputBuffer(handler);
2458d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf == NULL) {
2459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2461d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2462d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2463d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferFlush(buf);
2464d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf->conv != NULL) {
2465d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->conv->use;
2466d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->conv->content;
2467d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->conv->content = NULL;
2468d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2469d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->buffer->use;
2470d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->buffer->content;
2471d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->buffer->content = NULL;
2472d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
2473d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (void) xmlOutputBufferClose(buf);
2474d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
24751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2476d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
2477a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard        if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) {
2478d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2480d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2484d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2511d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL)
2512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
2514d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2516d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2518d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2519d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2520d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2522d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * Fallback to HTML or ASCII when the encoding is unspecified
2524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
2525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("HTML");
2527d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2528d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("ascii");
2529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2530d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2544d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2545d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2546d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2547d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2548d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
25521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
25541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
25551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2556d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2557d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2558d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
25591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_file = NULL;
25601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    FILE *output;
25611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
25621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
25631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2564d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
25651e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
25661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
25671e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlOutputBufferPtr buf;
25681e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
25691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2570d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node,
2571d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &py_file, &encoding, &format))
2572d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
25731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
25741e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
25751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
25771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
25781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
25801e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
25811e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    output = PyFile_AsFile(py_file);
25821e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (output == NULL) {
2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
25841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
25851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
25861e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2587d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
25881e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2589d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
25901e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
25921e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
25931e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding == NULL)
2595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
25961e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
25971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (encoding != NULL) {
2598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        handler = xmlFindCharEncodingHandler(encoding);
2599d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL) {
2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (PyInt_FromLong((long) -1));
2601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
26021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
26031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2605d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
26081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
26091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
26101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    buf = xmlOutputBufferCreateFile(output, handler);
26111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlSaveFormatFileTo(buf, doc, encoding, format);
26131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2614d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
26161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2617d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
26191e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
26221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (PyInt_FromLong((long) len));
26241e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
2625a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
26261e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
26271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************
26281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
2629a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *			Extra stuff					*
2630a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2631a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/
2632a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject *
2633d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2634d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2635a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    PyObject *py_retval;
2636d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    xmlChar *name;
2637a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    xmlNodePtr node;
2638a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2639d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name))
2640d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2641a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    node = (xmlNodePtr) xmlNewNode(NULL, name);
26423b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG
2643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("NewNode: %s : %p\n", name, (void *) node);
26443b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif
2645a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2646a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    if (node == NULL) {
2647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2648d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
2649a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    }
2650a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    py_retval = libxml_xmlNodePtrWrap(node);
2651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2652a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard}
2653a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
26545439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26555439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************
26565439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
26575439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *			Local Catalog stuff				*
26585439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard *									*
26595439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/
26605439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject *
26615439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
26625439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{
26635439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlChar *URL;
26645439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    xmlParserCtxtPtr ctxt;
26655439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    PyObject *pyobj_ctxt;
26665439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26675439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL))
26685439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard        return(NULL);
26695439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26705439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt);
26715439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26725439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    if (URL != NULL) {
26735439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard	ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL);
26745439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    }
26755439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26765439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG
26775439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    printf("LocalCatalog: %s\n", URL);
26785439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif
26795439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
26805439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    Py_INCREF(Py_None);
26815439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    return (Py_None);
26825439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard}
26835439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard
2684c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
2685c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2686c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************
2687c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
2688c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration                                   *
2689c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard *                                                                      *
2690c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/
2691c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2692c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct
2693c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2694c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *warn;
2695c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *error;
2696c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *arg;
2697c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt;
2698c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr;
2699c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2700c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
2701c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str)
2702c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2703c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
2704c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
2705c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
2706c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2707c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
2708c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str);
2709c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2710c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2711c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
2712c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2713c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
2714c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
2715c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
2716c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
2717c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->error, list);
2718c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
2719c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2720c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
2721c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
2722c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
2723c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
2724c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
2725c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2726c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2727c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
2728c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str)
2729c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2730c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *list;
2731c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *result;
2732c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
2733c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2734c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
2735c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str);
2736c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2737c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2738c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx;
2739c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2740c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    list = PyTuple_New(2);
2741c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 0, libxml_charPtrWrap(str));
2742c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyTuple_SetItem(list, 1, pyCtxt->arg);
2743c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyCtxt->arg);
2744c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    result = PyEval_CallObject(pyCtxt->warn, list);
2745c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (result == NULL)
2746c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2747c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* TODO: manage for the exception to be propagated... */
2748c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        PyErr_Print();
2749c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
2750c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(list);
2751c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(result);
2752c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2753c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2754c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
2755c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...)
2756c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2757c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
2758c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2759c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
2760c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap));
2761c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
2762c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2763c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2764c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void
2765c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...)
2766c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2767c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_list ap;
2768c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2769c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_start(ap, msg);
2770c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap));
2771c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    va_end(ap);
2772c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2773c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2774c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
2775c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2776c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{
2777c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *py_retval;
2778c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_error;
2779c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_warn;
2780c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctx;
2781c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_arg = Py_None;
2782c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
2783c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
2784c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2785c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple
2786c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg))
2787c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return (NULL);
2788c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2789c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR
2790c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn);
2791c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2792c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2793c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx);
2794c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1)
2795c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2796c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        py_retval = libxml_intWrap(-1);
2797c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(py_retval);
2798c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
2799c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2800c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (pyCtxt == NULL)
2801c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2802c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        /* first time to set the error handlers */
2803c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt));
2804c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt == NULL) {
2805c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            py_retval = libxml_intWrap(-1);
2806c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            return(py_retval);
2807c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
2808c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt));
2809c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
2810c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2811c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    /* TODO: check warn and error is a function ! */
2812c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->error);
2813c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_error);
2814c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->error = pyobj_error;
2815c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2816c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->warn);
2817c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_warn);
2818c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->warn = pyobj_warn;
2819c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2820c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XDECREF(pyCtxt->arg);
2821c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_XINCREF(pyobj_arg);
2822c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    pyCtxt->arg = pyobj_arg;
2823c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2824c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt);
2825c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2826c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    py_retval = libxml_intWrap(1);
2827c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return (py_retval);
2828c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2829c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2830c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject *
2831c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
2832c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPtr ctxt;
2833c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt;
2834c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    PyObject *pyobj_ctxt;
2835c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2836c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt))
2837c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        return(NULL);
2838c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt);
2839c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2840c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack    if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0)
2841c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {
2842c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        if (pyCtxt != NULL)
2843c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        {
2844c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->error);
2845c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->warn);
2846c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            Py_XDECREF(pyCtxt->arg);
2847c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard            xmlFree(pyCtxt);
2848c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard        }
2849c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    }
2850c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2851c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    xmlRelaxNGFreeValidCtxt(ctxt);
2852c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    Py_INCREF(Py_None);
2853c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    return(Py_None);
2854c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard}
2855c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2856c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2857c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard
2858a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************
2859a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2860d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
2861d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
2862d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
2863d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
286496fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "name", libxml_name, METH_VARARGS, NULL},
2866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "children", libxml_children, METH_VARARGS, NULL},
2867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "properties", libxml_properties, METH_VARARGS, NULL},
2868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "last", libxml_last, METH_VARARGS, NULL},
2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "prev", libxml_prev, METH_VARARGS, NULL},
2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "next", libxml_next, METH_VARARGS, NULL},
2871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "parent", libxml_parent, METH_VARARGS, NULL},
2872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "type", libxml_type, METH_VARARGS, NULL},
2873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "doc", libxml_doc, METH_VARARGS, NULL},
2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL},
2875a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL},
2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL},
2878c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL},
28796cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL},
28806cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL},
28816cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard    { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL },
2882a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
2883c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
2884c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
28853e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard    {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL },
2886417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL },
2887417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard    {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL },
2888e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard    {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL },
288926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL },
289026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL },
289126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard    {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL },
28925439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard    {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL },
2893c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED
2894c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL},
2895c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard    {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL},
2896c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif
2897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {NULL, NULL, 0, NULL}
2898d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
2899d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
29000fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
29016361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void);
29020fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
29030fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard
2904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid
2905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void)
2906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2907af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    static int initialized = 0;
29083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
2909af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard
2910af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    if (initialized != 0)
2911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
2912781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    /* XXX xmlInitParser does much more than this */
2913781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard    xmlInitGlobals();
2914a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED
2915c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlRegisterDefaultOutputCallbacks();
2916a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */
2917c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlRegisterDefaultInputCallbacks();
2918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    m = Py_InitModule((char *) "libxml2mod", libxmlMethods);
2919af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    initialized = 1;
29205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
29216361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard
29220fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
29230fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard    initlibxsltmod();
29240fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
2925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2926