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