libxml.c revision 0d132cffc1733447f0fa9624f0265369a7f8c02a
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)
300d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif
310d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard
32d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */
33797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */
34a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */
355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */
364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */
37c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */
38c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */
394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
40d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void);
41d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
42c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
43c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO:
44c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
45c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks
46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO 								\
48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlGenericError(xmlGenericErrorContext,				\
49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    "Unimplemented block at %s:%d\n",				\
50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            __FILE__, __LINE__);
51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************
534e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *		Memory debug interface					*
554e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard *									*
564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/
574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr);
594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size);
60d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size);
614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str);
624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0;
644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0;
654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0;
674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL;
684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL;
694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL;
704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL;
714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
73d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDebugMemory(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
74d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int activate;
764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *py_retval;
774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    long ret;
784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
79d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate))
80d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY
834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_xmlDebugMemory(%d) called\n", activate);
844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (activate != 0) {
87d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebug == 0) {
88d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
89d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * First initialize the library and grab the old memory handlers
90d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * and switch the library to memory debugging
91d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
92d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlMemGet((xmlFreeFunc *) & freeFunc,
93d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlMallocFunc *) & mallocFunc,
94d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlReallocFunc *) & reallocFunc,
95d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                      (xmlStrdupFunc *) & strdupFunc);
96d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) &&
97d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (reallocFunc == xmlMemRealloc) &&
98d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                (strdupFunc == xmlMemoryStrdup)) {
99d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc,
102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         xmlMemRealloc, xmlMemoryStrdup);
103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (ret < 0)
104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    goto error;
105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                libxmlMemoryAllocatedBase = xmlMemUsed();
106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlInitParser();
108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (libxmlMemoryDebugActivated == 0) {
110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxmlMemoryAllocatedBase = xmlMemUsed();
111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebug = 1;
116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 1;
1174e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    } else {
118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (libxmlMemoryDebugActivated == 1)
119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = xmlMemUsed() - libxmlMemoryAllocatedBase;
120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else
121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ret = 0;
122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxmlMemoryDebugActivated = 0;
1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  error:
1254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    py_retval = libxml_longWrap(ret);
126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1274e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
1284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self,
131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                     ATTRIBUTE_UNUSED PyObject * args)
132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (libxmlMemoryDebug != 0)
135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlMemoryDump();
1364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    Py_INCREF(Py_None);
137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
1384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
139d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
142c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Handling Python FILE I/O at the C level			*
143c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	The raw I/O attack diectly the File objects, while the		*
144c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *	other routines address the ioWrapper instance instead		*
145c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
146c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
147c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
148c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
149c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref:
150c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
151c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
152c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
153c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
154c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
155c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) {
156c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file, *ret;
157c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
158c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
159c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileCloseUnref\n");
160c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
161c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
162c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
163118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "close", (char *) "()");
164c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
165c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
166c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
167c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(file);
168c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
169c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
170c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
171c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
172c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw:
173c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
174c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
175c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
176c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
177c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel
178c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
179c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
180c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
181c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
182c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) {
183c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
184c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
185c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
186c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
187c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
188c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
189c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileReadRaw: %d\n", len);
190c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
191c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
192c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
193118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len);
194c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
195c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is NULL\n");
196c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
197c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
198c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
199c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
200c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
201c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
202c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
203c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
204c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
205c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
206c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileReadRaw: result is not a String\n");
207c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
208c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
209c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
210c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
211c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
212c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
213c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead:
214c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
215c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
216c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
217c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
218c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel.
219c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
220c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read
221c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
222c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
223c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) {
224c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
225c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
226c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int lenread = -1;
227c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    char *data;
228c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
229c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileRead: %d\n", len);
231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
234118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len);
235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is NULL\n");
237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyString_Check(ret)) {
239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	lenread = PyString_Size(ret);
240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	data = PyString_AsString(ret);
241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (lenread > len)
242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, len);
243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	else
244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    memcpy(buffer, data, lenread);
245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileRead: result is not a String\n");
248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
249c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(lenread);
251c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite:
255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer:  where to drop data
257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len:  number of bytes to write
258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel.
260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written
262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) {
265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *string;
267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *ret;
268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    int written = -1;
269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileWrite: %d\n", len);
272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    string = PyString_FromStringAndSize(buffer, len);
276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (string == NULL) return(-1);
277118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", string);
278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    Py_DECREF(string);
279c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret == NULL) {
280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is NULL\n");
281c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(-1);
282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (PyInt_Check(ret)) {
283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = (int) PyInt_AsLong(ret);
284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else if (ret == Py_None) {
286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	written = len;
287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    } else {
289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("xmlPythonFileWrite: result is not an Int nor None\n");
290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(written);
293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose:
297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context:  the I/O context
298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel
300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int
302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) {
303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file, *ret;
304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES
306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("xmlPythonFileClose\n");
307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    file = (PyObject *) context;
309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(-1);
310118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard    ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()");
311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	Py_DECREF(ret);
313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(0);
315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile:
319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
320c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
322c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
327118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr
328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file,
329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncodingHandlerPtr encoder) {
330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr ret;
331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocOutputBuffer(encoder);
335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->writecallback = xmlPythonFileWrite;
339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlOutputBufferPtr buffer;
352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
353c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate",
355c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
358118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	handler = xmlFindCharEncodingHandler((const char *) encoding);
359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlOutputBufferCreatePythonFile(file, handler);
361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n");
363c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlOutputBufferPtrWrap(buffer);
364c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
365c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
366c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
367c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
368c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/**
369c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile:
370c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file:  a PyFile_Type
371c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder:  the encoding converter or NULL
372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type
374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O
375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *
376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL
377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */
378118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr
379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file,
380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	                        xmlCharEncoding encoding) {
381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr ret;
382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (file == NULL) return(NULL);
384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    ret = xmlAllocParserInputBuffer(encoding);
386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (ret != NULL) {
387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ret->context = file;
388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	/* Py_INCREF(file); */
389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->readcallback = xmlPythonFileRead;
390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret->closecallback = xmlPythonFileClose;
391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(ret);
394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
395c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
397c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *file;
400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlChar  *encoding;
401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlCharEncoding enc = XML_CHAR_ENCODING_NONE;
402c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputBufferPtr buffer;
403c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
404c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
405c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate",
406c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&file, &encoding))
407c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
408c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((encoding != NULL) && (encoding[0] != 0)) {
409118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	enc = xmlParseCharEncoding((const char *) encoding);
410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    buffer = xmlParserInputBufferCreatePythonFile(file, enc);
412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (buffer == NULL)
413c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n");
414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = libxml_xmlParserInputBufferPtrWrap(buffer);
415c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *		Providing the resolver at the Python level		*
421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/
423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
424c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL;
425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext;
426c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr
428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID,
429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			   xmlParserCtxtPtr ctxt) {
430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlParserInputPtr result = NULL;
431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (pythonExternalEntityLoaderObjext != NULL) {
432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ret;
433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject *ctxtobj;
434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt);
436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: ready to call\n");
438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext,
441118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard		      (char *) "(ssO)", URL, ID, ctxtobj);
442c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("pythonExternalEntityLoader: result ");
444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	PyObject_Print(ret, stdout, 0);
445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	printf("\n");
446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	if (ret != NULL) {
449118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard	    if (PyObject_HasAttrString(ret, (char *) "read")) {
450c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		xmlParserInputBufferPtr buf;
451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE);
453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		if (buf != NULL) {
454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->context = ret;
455c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->readcallback = xmlPythonFileReadRaw;
456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    buf->closecallback = xmlPythonFileCloseRaw;
457c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		    result = xmlNewIOInputStream(ctxt, buf,
458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard			                         XML_CHAR_ENCODING_NONE);
459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		}
460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    } else {
461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		printf("pythonExternalEntityLoader: can't read\n");
462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
463c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    if (result == NULL) {
464c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		Py_DECREF(ret);
465c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    }
466c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	}
467c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
468c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if ((result == NULL) && (defaultExternalEntityLoader != NULL)) {
469c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	result = defaultExternalEntityLoader(URL, ID, ctxt);
470c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    }
471c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(result);
472c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
473c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
474c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject *
475c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) {
476c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *py_retval;
477c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    PyObject *loader;
478c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
479c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader",
480c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard		&loader))
481c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(NULL);
482c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
483c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER
484c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    printf("libxml_xmlSetEntityLoader\n");
485c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif
486c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    if (defaultExternalEntityLoader == NULL)
487c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	defaultExternalEntityLoader = xmlGetExternalEntityLoader();
488c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
489c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    pythonExternalEntityLoaderObjext = loader;
490c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlSetExternalEntityLoader(pythonExternalEntityLoader);
491c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
492c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    py_retval = PyInt_FromLong(0);
493c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    return(py_retval);
494c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard}
495c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
496c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
497c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************
498c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard *									*
4993ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling SAX/xmllib/sgmlop callback interfaces		*
500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
5021971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
50333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
50433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name,
50533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar ** attrs)
50633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
50733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int i;
50833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
50933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *dict;
51033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrname;
51133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *attrvalue;
512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
51333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
51433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
515797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
516797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartElement(%s) called\n", name);
517797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
51833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
519d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startElement"))
52033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "start"))
52233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
52333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
52433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        /*
52533caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * the xmllib interface always generate a dictionnary,
52633caa0b8307eccf22010400747830b1967edb292Daniel Veillard         * possibly empty
52733caa0b8307eccf22010400747830b1967edb292Daniel Veillard         */
52833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if ((attrs == NULL) && (type == 1)) {
52933caa0b8307eccf22010400747830b1967edb292Daniel Veillard            Py_XINCREF(Py_None);
53033caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = Py_None;
531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (attrs == NULL) {
532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            dict = PyDict_New();
53333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        } else {
53433caa0b8307eccf22010400747830b1967edb292Daniel Veillard            dict = PyDict_New();
53533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            for (i = 0; attrs[i] != NULL; i++) {
536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                attrname = PyString_FromString((char *) attrs[i]);
53733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                i++;
53833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                if (attrs[i] != NULL) {
539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    attrvalue = PyString_FromString((char *) attrs[i]);
54033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                } else {
54133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    Py_XINCREF(Py_None);
54233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    attrvalue = Py_None;
54333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                }
54433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                PyDict_SetItem(dict, attrname, attrvalue);
54533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            }
54633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
54733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
54833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "startElement",
550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
55133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
552d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "start",
553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "sO", name, dict);
554d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
555d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
55633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(dict);
55733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
55833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
55933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
56033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
56133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
56233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data)
56333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
56433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
56533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
56633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
567797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
568797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonStartDocument() called\n");
569797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
57033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
571d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "startDocument")) {
572d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
573d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "startDocument", NULL);
574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
575d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
57633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
57733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
57833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
57933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
58033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
58133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data)
58233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
58333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
58433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
58533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
586797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
587797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndDocument() called\n");
588797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
58933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
590d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endDocument")) {
591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "endDocument", NULL);
593d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
59533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
59633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
59733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    /*
59833caa0b8307eccf22010400747830b1967edb292Daniel Veillard     * The reference to the handler is released there
59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard     */
60033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    Py_XDECREF(handler);
60133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
60233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
60333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
60433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name)
60533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
60633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
60733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
60833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
609797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
610797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonEndElement(%s) called\n", name);
611797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
61233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "endElement")) {
614d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "endElement",
615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
617d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
61833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    } else if (PyObject_HasAttrString(handler, (char *) "end")) {
620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "end",
621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
624797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard        Py_XDECREF(result);
62533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
62633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
62733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
62833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
62933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name)
63033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
63133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
63233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
63333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
634797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
635797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonReference(%s) called\n", name);
636797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
63733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
638d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "reference")) {
639d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "reference",
640d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "s", name);
641d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
64333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
64433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
64533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
64633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
64733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
64833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len)
64933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
65033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
65233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
65333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
654797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
655797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCharacters(%s, %d) called\n", ch, len);
656797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
65733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
658d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "characters"))
659d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
661d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
66233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
663d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "characters",
665d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
666d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
667d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result = PyObject_CallMethod(handler, (char *) "data",
668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                         (char *) "s#", ch, len);
669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
670d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
67133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
67233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
67333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
67433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
67533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
67633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len)
67733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
67833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
679d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
68033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
68133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
682797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
683797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len);
684797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
68533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace"))
68733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 1;
688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "data"))
68933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        type = 2;
69033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
69133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        if (type == 1)
69233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            result =
693d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler,
694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "ignorableWhitespace",
695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
69633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        else if (type == 2)
697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
698d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "data",
699d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
70033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
70133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
70233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
70333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
70433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
70533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data,
70633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                            const xmlChar * target, const xmlChar * data)
70733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
70833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
70933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
71033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
711797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
712797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonProcessingInstruction(%s, %s) called\n", target, data);
713797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
71433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
715d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) {
716d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *)
717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     "processingInstruction",
718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ss", target, data);
71933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
72033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
72133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
72233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
72333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
72433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value)
72533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
72633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
72733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
72833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
729797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
730797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonComment(%s) called\n", value);
731797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
73233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "comment")) {
734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "comment", (char *) "s",
736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                value);
737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
738d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
74333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
74433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...)
74533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
74833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
75033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
751797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
752797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonWarning(%s) called\n", msg);
753797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
75433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
755d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "warning")) {
75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "warning", (char *) "s",
762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
76533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
76933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
77033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...)
77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
777797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
778797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonError(%s) called\n", msg);
779797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
78033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "error")) {
78233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "error", (char *) "s",
788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                buf);
789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
79233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
79333caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
79533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
79633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...)
79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
79833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
79933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
80033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    va_list args;
80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    char buf[1024];
80233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
803797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
804797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonFatalError(%s) called\n", msg);
805797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
80633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "fatalError")) {
80833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        va_start(args, msg);
80933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        vsnprintf(buf, 1023, msg, args);
810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(args);
811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf[1023] = 0;
812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "fatalError",
814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "s", buf);
815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
81733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
81833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
81933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
82133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
82233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len)
82333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    PyObject *result = NULL;
82633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int type = 0;
82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
828797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
829797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonCdataBlock(%s, %d) called\n", ch, len);
830797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "cdataBlock"))
833d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 1;
834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    else if (PyObject_HasAttrString(handler, (char *) "cdata"))
835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        type = 2;
83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    if (type != 0) {
837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (type == 1)
838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdataBlock",
840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        else if (type == 2)
842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            result =
843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                PyObject_CallMethod(handler, (char *) "cdata",
844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                    (char *) "s#", ch, len);
845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
84733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
84833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
84933caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
85033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
85133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
85233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data,
85333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * name,
85433caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * externalID, const xmlChar * systemID)
85533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
85633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard
859797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
860797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonExternalSubset(%s, %s, %s) called\n",
861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, externalID, systemID);
862797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
86333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "externalSubset")) {
86533caa0b8307eccf22010400747830b1967edb292Daniel Veillard        result =
866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "externalSubset",
867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "sss", name, externalID,
868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                systemID);
86933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
87033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
87133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
87233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
87333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
87433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data,
87533caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * name,
87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 int type,
87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * publicId,
87833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                 const xmlChar * systemId, xmlChar * content)
87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
88233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
88333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "entityDecl")) {
885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "entityDecl",
886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sisss", name, type,
887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     publicId, systemId, content);
888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
89033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
89133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
89233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
89333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
89433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
89533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
89633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
89733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
89833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data,
89933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * name,
90033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                   const xmlChar * publicId, const xmlChar * systemId)
90133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
90233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard
90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "notationDecl")) {
907d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "notationDecl",
908d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, publicId,
909d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     systemId);
910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
91333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
91433caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
91533caa0b8307eccf22010400747830b1967edb292Daniel Veillard
91633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
91733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data,
91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * elem,
91933caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    const xmlChar * name,
92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int type,
92133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                    int def,
922d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    const xmlChar * defaultValue, xmlEnumerationPtr tree)
92333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
92433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *nameList;
92633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *newName;
92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    xmlEnumerationPtr node;
92833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
92933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    int count;
93033caa0b8307eccf22010400747830b1967edb292Daniel Veillard
93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) {
93333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
93633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard        nameList = PyList_New(count);
93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        count = 0;
93933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        for (node = tree; node != NULL; node = node->next) {
940d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            newName = PyString_FromString((char *) node->name);
94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard            PyList_SetItem(nameList, count, newName);
94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard            count++;
94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard        }
944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "attributeDecl",
945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "ssiisO", elem, name, type,
946d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     def, defaultValue, nameList);
947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
94933caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(nameList);
95033caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
95133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard
95433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
95533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data,
95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard                  const xmlChar * name,
957d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                  int type, ATTRIBUTE_UNUSED xmlElementContentPtr content)
95833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
96033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *obj;
96133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
96233caa0b8307eccf22010400747830b1967edb292Daniel Veillard
96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "elementDecl")) {
965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* TODO: wrap in an elementContent object */
966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n");
968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = Py_None;
969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */
970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "elementDecl",
971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "siO", name, type, obj);
972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
97433caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
97833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
97933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data,
98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * name,
98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * publicId,
98233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * systemId,
98333caa0b8307eccf22010400747830b1967edb292Daniel Veillard                         const xmlChar * notationName)
98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
98633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard
98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) {
990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result =
991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyObject_CallMethod(handler, (char *) "unparsedEntityDecl",
992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                (char *) "ssss", name, publicId, systemId,
993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                notationName);
994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
99633caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
99733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard
100033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void
100133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name,
100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard                     const xmlChar * ExternalID, const xmlChar * SystemID)
100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{
100433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *handler;
100533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *result;
100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard
1007797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX
1008797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard    printf("pythonInternalSubset(%s, %s, %s) called\n",
1009d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           name, ExternalID, SystemID);
1010797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif
101133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    handler = (PyObject *) user_data;
1012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (PyObject_HasAttrString(handler, (char *) "internalSubset")) {
1013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyObject_CallMethod(handler, (char *) "internalSubset",
1014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     (char *) "sss", name, ExternalID,
1015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                     SystemID);
1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (PyErr_Occurred())
1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            PyErr_Print();
101833caa0b8307eccf22010400747830b1967edb292Daniel Veillard        Py_XDECREF(result);
101933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    }
102033caa0b8307eccf22010400747830b1967edb292Daniel Veillard}
102133caa0b8307eccf22010400747830b1967edb292Daniel Veillard
102233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = {
102333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonInternalSubset,
1024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonIsStandalone, */
1025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasInternalSubset, */
1026d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonHasExternalSubset, */
1027d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonResolveEntity, */
1028d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetEntity, */
102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEntityDecl,
103033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonNotationDecl,
103133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonAttributeDecl,
103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonElementDecl,
103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonUnparsedEntityDecl,
1034d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* OBSOLETED pythonSetDocumentLocator, */
103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartDocument,
103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndDocument,
103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonStartElement,
103833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonEndElement,
103933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonReference,
104033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCharacters,
104133caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonIgnorableWhitespace,
104233caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonProcessingInstruction,
104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonComment,
104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonWarning,
104533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonError,
104633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonFatalError,
1047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    NULL,                       /* TODO pythonGetParameterEntity, */
104833caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonCdataBlock,
104933caa0b8307eccf22010400747830b1967edb292Daniel Veillard    pythonExternalSubset,
105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard    1
105133caa0b8307eccf22010400747830b1967edb292Daniel Veillard};
1052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
10533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************
10543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
10553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *		Handling of specific parser context			*
10563ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard *									*
10573ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/
10581971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
10591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject *
1060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           PyObject * args)
1062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
10643ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    int size;
1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
106633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
10673ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlSAXHandlerPtr SAX = NULL;
10683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    xmlParserCtxtPtr ret;
10693ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *pyret;
10703ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard
1071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk,
1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
10751971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
10768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
10773ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n",
1078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
10791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif
10803ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    if (pyobj_SAX != Py_None) {
1081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1083d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
10841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    }
108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI);
10863ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1087d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
1088a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
10895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
10904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject *
1091d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self,
1092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                            PyObject * args)
1093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1094d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *chunk;
10954e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    int size;
1096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
109733caa0b8307eccf22010400747830b1967edb292Daniel Veillard    PyObject *pyobj_SAX = NULL;
10984e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
10994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    xmlParserCtxtPtr ret;
11004e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    PyObject *pyret;
11014e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
1102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk,
1104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &size, &URI))
1105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
11064e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
11078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
11084e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n",
1109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, chunk, size, URI);
11104e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif
11114e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    if (pyobj_SAX != Py_None) {
1112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        SAX = &pythonSaxHandler;
1113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(pyobj_SAX);
1114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /* The reference is released in pythonEndDocument() */
11154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    }
111633caa0b8307eccf22010400747830b1967edb292Daniel Veillard    ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI,
1117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                   XML_CHAR_ENCODING_NONE);
11184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard    pyret = libxml_xmlParserCtxtPtrWrap(ret);
1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (pyret);
11204e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard}
11214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard
11228d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
11258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    int recover;
1126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
11278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
11288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
11298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX,
1131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &URI, &recover))
1132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
11338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
11348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
11358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n",
1136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, recover);
11378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
11388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
11418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
11428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
11438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
11448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
11458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXParseFileWithData(SAX, URI, recover, pyobj_SAX);
11468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
11488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
11498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
11508d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject *
1151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *URI;
1154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
11558d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    PyObject *pyobj_SAX = NULL;
11568d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    xmlSAXHandlerPtr SAX = NULL;
11578d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI,
1160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &encoding))
1161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
11628d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
11638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG
11648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n",
1165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_SAX, URI, encoding);
11668d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif
11678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    if (pyobj_SAX == Py_None) {
1168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
11708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    }
11718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    SAX = &pythonSaxHandler;
11728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(pyobj_SAX);
11738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    /* The reference is released in pythonEndDocument() */
11748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX);
11758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    Py_INCREF(Py_None);
1176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (Py_None);
11778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard}
11788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
11795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************
11805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
11815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *			Error message callback				*
11825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard *									*
11835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/
11845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
11855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL;
11865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL;
11875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
11885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg,
1190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                           ...)
1191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int size;
1193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    int chars;
1194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    char *larger;
1195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    va_list ap;
1196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    char *str;
11975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *list;
11985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *message;
11995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *result;
12005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
12025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg);
12035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
12045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler == NULL) {
1207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_start(ap, msg);
1208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        vfprintf(stdout, msg, ap);
1209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        va_end(ap);
12105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    } else {
1211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        str = (char *) xmlMalloc(150);
1212d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (str == NULL)
1213d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return;
1214d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        size = 150;
1216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        while (1) {
1218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            va_start(ap, msg);
1219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            chars = vsnprintf(str, size, msg, ap);
1220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            va_end(ap);
1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((chars > -1) && (chars < size))
1222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (chars > -1)
1224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                size += chars + 1;
1225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            else
1226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                size += 100;
1227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if ((larger = (char *) xmlRealloc(str, size)) == NULL) {
1228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlFree(str);
1229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return;
1230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1231d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            str = larger;
1232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1233d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        list = PyTuple_New(2);
1235d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt);
1236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(libxml_xmlPythonErrorFuncCtxt);
1237d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        message = libxml_charPtrWrap(str);
1238d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, 1, message);
1239d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list);
1240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(list);
1241d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(result);
12425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
12435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
12445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void
1246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void)
1247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
12485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
12495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    printf("libxml_xmlErrorInitialize() called\n");
12505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
12515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler);
12525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
12535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject *
1255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self,
1256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                               PyObject * args)
1257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
12585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *py_retval;
12595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_f;
12605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    PyObject *pyobj_ctx;
12615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
1262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f,
1264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &pyobj_ctx))
1265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
12665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR
1268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx,
1269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           pyobj_f);
12705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif
12715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncHandler != NULL) {
1273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncHandler);
12745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
12755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    if (libxml_xmlPythonErrorFuncCtxt != NULL) {
1276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XDECREF(libxml_xmlPythonErrorFuncCtxt);
12775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    }
12785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_ctx);
12805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    Py_XINCREF(pyobj_f);
12815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    /* TODO: check f is a function ! */
12835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncHandler = pyobj_f;
12845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlPythonErrorFuncCtxt = pyobj_ctx;
12855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard
12865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    py_retval = libxml_intWrap(1);
1287d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
12885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard}
1289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1290a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************
1291a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
1292a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *			XPath extensions				*
1293a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard *									*
1294a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/
1295a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1296a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0;
1297a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1298a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback {
1299a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
1300a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
1301a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
1302a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *function;
1303a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr;
1304a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10];
1305a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0;
1306a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10;
1307a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1308a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
1309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs)
1310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1311a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *list, *cur, *result;
1312a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathObjectPtr obj;
131370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    xmlXPathContextPtr rctxt;
131470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    PyObject *current_function = NULL;
131570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *name;
131670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    const xmlChar *ns_uri;
1317a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1318a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
131970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (ctxt == NULL)
1320d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
132170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    rctxt = ctxt->context;
132270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (rctxt == NULL)
1323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
132470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    name = rctxt->function;
132570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    ns_uri = rctxt->functionURI;
1326a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name,
1328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ns_uri);
1329a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1330a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
133170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
133270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * Find the function, it should be there it was there at lookup
133370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
1334d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (                    /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */
1336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard               (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard               (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            current_function = libxml_xpathCallbacks[i].function;
1339d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
134070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
134170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    if (current_function == NULL) {
1342d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf
1343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            ("libxml_xmlXPathFuncCallback: internal error %s not found !\n",
1344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             name);
1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
134670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    }
134770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard
1348c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    list = PyTuple_New(nargs + 1);
1349c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard    PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt));
1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < nargs; i++) {
1351d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        obj = valuePop(ctxt);
1352d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        cur = libxml_xmlXPathObjectPtrWrap(obj);
1353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        PyTuple_SetItem(list, i + 1, cur);
1354a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1355a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    result = PyEval_CallObject(current_function, list);
1356a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    Py_DECREF(list);
1357a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1358a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    obj = libxml_xmlXPathObjectPtrConvert(result);
1359a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    valuePush(ctxt, obj);
1360a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1361a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1362a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction
1363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name,
1364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                              const xmlChar * ns_uri)
1365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1366a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1368a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1369a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n",
1370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctxt, name, ns_uri);
1371a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
137270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard    /*
137370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * This is called once only. The address is then stored in the
137470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * XPath expression evaluation, the proper object to call can
137570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * then still be found using the execution context function
137670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     * and functionURI fields.
137770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard     */
1378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if ((ctxt == libxml_xpathCallbacks[i].ctx) &&
1380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1382d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (libxml_xmlXPathFuncCallback);
1383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1384a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (NULL);
1386a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1387a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1388a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void
1389d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void)
1390d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1391a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1392a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1393a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized != 0)
1394d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
1395a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1396a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1397a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_xpathCallbacksInitialized called\n");
1398a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1399a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < 10; i++) {
1401d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].ctx = NULL;
1402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].name = NULL;
1403d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].ns_uri = NULL;
1404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].function = NULL;
1405a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1406a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    libxml_xpathCallbacksInitialized = 1;
1407a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1408a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1409a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject *
1410d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self,
1411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                PyObject * args)
1412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
1413a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *py_retval;
1414a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int c_retval = 0;
1415a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *name;
1416a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlChar *ns_uri;
1417a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathContextPtr ctx;
1418a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_ctx;
1419a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    PyObject *pyobj_f;
1420a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    int i;
1421a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1423d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name,
1424d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         &ns_uri, &pyobj_f))
1425d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
1426a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1427a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx);
1428a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksInitialized == 0)
1429d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacksInitialize();
1430a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx);
1431a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
1432a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) {
1433d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_intWrap(-1);
1434d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (py_retval);
1435a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1436a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH
1437a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    printf("libxml_registerXPathFunction(%p, %s, %s) called\n",
1438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard           ctx, name, ns_uri);
1439a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif
1440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    for (i = 0; i < libxml_xpathCallbacksNb; i++) {
1441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if ((ctx == libxml_xpathCallbacks[i].ctx) &&
1442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) &&
1443d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) {
1444d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XINCREF(pyobj_f);
1445d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_XDECREF(libxml_xpathCallbacks[i].function);
1446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            libxml_xpathCallbacks[i].function = pyobj_f;
1447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = 1;
1448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            goto done;
1449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1450a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1451a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) {
1452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        printf("libxml_registerXPathFunction() table full\n");
1453a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    } else {
1454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        i = libxml_xpathCallbacksNb++;
1455d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_XINCREF(pyobj_f);
1456a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ctx = ctx;
1457a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].name = xmlStrdup(name);
1458a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard        libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri);
1459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        libxml_xpathCallbacks[i].function = pyobj_f;
1460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        c_retval = 1;
1461a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    }
1462d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard  done:
1463a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard    py_retval = libxml_intWrap((int) c_retval);
1464d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
1465a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard}
1466a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
14671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************
14681971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard *									*
1469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			Global properties access			*
1470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
1471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
1472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1473d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    const xmlChar *res;
1478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:name", &obj))
1480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_name: cur = %p type %d\n", cur, cur->type);
1485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:{
1493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlDocPtr doc = (xmlDocPtr) cur;
1494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = doc->URL;
1496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->name;
1502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
1505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
1506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = ns->prefix;
1508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1511d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->name;
1512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
15141971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
1515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1520d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlDocPtr res;
1525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj))
1527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_doc: cur = %p\n", cur);
1532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1544d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1545d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->doc;
1546d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1547d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1548d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
1549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1552d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->doc;
1553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlDocPtrWrap(res);
1556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1560d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur = NULL;
1564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlAttrPtr res;
1565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1566d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj))
1567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    if (cur->type == XML_ELEMENT_NODE)
1570d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = cur->properties;
1571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    else
1572d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        res = NULL;
1573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlAttrPtrWrap(res);
1574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1578d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1584d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:next", &obj))
1585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_next: cur = %p\n", cur);
1590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1593d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1599d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1602d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) attr->next;
1604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1605d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:{
1607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlNsPtr ns = (xmlNsPtr) cur;
1608d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = (xmlNodePtr) ns->next;
1610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1611d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->next;
1614d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1628d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj))
1629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_prev: cur = %p\n", cur);
1634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1636d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1637d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1639d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1641d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1644d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1645d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1647faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard                res = (xmlNodePtr) attr->prev;
1648d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1649d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
1650d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1652d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1653faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard            res = cur->prev;
1654d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1661d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1667d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:children", &obj))
1668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_children: cur = %p\n", cur);
1673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1675d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1676d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
1677d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
1678d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
1679d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
1680d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
1681d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1683d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1685d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
1687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->children;
1688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1689d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1691d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1692d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->children;
1693d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                break;
1694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1696d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1700d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1704d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1709d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
1711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1713d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1715d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_last: cur = %p\n", cur);
1716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1719d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ELEMENT_NODE:
1720d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_REF_NODE:
1721d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_NODE:
1722d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_PI_NODE:
1723d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_COMMENT_NODE:
1724d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1725d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1726d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1728d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1729d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DTD_NODE:
1730d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->last;
1731d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->last;
1736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1738d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1740d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1741d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1742d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1743d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1744d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1745d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1747d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1748d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1749d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1750d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr res;
1751d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj))
1753d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1754d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1756d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1757d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_parent: cur = %p\n", cur);
1758d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCUMENT_NODE:
1762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_HTML_DOCUMENT_NODE:
1763d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1765d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1766d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ATTRIBUTE_NODE:{
1769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                xmlAttrPtr attr = (xmlAttrPtr) cur;
1770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                res = attr->parent;
1772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1773d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_ENTITY_DECL:
1774d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_NAMESPACE_DECL:
1775d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_START:
1776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_XINCLUDE_END:
1777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = NULL;
1778d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        default:
1780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = cur->parent;
1781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1782d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1783d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    resultobj = libxml_xmlNodePtrWrap(res);
1784d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1785d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1786d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1787d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject *
1788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1789d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{
1790d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    PyObject *resultobj, *obj;
1791d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    xmlNodePtr cur;
1792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const xmlChar *res = NULL;
1793d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:last", &obj))
1795d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        return NULL;
1796d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    cur = PyxmlNode_Get(obj);
1797d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1798d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1799d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p\n", cur);
1800d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1801d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    switch (cur->type) {
1803d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_NODE:
1804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "element";
1805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1806d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_NODE:
1807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute";
1808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1809d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_TEXT_NODE:
1810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "text";
1811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1812d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_CDATA_SECTION_NODE:
1813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "cdata";
1814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1815d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_REF_NODE:
1816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_ref";
1817d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1818d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_NODE:
1819d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity";
1820d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1821d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_PI_NODE:
1822d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "pi";
1823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1824d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_COMMENT_NODE:
1825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "comment";
1826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1827d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_NODE:
1828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_xml";
1829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1830d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_TYPE_NODE:
1831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "doctype";
1832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1833d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DOCUMENT_FRAG_NODE:
1834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "fragment";
1835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1836d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NOTATION_NODE:
1837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "notation";
1838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1839d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_HTML_DOCUMENT_NODE:
1840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_html";
1841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1842d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_DTD_NODE:
1843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "dtd";
1844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1845d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ELEMENT_DECL:
1846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "elem_decl";
1847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1848d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ATTRIBUTE_DECL:
1849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "attribute_decl";
1850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1851d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_ENTITY_DECL:
1852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "entity_decl";
1853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1854d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_NAMESPACE_DECL:
1855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "namespace";
1856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1857d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_START:
1858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_start";
1859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1860d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        case XML_XINCLUDE_END:
1861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "xinclude_end";
1862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1863d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED
1864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        case XML_DOCB_DOCUMENT_NODE:
1865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            res = (const xmlChar *) "document_docbook";
1866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            break;
1867d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1868d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    }
1869d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG
1870d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    printf("libxml_type: cur = %p: %s\n", cur, res);
1871d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif
1872d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
18731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    resultobj = libxml_constxmlCharPtrWrap(res);
1874d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    return resultobj;
1875d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
1876d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
1877d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************
1878d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
187936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *			Specific accessor functions			*
188036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
188136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/
188236eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
1883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
188536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
188636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
188736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
188836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
188936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
1890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple
1891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node))
1892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
189336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
189436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
189536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
1896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
189836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
189936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->nsDef;
190036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
1901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
190236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
190336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
190436eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject *
1905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
190736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *py_retval;
190836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNsPtr c_retval;
190936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    xmlNodePtr node;
191036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    PyObject *pyobj_node;
191136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
1912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node))
1913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
191436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
191536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
191636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
1917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
191936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    }
192036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    c_retval = node->ns;
192136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard    py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
1922d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
192336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard}
192436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard
192536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************
192636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard *									*
19271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *			Serialization front-end				*
19281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
19291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/
19301e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
1931d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
1932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
1933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
19341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_retval = NULL;
19351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlChar *c_retval;
19361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
19371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
19381e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
1939d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
19401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
19411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
19421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
1943d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node,
1944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &encoding, &format))
1945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
19461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
19471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
19481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
1949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
1950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
19511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
19521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
1953d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
1954d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len,
1955d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                                  (const char *) encoding, format);
1956d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
19571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
1958d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferPtr buf;
1959d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlCharEncodingHandlerPtr handler = NULL;
1960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
1962d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL)
1963d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
1964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        encoding = (const char *) htmlGetMetaEncoding(doc);
1965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding != NULL) {
1967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler(encoding);
1968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL) {
1969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
1970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
1971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
1972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        /*
1975d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         * Fallback to HTML or ASCII when the encoding is unspecified
1976d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard         */
1977d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
1978d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
1979d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
1980d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
1981d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
1982d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        buf = xmlAllocOutputBuffer(handler);
1983d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf == NULL) {
1984d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
1985d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
1986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1987d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
1988d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlOutputBufferFlush(buf);
1989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (buf->conv != NULL) {
1990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->conv->use;
1991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->conv->content;
1992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->conv->content = NULL;
1993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
1994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            len = buf->buffer->use;
1995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            c_retval = buf->buffer->content;
1996d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf->buffer->content = NULL;
1997d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
1998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        (void) xmlOutputBufferClose(buf);
1999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        py_retval = libxml_charPtrWrap((char *) c_retval);
20001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2001d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
2002a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard        if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) {
2003d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2004d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2005d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2006d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2007d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2008d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2009d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2010d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2011d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2022d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2023d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2026d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2027d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2028d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2029d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2030d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2031d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2032d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2033d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferPtr buf;
2034d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlCharEncodingHandlerPtr handler = NULL;
2035d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2036d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL)
2037d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                htmlSetMetaEncoding(doc, (const xmlChar *) encoding);
2038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
2039d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (encoding != NULL) {
2040d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler(encoding);
2041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                if (handler == NULL) {
2042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    Py_INCREF(Py_None);
2043d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                    return (Py_None);
2044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                }
2045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            /*
2048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             * Fallback to HTML or ASCII when the encoding is unspecified
2049d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard             */
2050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("HTML");
2052d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (handler == NULL)
2053d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                handler = xmlFindCharEncodingHandler("ascii");
2054d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard
2055d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            buf = xmlAllocOutputBuffer(handler);
2056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf == NULL) {
2057d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                Py_INCREF(Py_None);
2058d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                return (Py_None);
2059d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            xmlOutputBufferFlush(buf);
2062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            if (buf->conv != NULL) {
2063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->conv->use;
2064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->conv->content;
2065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->conv->content = NULL;
2066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            } else {
2067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                len = buf->buffer->use;
2068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                c_retval = buf->buffer->content;
2069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                buf->buffer->content = NULL;
2070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            }
2071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            (void) xmlOutputBufferClose(buf);
2072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            py_retval = libxml_charPtrWrap((char *) c_retval);
2073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        } else {
2074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            Py_INCREF(Py_None);
2075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (Py_None);
2076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
20771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
20791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
20801e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject *
2082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2083d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
20841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *py_file = NULL;
20851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    FILE *output;
20861e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    PyObject *pyobj_node;
20871e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlNodePtr node;
20881e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlDocPtr doc;
2089d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    const char *encoding;
20901e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int format;
20911e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    int len;
20921e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlOutputBufferPtr buf;
20931e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    xmlCharEncodingHandlerPtr handler = NULL;
20941e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
2095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node,
2096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard                          &py_file, &encoding, &format))
2097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
20981e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
20991e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
21001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node == NULL) {
2101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
21021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if ((py_file == NULL) || (!(PyFile_Check(py_file)))) {
2104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
21051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    output = PyFile_AsFile(py_file);
21071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (output == NULL) {
2108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (PyInt_FromLong((long) -1));
21091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
21111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
21131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = (xmlDocPtr) node;
21151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        doc = node->doc;
21171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21181e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (encoding == NULL)
2120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            encoding = (const char *) htmlGetMetaEncoding(doc);
21211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (encoding != NULL) {
2123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        handler = xmlFindCharEncodingHandler(encoding);
2124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL) {
2125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            return (PyInt_FromLong((long) -1));
2126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        }
21271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (doc->type == XML_HTML_DOCUMENT_NODE) {
2129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("HTML");
2131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        if (handler == NULL)
2132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard            handler = xmlFindCharEncodingHandler("ascii");
21331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
21341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
21351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    buf = xmlOutputBufferCreateFile(output, handler);
21361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    if (node->type == XML_DOCUMENT_NODE) {
2137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlSaveFormatFileTo(buf, doc, encoding, format);
21381e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (node->type == XML_HTML_DOCUMENT_NODE) {
2139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlDocContentDumpFormatOutput(buf, doc, encoding, format);
2140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
21411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
2142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        htmlNodeDumpFormatOutput(buf, doc, node, encoding, format);
2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
21441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    } else {
2145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        xmlNodeDumpOutput(buf, doc, node, 0, format, encoding);
2146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        len = xmlOutputBufferClose(buf);
21471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    }
2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (PyInt_FromLong((long) len));
21491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard}
21501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
21511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************
21521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard *									*
2153a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *			Extra stuff					*
2154a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2155a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/
2156a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject *
2157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args)
2158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2159a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    PyObject *py_retval;
2160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    xmlChar *name;
2161a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    xmlNodePtr node;
2162a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name))
2164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (NULL);
2165a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    node = (xmlNodePtr) xmlNewNode(NULL, name);
2166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    printf("NewNode: %s : %p\n", name, (void *) node);
2167a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2168a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    if (node == NULL) {
2169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        Py_INCREF(Py_None);
2170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return (Py_None);
2171a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    }
2172a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard    py_retval = libxml_xmlNodePtrWrap(node);
2173d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    return (py_retval);
2174a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard}
2175a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard
2176a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************
2177a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard *									*
2178d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *			The registration stuff				*
2179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard *									*
2180d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/
2181d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = {
218296fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c"
2183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "name", libxml_name, METH_VARARGS, NULL},
2184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "children", libxml_children, METH_VARARGS, NULL},
2185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "properties", libxml_properties, METH_VARARGS, NULL},
2186d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "last", libxml_last, METH_VARARGS, NULL},
2187d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "prev", libxml_prev, METH_VARARGS, NULL},
2188d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "next", libxml_next, METH_VARARGS, NULL},
2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "parent", libxml_parent, METH_VARARGS, NULL},
2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "type", libxml_type, METH_VARARGS, NULL},
2191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "doc", libxml_doc, METH_VARARGS, NULL},
2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL},
2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL},
2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL},
2195c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL},
2196c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL},
2197c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL},
2198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    {NULL, NULL, 0, NULL}
2199d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard};
2200d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
22010fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
22026361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void);
22030fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
22040fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard
2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid
2206d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void)
2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{
2208af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    static int initialized = 0;
22093ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard    PyObject *m;
2210af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard
2211af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    if (initialized != 0)
2212d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard        return;
2213c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlRegisterDefaultOutputCallbacks();
2214c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    xmlRegisterDefaultInputCallbacks();
2215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard    m = Py_InitModule((char *) "libxml2mod", libxmlMethods);
2216af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard    initialized = 1;
22175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard    libxml_xmlErrorInitialize();
22186361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard
22190fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES
22200fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard    initlibxsltmod();
22210fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif
2222d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}
2223