libxml.c revision c64b8e984c13a0d989dea436c13128b289a4d4d6
13ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/* 23ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * libxml.c: this modules implements the main part of the glue of the 33ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * libxml2 library and the Python interpreter. It provides the 43ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * entry points where an automatically generated stub is either 53ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * unpractical or would not match cleanly the Python model. 63ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * 70fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard * If compiled with MERGED_MODULES, the entry point will be used to 80fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard * initialize both the libxml2 and the libxslt wrappers 90fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard * 103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * See Copyright for the status of this software. 113ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * 123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * daniel@veillard.com 133ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard */ 14d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <Python.h> 15c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#include <fileobject.h> 16a1196ed4142269343ac98e698f195966886319e1Daniel Veillard/* #include "config.h" */ 17f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlmemory.h> 18d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/parser.h> 19d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/tree.h> 20a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpath.h> 215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#include <libxml/xmlerror.h> 22a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpathInternals.h> 234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#include <libxml/xmlmemory.h> 24c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#include <libxml/xmlIO.h> 25d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 2696fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 27d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 280d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf) 290d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) 300d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif 310d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard 32d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 33797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */ 34a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */ 355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */ 364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */ 37c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */ 38c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */ 394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 40d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void); 41d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 42c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 43c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO: 44c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 45c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks 46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO \ 48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard "Unimplemented block at %s:%d\n", \ 50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard __FILE__, __LINE__); 51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************ 534e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * Memory debug interface * 554e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/ 574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr); 594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size); 60d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size); 614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str); 624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0; 644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0; 654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0; 674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL; 684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL; 694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL; 704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL; 714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 73d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDebugMemory(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 74d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int activate; 764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *py_retval; 774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard long ret; 784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 79d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate)) 80d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY 834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_xmlDebugMemory(%d) called\n", activate); 844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (activate != 0) { 87d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebug == 0) { 88d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 89d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * First initialize the library and grab the old memory handlers 90d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * and switch the library to memory debugging 91d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 92d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemGet((xmlFreeFunc *) & freeFunc, 93d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlMallocFunc *) & mallocFunc, 94d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlReallocFunc *) & reallocFunc, 95d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrdupFunc *) & strdupFunc); 96d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) && 97d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (reallocFunc == xmlMemRealloc) && 98d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (strdupFunc == xmlMemoryStrdup)) { 99d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc, 102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemRealloc, xmlMemoryStrdup); 103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (ret < 0) 104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto error; 105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlInitParser(); 108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (libxmlMemoryDebugActivated == 0) { 110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebug = 1; 116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 1; 1174e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebugActivated == 1) 119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else 121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 0; 1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard error: 1254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard py_retval = libxml_longWrap(ret); 126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1274e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 1284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self, 131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ATTRIBUTE_UNUSED PyObject * args) 132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebug != 0) 135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemoryDump(); 1364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard Py_INCREF(Py_None); 137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 1384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 139d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 142c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Handling Python FILE I/O at the C level * 143c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * The raw I/O attack diectly the File objects, while the * 144c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * other routines address the ioWrapper instance instead * 145c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 146c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 147c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 148c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 149c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref: 150c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 151c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 152c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 153c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 154c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 155c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) { 156c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file, *ret; 157c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 158c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 159c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileCloseUnref\n"); 160c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 161c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 162c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 163118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "close", (char *) "()"); 164c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 165c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 166c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 167c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(file); 168c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 169c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 170c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 171c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 172c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw: 173c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 174c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 175c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 176c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 177c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel 178c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 179c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 180c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 181c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 182c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) { 183c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 184c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 185c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 186c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 187c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 188c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 189c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: %d\n", len); 190c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 191c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 192c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 193118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len); 194c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 195c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is NULL\n"); 196c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 197c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 198c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 199c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 200c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 201c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 202c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 203c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 204c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 205c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 206c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is not a String\n"); 207c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 208c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 209c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 210c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 211c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 212c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 213c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead: 214c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 215c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 216c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 217c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 218c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel. 219c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 220c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 221c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 222c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 223c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) { 224c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 225c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 226c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 227c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 228c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 229c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: %d\n", len); 231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 234118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len); 235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is NULL\n"); 237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is not a String\n"); 248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 249c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 251c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite: 255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel. 260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written 262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) { 265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *string; 267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int written = -1; 269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: %d\n", len); 272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard string = PyString_FromStringAndSize(buffer, len); 276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (string == NULL) return(-1); 277118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", string); 278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(string); 279c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is NULL\n"); 281c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyInt_Check(ret)) { 283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = (int) PyInt_AsLong(ret); 284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (ret == Py_None) { 286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = len; 287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is not an Int nor None\n"); 290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(written); 293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose: 297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) { 303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file, *ret; 304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileClose\n"); 307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 310118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()"); 311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile: 319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 320c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 322c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 327118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr 328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file, 329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr encoder) { 330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr ret; 331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocOutputBuffer(encoder); 335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->writecallback = xmlPythonFileWrite; 339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr buffer; 352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 353c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate", 355c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 358118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard handler = xmlFindCharEncodingHandler((const char *) encoding); 359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlOutputBufferCreatePythonFile(file, handler); 361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n"); 363c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlOutputBufferPtrWrap(buffer); 364c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 365c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 366c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 367c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 368c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 369c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile: 370c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 371c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 378118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr 379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file, 380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding encoding) { 381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr ret; 382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocParserInputBuffer(encoding); 386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->readcallback = xmlPythonFileRead; 390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 395c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 397c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; 402c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buffer; 403c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 404c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 405c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate", 406c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 407c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 408c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 409118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard enc = xmlParseCharEncoding((const char *) encoding); 410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlParserInputBufferCreatePythonFile(file, enc); 412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 413c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n"); 414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlParserInputBufferPtrWrap(buffer); 415c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Providing the resolver at the Python level * 421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 424c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL; 425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext; 426c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr 428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID, 429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserCtxtPtr ctxt) { 430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputPtr result = NULL; 431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (pythonExternalEntityLoaderObjext != NULL) { 432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ctxtobj; 434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt); 436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: ready to call\n"); 438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext, 441118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard (char *) "(ssO)", URL, ID, ctxtobj); 442e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(ctxtobj); 443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: result "); 445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject_Print(ret, stdout, 0); 446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("\n"); 447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 449c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 450118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard if (PyObject_HasAttrString(ret, (char *) "read")) { 451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buf; 452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); 454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buf != NULL) { 455c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->context = ret; 456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->readcallback = xmlPythonFileReadRaw; 457c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->closecallback = xmlPythonFileCloseRaw; 458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = xmlNewIOInputStream(ctxt, buf, 459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard XML_CHAR_ENCODING_NONE); 460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: can't read\n"); 463c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 464c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (result == NULL) { 465c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 466c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard } else if (URL != NULL) { 467c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard result->filename = xmlStrdup(URL); 468c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard result->directory = xmlParserGetDirectory((const char *) URL); 469c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 470c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 471c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 472c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((result == NULL) && (defaultExternalEntityLoader != NULL)) { 473c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = defaultExternalEntityLoader(URL, ID, ctxt); 474c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 475c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(result); 476c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 477c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 478c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 479c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 480c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 481c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *loader; 482c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 483c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader", 484c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &loader)) 485c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 486c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 487c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 488c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlSetEntityLoader\n"); 489c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 490c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (defaultExternalEntityLoader == NULL) 491c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard defaultExternalEntityLoader = xmlGetExternalEntityLoader(); 492c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 493c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard pythonExternalEntityLoaderObjext = loader; 494c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlSetExternalEntityLoader(pythonExternalEntityLoader); 495c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 496c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = PyInt_FromLong(0); 497c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 498c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 499c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 500c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 501c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 502c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 5033ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 5061971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 50733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 50833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name, 50933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar ** attrs) 51033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 51133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int i; 51233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 51333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *dict; 51433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrname; 51533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrvalue; 516d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 51733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 51833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 519797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 520797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartElement(%s) called\n", name); 521797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 52233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startElement")) 52433caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "start")) 52633caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 52733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 52833caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 52933caa0b8307eccf22010400747830b1967edb292Daniel Veillard * the xmllib interface always generate a dictionnary, 53033caa0b8307eccf22010400747830b1967edb292Daniel Veillard * possibly empty 53133caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 53233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if ((attrs == NULL) && (type == 1)) { 53333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 53433caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = Py_None; 535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (attrs == NULL) { 536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard dict = PyDict_New(); 53733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 53833caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = PyDict_New(); 53933caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (i = 0; attrs[i] != NULL; i++) { 540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrname = PyString_FromString((char *) attrs[i]); 54133caa0b8307eccf22010400747830b1967edb292Daniel Veillard i++; 54233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (attrs[i] != NULL) { 543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrvalue = PyString_FromString((char *) attrs[i]); 54433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 54533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 54633caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = Py_None; 54733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 54833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyDict_SetItem(dict, attrname, attrvalue); 54933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 55033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 55133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 55233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "startElement", 554d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 55533caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 556d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "start", 557d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 558d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 559d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 56033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(dict); 56133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 56233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 56333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 56433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 56533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 56633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data) 56733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 56833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 56933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 57033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 571797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 572797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartDocument() called\n"); 573797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 57433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 575d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startDocument")) { 576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "startDocument", NULL); 578d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 58033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 58133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 58233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 58333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 58433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 58533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data) 58633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 58733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 58833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 58933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 590797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 591797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndDocument() called\n"); 592797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 59333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endDocument")) { 595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 596d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "endDocument", NULL); 597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 60033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 60133caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 60233caa0b8307eccf22010400747830b1967edb292Daniel Veillard * The reference to the handler is released there 60333caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 60433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(handler); 60533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 60633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 60733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 60833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name) 60933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 61033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 61133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 61233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 613797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 614797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndElement(%s) called\n", name); 615797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 61633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 617d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endElement")) { 618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "endElement", 619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 62233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (PyObject_HasAttrString(handler, (char *) "end")) { 624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "end", 625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 626d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 628797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard Py_XDECREF(result); 62933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 63033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 63133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 63233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 63333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name) 63433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 63533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 63633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 63733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 638797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 639797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonReference(%s) called\n", name); 640797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 64133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "reference")) { 643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "reference", 644d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 645d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 64733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 64833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 64933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 65033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 65133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 65233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len) 65333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 65433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 65633caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 65733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 658797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 659797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCharacters(%s, %d) called\n", ch, len); 660797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 66133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "characters")) 663d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 665d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 66633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 667d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "characters", 669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 670d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 671d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "data", 672d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 673d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 674d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 67533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 67633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 67733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 67833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 67933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 68033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len) 68133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 68233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 683d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 68433caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 68533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 686797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 687797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len); 688797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 68933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace")) 69133caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 692d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 69333caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 69433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 69533caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 69633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, 698d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ignorableWhitespace", 699d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 70033caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 701d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 702d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "data", 703d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 70433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 70533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 70633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 70733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 70833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 70933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data, 71033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * target, const xmlChar * data) 71133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 71233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 71333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 71433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 715797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 716797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonProcessingInstruction(%s, %s) called\n", target, data); 717797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 71833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 719d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) { 720d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) 721d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard "processingInstruction", 722d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ss", target, data); 72333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 72433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 72533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 72633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 72733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 72833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value) 72933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 73033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 73133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 73233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 733797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 734797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonComment(%s) called\n", value); 735797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 73633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "comment")) { 738d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "comment", (char *) "s", 740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard value); 741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 742d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 74333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 74533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 74733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 74833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...) 74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 75033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 75233caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 75433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 755797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 756797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonWarning(%s) called\n", msg); 757797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "warning")) { 76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "warning", (char *) "s", 766d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 76933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 77033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 77333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 77433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...) 77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 77833caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 77933caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 78033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 781797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 782797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonError(%s) called\n", msg); 783797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 78433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "error")) { 78633caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 78733caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "error", (char *) "s", 792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 79633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 79833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 79933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 80033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...) 80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 80233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 80333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 80433caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 80533caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 80633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 807797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 808797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonFatalError(%s) called\n", msg); 809797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 81033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "fatalError")) { 81233caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 817d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "fatalError", 818d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", buf); 819d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 820d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 82133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 82233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 82333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 82533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 82633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len) 82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 82833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 83033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 832797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 833797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCdataBlock(%s, %d) called\n", ch, len); 834797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 83533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "cdataBlock")) 837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "cdata")) 839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 84033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdataBlock", 844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdata", 848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 85133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 85233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 85333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 85433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 85533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 85633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data, 85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * externalID, const xmlChar * systemID) 85933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 86033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 863797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 864797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonExternalSubset(%s, %s, %s) called\n", 865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, externalID, systemID); 866797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 86733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "externalSubset")) { 86933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "externalSubset", 871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, externalID, 872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemID); 87333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 87433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 87533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 87733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 87833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data, 87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 88233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, xmlChar * content) 88333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 88533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 88633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 88733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "entityDecl")) { 889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "entityDecl", 890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sisss", name, type, 891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard publicId, systemId, content); 892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 89433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 89533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 89633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 89733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 90033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 90133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 90233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data, 90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, const xmlChar * systemId) 90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 90633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 90733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 90933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "notationDecl")) { 911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "notationDecl", 912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, publicId, 913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemId); 914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 915d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 91733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 91933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 92033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 92133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data, 92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * elem, 92333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 92433caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard int def, 926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * defaultValue, xmlEnumerationPtr tree) 92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 92833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 92933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *nameList; 93033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *newName; 93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr node; 93233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 93333caa0b8307eccf22010400747830b1967edb292Daniel Veillard int count; 93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) { 93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 93933caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 94033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard nameList = PyList_New(count); 94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard newName = PyString_FromString((char *) node->name); 94533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyList_SetItem(nameList, count, newName); 94633caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 94733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "attributeDecl", 949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssiisO", elem, name, type, 950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard def, defaultValue, nameList); 951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 952d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(nameList); 95433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 95533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 95833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 95933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data, 96033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int type, ATTRIBUTE_UNUSED xmlElementContentPtr content) 96233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 96433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *obj; 96533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 96633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 96733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "elementDecl")) { 969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* TODO: wrap in an elementContent object */ 970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n"); 972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = Py_None; 973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */ 974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "elementDecl", 975d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "siO", name, type, obj); 976d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 977d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 97833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 97933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 98233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 98333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data, 98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 98633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, 98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * notationName) 98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 98933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 99033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 99133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 99233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) { 994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "unparsedEntityDecl", 996d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssss", name, publicId, systemId, 997d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard notationName); 998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 100033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 100133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 100433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 100533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name, 100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * ExternalID, const xmlChar * SystemID) 100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 100833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 100933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 101033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1011797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1012797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonInternalSubset(%s, %s, %s) called\n", 1013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, ExternalID, SystemID); 1014797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 101533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "internalSubset")) { 1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "internalSubset", 1018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, ExternalID, 1019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SystemID); 1020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 102233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 102333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 102533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 102633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = { 102733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonInternalSubset, 1028d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonIsStandalone, */ 1029d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasInternalSubset, */ 1030d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasExternalSubset, */ 1031d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonResolveEntity, */ 1032d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetEntity, */ 103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEntityDecl, 103433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonNotationDecl, 103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonAttributeDecl, 103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonElementDecl, 103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonUnparsedEntityDecl, 1038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* OBSOLETED pythonSetDocumentLocator, */ 103933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartDocument, 104033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndDocument, 104133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartElement, 104233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndElement, 104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonReference, 104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCharacters, 104533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonIgnorableWhitespace, 104633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonProcessingInstruction, 104733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonComment, 104833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonWarning, 104933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonError, 105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonFatalError, 1051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetParameterEntity, */ 105233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCdataBlock, 105333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonExternalSubset, 105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1 105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard}; 1056d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 10573ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 10583ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 10593ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 10603ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 10613ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 10621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 10631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 10683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 107033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 10713ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 10723ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 10733ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 10743ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk, 1077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 10791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 10808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 10813ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 1082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 10831971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 10843ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 1085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1087d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 10881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 108933caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI); 10903ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1091d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1092a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 10935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 10944e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1098d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 10994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 1100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 110133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 11024e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11034e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 11044e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 11054e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk, 1108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11104e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 11118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11124e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 1113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 11144e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 11154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 1116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 11194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 112033caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI, 1121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard XML_CHAR_ENCODING_NONE); 11224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 11244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 11254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 11268d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 11298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard int recover; 1130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 11318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 11328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX, 1135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &URI, &recover)) 1136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n", 1140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, recover); 11418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 11428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1144d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 11468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 11478d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 11488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 11498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXParseFileWithData(SAX, URI, recover, pyobj_SAX); 11508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11528d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 11538d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11548d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 1158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 11598d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 11608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI, 1164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding)) 1165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11668d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n", 1169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, encoding); 11708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 11718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1173d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 11758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 11768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 11778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 11788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX); 11798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11818d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 11828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 11845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 11855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 11865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 11875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 11885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 11895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 11905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 11915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1192e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */ 1193e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char * 1194e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap) 1195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int size; 1197d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int chars; 1198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard char *larger; 1199e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1200e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1201e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = (char *) xmlMalloc(150); 1202e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (str == NULL) 1203e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1204e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1205e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size = 150; 1206e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1207e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard while (1) { 1208e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard chars = vsnprintf(str, size, msg, ap); 1209e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if ((chars > -1) && (chars < size)) 1210e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard break; 1211e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (chars > -1) 1212e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size += chars + 1; 1213e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard else 1214e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size += 100; 1215e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 1216e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlFree(str); 1217e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1218e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1219e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = larger; 1220e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1221e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1222e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return str; 1223e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1224e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1225e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1226e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg, 1227e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ...) 1228e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_list ap; 1230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard char *str; 12315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 12325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 12335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 12345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 12365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 12375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 12385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 1241d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_start(ap, msg); 1242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard vfprintf(stdout, msg, ap); 1243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(ap); 12445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 1245e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1246e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = libxml_buildMessage(msg,ap); 1247e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard list = PyTuple_New(2); 1250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 1251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard message = libxml_charPtrWrap(str); 1253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 1, message); 1254d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 1255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(list); 1256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(result); 12575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 12585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 12595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void) 1262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 12635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 12645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 12655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 12665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 12675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 12685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject * 1270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self, 1271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 12735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 12745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 12755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 12765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1277d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f, 1279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &pyobj_ctx)) 1280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 12815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 1283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, 1284d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_f); 12855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 12865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 1288d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 12895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 12905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 1291d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 12925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 12935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 12955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 12965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 12985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 12995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 13005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 1302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 13035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1305e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1306e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************ 1307e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1308e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * Per parserCtxt error handler * 1309e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1310e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/ 1311e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1312417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct 1313417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1314417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *f; 1315417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *arg; 1316417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt; 1317417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr; 1318417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1319417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1320417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) 1321e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1322e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *list; 1323e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *result; 1324417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1325e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1326e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1327e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR 1328417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 1329e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif 1330e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1331417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr)ctx; 1332417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1333e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1334417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 1335417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 1336417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1337417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrWrap(str)); 1338417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1339417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, Py_None); 1340417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1341417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 1342417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (result == NULL) 1343417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard { 1344417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 1345417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyErr_Print(); 1346e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1347417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(list); 1348417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(result); 1349417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1350417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1351417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1352417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...) 1353417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1354417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1355417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1356417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1357417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap)); 1358417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1359417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1360417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1361417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1362417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...) 1363417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1364417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1365417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1366417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1367417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap)); 1368417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1369417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1370417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1371417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1372417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...) 1373417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1374417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1375417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1376417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1377417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); 1378417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1379417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1380417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1381417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1382417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...) 1383417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1384417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1385417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1386417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1387417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); 1388417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1389e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1390e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1391e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel VeillardPyObject * 1392417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1393e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1394e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *py_retval; 1395e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1396e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1397e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1398e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_f; 1399e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_arg; 1400e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1401417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler", 1402e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard &pyobj_ctxt, &pyobj_f, &pyobj_arg)) 1403e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1404e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1405e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (ctxt->_private == NULL) { 1406e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); 1407e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt == NULL) { 1408e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(-1); 1409e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1410e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1411e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); 1412e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->_private = pyCtxt; 1413e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1414e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard else { 1415417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1416e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1417e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard /* TODO: check f is a function ! */ 1418417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1419e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_f); 1420417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->f = pyobj_f; 1421417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1422e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_arg); 1423417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->arg = pyobj_arg; 1424e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1425417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyobj_f != Py_None) { 1426417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; 1427417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; 1428417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler; 1429417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler; 1430417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1431417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1432417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = xmlParserError; 1433417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = xmlParserValidityError; 1434417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = xmlParserWarning; 1435417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = xmlParserValidityWarning; 1436417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1437e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1438e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(1); 1439e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1440e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1441e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1442417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPyObject * 1443417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1445417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *py_retval; 1446417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1447e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1448417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *pyobj_ctxt; 1449e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1450417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler", 1451417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard &pyobj_ctxt)) 1452417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(NULL); 1453417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1454417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard py_retval = PyTuple_New(2); 1455417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt->_private != NULL) { 1456417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1458417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 1459417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->f); 1460417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 1461417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1462417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1463417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1464417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* no python error handler registered */ 1465417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 1466417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1467417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 1468417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1469e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1470417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(py_retval); 1471e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1472e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1473e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel VeillardPyObject * 1474417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 1475e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1476e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1477417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1478e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1479417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt)) 1480e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1481e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1482417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1483417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt != NULL) { 1484417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1485417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyCtxt) { 1486417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1487417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1488417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFree(pyCtxt); 1489e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1490417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFreeParserCtxt(ctxt); 1491e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1492e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1493417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1494417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(Py_None); 1495e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1496e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1497a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 1498a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 149926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * Per xmlTextReader error handler * 150026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 150126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/ 150226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 150326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct 150426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 150526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *f; 150626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *arg; 150726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt; 150826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr; 150926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 151026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void 151126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg, 151226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard const char *msg, 1513417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard int severity, 1514417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlTextReaderLocatorPtr locator) 151526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 151626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg; 151726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *list; 151826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *result; 151926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1520417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 152126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 152226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 152326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg)); 1524417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1525417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator)); 152626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 152726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (result == NULL) 152826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 1529417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 153026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyErr_Print(); 153126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 153226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(list); 153326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(result); 153426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 153526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 153626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel VeillardPyObject * 153726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 153826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 153926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 154026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 154126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 154226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 154326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 154426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_f; 154526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_arg; 154626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 154726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 154826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg)) 154926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 155026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 155126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* clear previous error handler */ 155226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 155326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 155426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (f == libxml_xmlTextReaderErrorCallback) { 155526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 155626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 155726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 155826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 155926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 156026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 156126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else { 156226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 156326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there already an arg, and it's not ours, 156426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there is definitely something wrong going on here... 156526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * we don't know how to free it, so we bail out... 156626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 156726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 156826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 156926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 157026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 157126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderSetErrorHandler(reader,NULL,NULL); 157226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* set new error handler */ 157326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyobj_f != Py_None) 157426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 157526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt)); 157626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyCtxt == NULL) { 157726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 157826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 157926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 158026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_f); 158126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->f = pyobj_f; 158226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_arg); 158326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->arg = pyobj_arg; 158426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderSetErrorHandler(reader,libxml_xmlTextReaderErrorCallback,pyCtxt); 158526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 158626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 158726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(1); 158826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 158926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 159026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 159126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel VeillardPyObject * 159226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 159326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 159426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 159526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 159626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 159726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 159826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 159926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 160026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 160126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader)) 160226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 160326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 160426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 160526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = PyTuple_New(2); 160626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (f == libxml_xmlTextReaderErrorCallback) { 160726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 160826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 160926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 161026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->f); 161126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 161226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 161326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 161426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else 161526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 161626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* f is null or it's not our error handler */ 161726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 161826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 161926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 162026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 162126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 162226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 162326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 162426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 162526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel VeillardPyObject * 162626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 162726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 162826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 162926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 163026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 163126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 163226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 163326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) 163426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 163526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 163626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 163726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 163826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 163926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (f == libxml_xmlTextReaderErrorCallback) { 164026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 164126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 164226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 164326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 164426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 164526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 164626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 164726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * else, something wrong happened, because the error handler is 164826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * not owned by the python bindings... 164926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 165026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 165126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 165226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFreeTextReader(reader); 165326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_INCREF(Py_None); 165426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(Py_None); 165526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 165626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 165726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************ 165826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 1659a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 1660a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 1661a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 1662a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1663a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0; 1664a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1665a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback { 1666a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 1667a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 1668a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 1669a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *function; 1670a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr; 1671a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10]; 1672a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0; 1673a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10; 1674a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1675a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 1676d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) 1677d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1678a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 1679a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 168070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard xmlXPathContextPtr rctxt; 168170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard PyObject *current_function = NULL; 168270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *name; 168370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *ns_uri; 1684a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1685a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 168670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (ctxt == NULL) 1687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 168870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard rctxt = ctxt->context; 168970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (rctxt == NULL) 1690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 169170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard name = rctxt->function; 169270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard ns_uri = rctxt->functionURI; 1693a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, 1695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ns_uri); 1696a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1697a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 169870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 169970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * Find the function, it should be there it was there at lookup 170070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 1701d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1702d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ( /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */ 1703d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1704d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1705d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard current_function = libxml_xpathCallbacks[i].function; 1706d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 170770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 170870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (current_function == NULL) { 1709d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 1710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("libxml_xmlXPathFuncCallback: internal error %s not found !\n", 1711d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name); 1712d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 171370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 171470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard 1715c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard list = PyTuple_New(nargs + 1); 1716c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt)); 1717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < nargs; i++) { 1718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = valuePop(ctxt); 1719d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 1720d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, i + 1, cur); 1721a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1722a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 1723a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 1724a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1725a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 1726a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 1727a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1728a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1729a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 1730d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name, 1731d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * ns_uri) 1732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1733a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1735a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1736a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 1737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctxt, name, ns_uri); 1738a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 173970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 174070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * This is called once only. The address is then stored in the 174170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * XPath expression evaluation, the proper object to call can 174270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * then still be found using the execution context function 174370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * and functionURI fields. 174470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 1745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((ctxt == libxml_xpathCallbacks[i].ctx) && 1747d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1748d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1749d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (libxml_xmlXPathFuncCallback); 1750d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1751a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1753a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1754a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1755a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 1756d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void) 1757d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1758a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1759a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1760a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 1761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 1762a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1763a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1764a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 1765a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1766a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < 10; i++) { 1768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].ctx = NULL; 1769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].name = NULL; 1770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].ns_uri = NULL; 1771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = NULL; 1772a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1773a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 1774a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1775a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1776a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 1777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self, 1778d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1780a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 1781a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 1782a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 1783a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 1784a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 1785a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 1786a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 1787a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1788a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name, 1791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &ns_uri, &pyobj_f)) 1792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1793a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1794a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 1795a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 1796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacksInitialize(); 1797a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 1798a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1799a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 1800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_intWrap(-1); 1801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1802a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1803a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1804a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 1805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctx, name, ns_uri); 1806a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((ctx == libxml_xpathCallbacks[i].ctx) && 1809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 1812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xpathCallbacks[i].function); 1813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 1814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 1815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto done; 1816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1817a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1818a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) { 1819d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_registerXPathFunction() table full\n"); 1820a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } else { 1821d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard i = libxml_xpathCallbacksNb++; 1822d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 1823a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = ctx; 1824a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = xmlStrdup(name); 1825a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri); 1826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 1827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 1828a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard done: 1830a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 1831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1832a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1833a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 18341971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 18351971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 1836d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 1837d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 1838d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 1839d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1841d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1842d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1843d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1844d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 1845d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:name", &obj)) 1847d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1848d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1849d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1850d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1851d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 1852d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1853d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1856d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1858d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE:{ 1860d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 1861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = doc->URL; 1863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->name; 1869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 1872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 1873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = ns->prefix; 1875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->name; 1879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1880d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 18811971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 1882d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1883d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1884d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1885d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1886d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1888d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1889d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1890d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1891d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 1892d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj)) 1894d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1895d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1896d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1897d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1898d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 1899d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1900d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1902d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1903d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1905d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1906d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1907d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1908d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1909d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->doc; 1913d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1915d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 1916d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->doc; 1920d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1921d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1922d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 1923d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1924d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1926d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1927d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1928d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1929d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1930d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 1931d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 1932d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj)) 1934d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1935d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1936d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 1937d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->properties; 1938d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 1939d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1940d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 1941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1944d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1950d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:next", &obj)) 1952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 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 res = NULL; 1966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) attr->next; 1971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 1974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 1975d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1976d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) ns->next; 1977d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1978d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1979d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1980d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->next; 1981d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1982d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1983d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1984d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1986d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1990d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1992d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj)) 1996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1998d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2000d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 2001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2002d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2003d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2004d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2005d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2006d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2007d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2008d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2009d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2010d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2011d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2014faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = (xmlNodePtr) attr->prev; 2015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2020faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = cur->prev; 2021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2022d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2023d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2024d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2025d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2026d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2027d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2028d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2029d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2030d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2032d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2033d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2034d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:children", &obj)) 2035d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2036d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2038d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2039d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 2040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2041d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2043d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2051d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2052d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2053d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2054d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->children; 2055d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2057d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2058d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2059d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->children; 2060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2065d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2067d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2069d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2070d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2072d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2073d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2074d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2075d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2076d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2078d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2079d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2080d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2081d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2082d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 2083d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2084d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2087d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2089d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2090d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2091d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2092d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2094d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->last; 2098d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->last; 2103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2108d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2109d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2114d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2117d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2118d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj)) 2120d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2121d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2123d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2124d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 2125d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2126d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->parent; 2139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_DECL: 2141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_START: 2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_END: 2144d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->parent; 2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2149d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2150d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2151d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2152d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2153d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2156d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2157d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2158d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar *res = NULL; 2160d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2162d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2163d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2164d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2165d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2166d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 2167d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2168d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2170d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 2171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "element"; 2172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2173d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 2174d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute"; 2175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2176d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 2177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "text"; 2178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 2180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "cdata"; 2181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2182d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 2183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_ref"; 2184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2185d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 2186d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity"; 2187d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2188d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "pi"; 2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2191d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "comment"; 2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2194d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 2195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_xml"; 2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2197d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 2198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "doctype"; 2199d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2200d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 2201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "fragment"; 2202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2203d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "notation"; 2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2206d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_html"; 2208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2209d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 2210d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "dtd"; 2211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 2213d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "elem_decl"; 2214d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2215d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 2216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute_decl"; 2217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2218d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 2219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_decl"; 2220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2221d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 2222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "namespace"; 2223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2224d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 2225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_start"; 2226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 2228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_end"; 2229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2231d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_docbook"; 2233d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2236d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 2238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 22401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 224636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * Specific accessor functions * 224736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 224836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/ 224936eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 225236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 225336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 225436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 225536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 225636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node)) 2259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 226036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 226136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 226236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 226536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 226636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->nsDef; 226736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 226936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 227036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 227136eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 227436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 227536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 227636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 227736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 227836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node)) 2280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 228136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 228236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 228336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2284d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2285d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 228636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 228736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->ns; 228836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 229036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 229136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 229236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************ 229336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 22941e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * Serialization front-end * 22951e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 22961e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/ 22971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2299d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 23011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_retval = NULL; 23021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlChar *c_retval; 23031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 23041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 23051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 23071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 23081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 23091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node, 2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding, &format)) 2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 23131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 23141e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 23151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 23181e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23191e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2320d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len, 2322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (const char *) encoding, format); 2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 23241e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2325d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2326d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2329d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2331d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2332d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2334d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2339d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2342d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2347d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2349d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2351d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2352d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2357d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2359d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2361d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 23671e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 2369a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) { 2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2382d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2386d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2388d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2389d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2390d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2393d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2394d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2395d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2397d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2398d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2401d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2403d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2410d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2416d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2418d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2419d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2420d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2421d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2423d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2424d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2425d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2426d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2427d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2428d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2429d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2430d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2431d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2432d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2433d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2434d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2435d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2436d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2437d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2439d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2443d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 24441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2445d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 24461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 24471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 24511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_file = NULL; 24521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard FILE *output; 24531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 24541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 24551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 24571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 24581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 24591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlOutputBufferPtr buf; 24601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 24611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2462d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node, 2463d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &py_file, &encoding, &format)) 2464d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 24651e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 24661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 24671e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2468d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 24691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24701e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 2471d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 24721e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard output = PyFile_AsFile(py_file); 24741e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (output == NULL) { 2475d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 24761e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 24781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 24801e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 24821e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 24841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding == NULL) 2487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 24881e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24891e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (encoding != NULL) { 2490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 24941e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 24951e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 25001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 25011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 25021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard buf = xmlOutputBufferCreateFile(output, handler); 25031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlSaveFormatFileTo(buf, doc, encoding, format); 25051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 25081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 25111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 25141e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) len)); 25161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 25171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 25181e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************ 25191e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 2520a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * Extra stuff * 2521a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2522a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/ 2523a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject * 2524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2526a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard PyObject *py_retval; 2527d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlChar *name; 2528a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard xmlNodePtr node; 2529a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2530d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name)) 2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2532a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard node = (xmlNodePtr) xmlNewNode(NULL, name); 25333b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG 2534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("NewNode: %s : %p\n", name, (void *) node); 25353b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif 2536a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2537a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard if (node == NULL) { 2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2540a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard } 2541a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard py_retval = libxml_xmlNodePtrWrap(node); 2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2543a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard} 2544a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2545a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************ 2546a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 2548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 2549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 2550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 255196fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 2552d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "name", libxml_name, METH_VARARGS, NULL}, 2553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "children", libxml_children, METH_VARARGS, NULL}, 2554d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "properties", libxml_properties, METH_VARARGS, NULL}, 2555d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "last", libxml_last, METH_VARARGS, NULL}, 2556d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "prev", libxml_prev, METH_VARARGS, NULL}, 2557d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "next", libxml_next, METH_VARARGS, NULL}, 2558d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "parent", libxml_parent, METH_VARARGS, NULL}, 2559d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "type", libxml_type, METH_VARARGS, NULL}, 2560d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "doc", libxml_doc, METH_VARARGS, NULL}, 2561d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL}, 2562d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL}, 2563d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL}, 2564c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL}, 2565c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL}, 2566c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL}, 25673e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL }, 2568417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL }, 2569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL }, 2570e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL }, 257126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL }, 257226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL }, 257326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL }, 2574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {NULL, NULL, 0, NULL} 2575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 2576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 25770fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 25786361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void); 25790fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 25800fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard 2581d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid 2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void) 2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2584af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard static int initialized = 0; 25853ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *m; 2586af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard 2587af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard if (initialized != 0) 2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 2589c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlRegisterDefaultOutputCallbacks(); 2590c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlRegisterDefaultInputCallbacks(); 2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard m = Py_InitModule((char *) "libxml2mod", libxmlMethods); 2592af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard initialized = 1; 25935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 25946361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard 25950fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 25960fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard initlibxsltmod(); 25970fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 2598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2599