libxml.c revision e4a07e7b77b191d61291d44dffa19b65387e04e4
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); 466c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 467c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 468c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 469c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((result == NULL) && (defaultExternalEntityLoader != NULL)) { 470c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = defaultExternalEntityLoader(URL, ID, ctxt); 471c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 472c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(result); 473c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 474c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 475c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 476c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 477c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 478c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *loader; 479c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 480c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader", 481c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &loader)) 482c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 483c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 484c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 485c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlSetEntityLoader\n"); 486c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 487c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (defaultExternalEntityLoader == NULL) 488c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard defaultExternalEntityLoader = xmlGetExternalEntityLoader(); 489c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 490c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard pythonExternalEntityLoaderObjext = loader; 491c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlSetExternalEntityLoader(pythonExternalEntityLoader); 492c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 493c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = PyInt_FromLong(0); 494c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 495c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 496c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 497c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 498c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 499c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 5003ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 5031971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 50433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 50533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name, 50633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar ** attrs) 50733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 50833caa0b8307eccf22010400747830b1967edb292Daniel Veillard int i; 50933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 51033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *dict; 51133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrname; 51233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrvalue; 513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 51433caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 51533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 516797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 517797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartElement(%s) called\n", name); 518797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 51933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 520d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startElement")) 52133caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 522d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "start")) 52333caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 52433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 52533caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 52633caa0b8307eccf22010400747830b1967edb292Daniel Veillard * the xmllib interface always generate a dictionnary, 52733caa0b8307eccf22010400747830b1967edb292Daniel Veillard * possibly empty 52833caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 52933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if ((attrs == NULL) && (type == 1)) { 53033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 53133caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = Py_None; 532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (attrs == NULL) { 533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard dict = PyDict_New(); 53433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 53533caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = PyDict_New(); 53633caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (i = 0; attrs[i] != NULL; i++) { 537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrname = PyString_FromString((char *) attrs[i]); 53833caa0b8307eccf22010400747830b1967edb292Daniel Veillard i++; 53933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (attrs[i] != NULL) { 540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrvalue = PyString_FromString((char *) attrs[i]); 54133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 54233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 54333caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = Py_None; 54433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 54533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyDict_SetItem(dict, attrname, attrvalue); 54633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 54733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 54833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 54933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "startElement", 551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 55233caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "start", 554d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 555d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 556d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 55733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(dict); 55833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 55933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 56033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 56133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 56233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 56333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data) 56433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 56533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 56633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 56733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 568797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 569797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartDocument() called\n"); 570797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 57133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 572d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startDocument")) { 573d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "startDocument", NULL); 575d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 57733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 57833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 57933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 58033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 58133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 58233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data) 58333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 58433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 58533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 58633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 587797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 588797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndDocument() called\n"); 589797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 59033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endDocument")) { 592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 593d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "endDocument", NULL); 594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 59633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 59733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 59833caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard * The reference to the handler is released there 60033caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 60133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(handler); 60233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 60333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 60433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 60533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name) 60633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 60733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 60833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 60933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 610797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 611797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndElement(%s) called\n", name); 612797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 61333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 614d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endElement")) { 615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "endElement", 616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 617d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 61933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (PyObject_HasAttrString(handler, (char *) "end")) { 621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "end", 622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 625797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard Py_XDECREF(result); 62633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 62733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 62833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 62933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 63033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name) 63133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 63233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 63333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 63433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 635797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 636797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonReference(%s) called\n", name); 637797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 63833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 639d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "reference")) { 640d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "reference", 641d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 64433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 64533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 64633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 64733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 64833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 64933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len) 65033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 65133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 652d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 65333caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 65433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 655797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 656797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCharacters(%s, %d) called\n", ch, len); 657797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 65833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 659d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "characters")) 660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 661d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 66333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 665d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "characters", 666d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 667d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "data", 669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 670d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 671d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 67233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 67333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 67433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 67533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 67633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 67733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len) 67833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 67933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 680d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 68133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 68233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 683797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 684797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len); 685797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 68633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace")) 68833caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 689d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 69033caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 69133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 69233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 69333caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, 695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ignorableWhitespace", 696d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 69733caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 698d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 699d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "data", 700d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 70133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 70233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 70333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 70433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 70533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 70633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data, 70733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * target, const xmlChar * data) 70833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 70933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 71033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 71133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 712797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 713797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonProcessingInstruction(%s, %s) called\n", target, data); 714797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 71533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 716d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) { 717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) 718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard "processingInstruction", 719d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ss", target, data); 72033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 72133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 72233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 72333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 72433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 72533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value) 72633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 72733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 72833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 72933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 730797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 731797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonComment(%s) called\n", value); 732797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 73333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "comment")) { 735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "comment", (char *) "s", 737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard value); 738d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 74333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 74433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 74533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...) 74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 74833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 75033caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 752797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 753797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonWarning(%s) called\n", msg); 754797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 756d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "warning")) { 75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 761d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "warning", (char *) "s", 763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 76933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 77033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 77133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...) 77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 778797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 779797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonError(%s) called\n", msg); 780797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 78133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "error")) { 78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 78433caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "error", (char *) "s", 789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 79233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 79333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 79633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 79733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...) 79833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 79933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 80033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 80233caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 80333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 804797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 805797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonFatalError(%s) called\n", msg); 806797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 80733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "fatalError")) { 80933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 81033caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "fatalError", 815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", buf); 816d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 817d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 81833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 81933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 82133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 82233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 82333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len) 82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 82533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 82833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 829797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 830797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCdataBlock(%s, %d) called\n", ch, len); 831797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 833d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "cdataBlock")) 834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "cdata")) 836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 83733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdataBlock", 841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdata", 845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 84833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 84933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 85033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 85133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 85233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 85333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data, 85433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 85533caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * externalID, const xmlChar * systemID) 85633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 85933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 860797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 861797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonExternalSubset(%s, %s, %s) called\n", 862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, externalID, systemID); 863797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 86433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "externalSubset")) { 86633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "externalSubset", 868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, externalID, 869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemID); 87033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 87133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 87233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 87333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 87433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 87533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data, 87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 87833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, xmlChar * content) 88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 88233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 88333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "entityDecl")) { 886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "entityDecl", 887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sisss", name, type, 888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard publicId, systemId, content); 889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 89133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 89233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 89333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 89433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 89833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 89933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data, 90033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 90133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, const xmlChar * systemId) 90233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 90633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 907d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "notationDecl")) { 908d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "notationDecl", 909d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, publicId, 910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemId); 911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 91333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 91433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 91533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 91733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 91833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data, 91933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * elem, 92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 92133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard int def, 923d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * defaultValue, xmlEnumerationPtr tree) 92433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 92633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *nameList; 92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *newName; 92833caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr node; 92933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 93033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int count; 93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 93233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) { 93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 93633caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard nameList = PyList_New(count); 93933caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 94033caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 941d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard newName = PyString_FromString((char *) node->name); 94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyList_SetItem(nameList, count, newName); 94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 94433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 945d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "attributeDecl", 946d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssiisO", elem, name, type, 947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard def, defaultValue, nameList); 948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 95033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(nameList); 95133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 95433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 95533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 95633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data, 95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 958d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int type, ATTRIBUTE_UNUSED xmlElementContentPtr content) 95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 96033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 96133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *obj; 96233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 96433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "elementDecl")) { 966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* TODO: wrap in an elementContent object */ 967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n"); 969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = Py_None; 970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */ 971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "elementDecl", 972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "siO", name, type, obj); 973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 97833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 97933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 98033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data, 98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 98233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 98333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, 98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * notationName) 98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 98633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 98933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) { 991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "unparsedEntityDecl", 993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssss", name, publicId, systemId, 994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard notationName); 995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 996d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 99733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 100033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 100133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 100233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name, 100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * ExternalID, const xmlChar * SystemID) 100433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 100533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1008797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1009797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonInternalSubset(%s, %s, %s) called\n", 1010d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, ExternalID, SystemID); 1011797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 101233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1013d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "internalSubset")) { 1014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "internalSubset", 1015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, ExternalID, 1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SystemID); 1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 101933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 102033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 102133caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 102233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 102333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = { 102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonInternalSubset, 1025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonIsStandalone, */ 1026d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasInternalSubset, */ 1027d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasExternalSubset, */ 1028d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonResolveEntity, */ 1029d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetEntity, */ 103033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEntityDecl, 103133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonNotationDecl, 103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonAttributeDecl, 103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonElementDecl, 103433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonUnparsedEntityDecl, 1035d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* OBSOLETED pythonSetDocumentLocator, */ 103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartDocument, 103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndDocument, 103833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartElement, 103933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndElement, 104033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonReference, 104133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCharacters, 104233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonIgnorableWhitespace, 104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonProcessingInstruction, 104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonComment, 104533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonWarning, 104633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonError, 104733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonFatalError, 1048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetParameterEntity, */ 104933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCdataBlock, 105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonExternalSubset, 105133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1 105233caa0b8307eccf22010400747830b1967edb292Daniel Veillard}; 1053d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 10543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 10553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 10563ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 10573ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 10583ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 10591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 10601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1061d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 10653ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 106733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 10683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 10693ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 10703ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 10713ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk, 1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 10761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 10778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 10783ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 1079d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 10801971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 10813ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 1082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1083d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1084d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 10851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 108633caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI); 10873ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1089a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 10905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 10914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1094d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 10964e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 1097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 109833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 10994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11004e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 11014e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 11024e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk, 1105d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1106d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11074e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 11088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11094e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 1110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 11114e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 11124e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 1113d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 11164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 111733caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI, 1118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard XML_CHAR_ENCODING_NONE); 11194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 11214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 11224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 11238d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 11268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard int recover; 1127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 11288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 11298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11308d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX, 1132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &URI, &recover)) 1133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11368d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n", 1137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, recover); 11388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 11398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 11438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 11448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 11458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 11468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXParseFileWithData(SAX, URI, recover, pyobj_SAX); 11478d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 11508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11518d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 1155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 11568d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 11578d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 11588d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI, 1161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding)) 1162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 11638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 11648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 11658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n", 1166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, encoding); 11678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 11688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 11728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 11738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 11748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 11758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX); 11768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 11788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 11798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1180e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel VeillardPyObject * 1181e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 1182e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1183e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1184e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1185e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1186e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt)) 1187e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1188e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1189e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1190e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (ctxt != NULL) { 1191e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1192e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt) { 1193e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(pyCtxt->errorFunc); 1194e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(pyCtxt->errorFuncArg); 1195e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(pyCtxt->warningFunc); 1196e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(pyCtxt->warningFuncArg); 1197e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlFree(pyCtxt); 1198e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1199e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlFreeParserCtxt(ctxt); 1200e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1201e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1202e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_INCREF(Py_None); 1203e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(Py_None); 1204e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1205e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 12065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 12075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 12085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 12095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 12105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 12115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 12135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 12145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1215e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */ 1216e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char * 1217e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap) 1218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int size; 1220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int chars; 1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard char *larger; 1222e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1223e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1224e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = (char *) xmlMalloc(150); 1225e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (str == NULL) 1226e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1227e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1228e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size = 150; 1229e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1230e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard while (1) { 1231e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard chars = vsnprintf(str, size, msg, ap); 1232e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if ((chars > -1) && (chars < size)) 1233e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard break; 1234e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (chars > -1) 1235e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size += chars + 1; 1236e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard else 1237e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard size += 100; 1238e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 1239e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlFree(str); 1240e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1241e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1242e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = larger; 1243e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1244e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1245e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return str; 1246e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1247e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1248e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1249e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg, 1250e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ...) 1251e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_list ap; 1253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard char *str; 12545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 12555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 12565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 12575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 12595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 12605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 12615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 1264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_start(ap, msg); 1265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard vfprintf(stdout, msg, ap); 1266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(ap); 12675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 1268e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1269e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = libxml_buildMessage(msg,ap); 1270e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard list = PyTuple_New(2); 1273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 1274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 1275d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard message = libxml_charPtrWrap(str); 1276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 1, message); 1277d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 1278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(list); 1279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(result); 12805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 12815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 12825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1284d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void) 1285d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 12865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 12875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 12885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 12895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 12905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 12915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 12925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject * 1293d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self, 1294d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1295d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 12965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 12975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 12985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 12995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1301d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f, 1302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &pyobj_ctx)) 1303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 1306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, 1307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_f); 13085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 13095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 1311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 13125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 13135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 1314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 13155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 13165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 13185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 13195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 13215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 13225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 13235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 1325d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 13265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1328e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1329e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************ 1330e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1331e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * Per parserCtxt error handler * 1332e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1333e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/ 1334e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1335e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1336e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctxt, const char *msg, ...) 1337e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1338e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1339e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_list ap; 1340e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *list; 1341e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *message; 1342e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *result; 1343e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1344e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1345e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR 1346e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard printf("libxml_xmlParserCtxtErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 1347e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif 1348e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1349e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1350e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1351e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt->errorFunc == NULL) { 1352e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1353e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard vfprintf(stdout, msg, ap); 1354e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1355e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } else { 1356e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1357e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = libxml_buildMessage(msg,ap); 1358e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1359e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1360e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard list = PyTuple_New(2); 1361e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyTuple_SetItem(list, 0, pyCtxt->errorFuncArg); 1362e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyCtxt->errorFuncArg); 1363e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard message = libxml_charPtrWrap(str); 1364e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyTuple_SetItem(list, 1, message); 1365e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard result = PyEval_CallObject(pyCtxt->errorFunc, list); 1366e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(list); 1367e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(result); 1368e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1369e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1370e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1371e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel VeillardPyObject * 1372e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlSetParserCtxtErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1373e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1374e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *py_retval; 1375e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1376e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1377e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1378e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_f; 1379e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_arg; 1380e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1381e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlSetParserCtxtErrorHandler", 1382e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard &pyobj_ctxt, &pyobj_f, &pyobj_arg)) 1383e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1384e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1385e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (ctxt->_private == NULL) { 1386e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); 1387e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt == NULL) { 1388e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(-1); 1389e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1390e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1391e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); 1392e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->_private = pyCtxt; 1393e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1394e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard else { 1395e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt = ctxt->_private; 1396e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1397e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard /* TODO: check f is a function ! */ 1398e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(pyCtxt->errorFunc); 1399e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_f); 1400e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt->errorFunc = pyobj_f; 1401e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(pyCtxt->errorFuncArg); 1402e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_arg); 1403e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt->errorFuncArg = pyobj_arg; 1404e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1405e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; 1406e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->vctxt.error = libxml_xmlParserCtxtErrorFuncHandler; 1407e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1408e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(1); 1409e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1410e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1411e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1412e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1413e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctxt, const char *msg, ...) 1414e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1415e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1416e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_list ap; 1417e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *list; 1418e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *message; 1419e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *result; 1420e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1421e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1422e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR 1423e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard printf("libxml_xmlParserCtxtWarningFuncHandler(%p, %s, ...) called\n", ctx, msg); 1424e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif 1425e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1426e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1427e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1428e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt->warningFunc == NULL) { 1429e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1430e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard vfprintf(stdout, msg, ap); 1431e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1432e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } else { 1433e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1434e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard str = libxml_buildMessage(msg,ap); 1435e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1436e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1437e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard list = PyTuple_New(2); 1438e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyTuple_SetItem(list, 0, pyCtxt->warningFuncArg); 1439e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyCtxt->warningFuncArg); 1440e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard message = libxml_charPtrWrap(str); 1441e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyTuple_SetItem(list, 1, message); 1442e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard result = PyEval_CallObject(pyCtxt->warningFunc, list); 1443e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(list); 1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XDECREF(result); 1445e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1446e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1447e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel VeillardPyObject * 1449e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlSetParserCtxtWarningHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1450e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1451e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *py_retval; 1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1453e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1454e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1455e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_f; 1456e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_arg; 1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1458e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlSetParserCtxtWarningHandler", &pyobj_ctxt, &pyobj_f, &pyobj_arg)) 1459e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1460e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1461e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard if (ctxt->_private == NULL) { 1462e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); 1463e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard if (pyCtxt == NULL) { 1464e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard py_retval = libxml_intWrap(-1); 1465e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard return(py_retval); 1466e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1467e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); 1468e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard ctxt->_private = pyCtxt; 1469e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1470e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard else { 1471e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt = ctxt->_private; 1472e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1473e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard /* TODO: check f is a function ! */ 1474e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(pyCtxt->warningFunc); 1475e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_f); 1476e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt->warningFunc = pyobj_f; 1477e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(pyCtxt->warningFuncArg); 1478e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_arg); 1479e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard pyCtxt->warningFuncArg = pyobj_arg; 1480e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1481e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; 1482e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->vctxt.warning = libxml_xmlParserCtxtWarningFuncHandler; 1483e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1484e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(1); 1485e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1486e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1487e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1488a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 1489a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 1490a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 1491a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 1492a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 1493a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1494a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0; 1495a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1496a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback { 1497a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 1498a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 1499a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 1500a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *function; 1501a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr; 1502a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10]; 1503a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0; 1504a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10; 1505a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1506a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 1507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) 1508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1509a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 1510a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 151170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard xmlXPathContextPtr rctxt; 151270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard PyObject *current_function = NULL; 151370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *name; 151470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *ns_uri; 1515a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1516a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 151770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (ctxt == NULL) 1518d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 151970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard rctxt = ctxt->context; 152070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (rctxt == NULL) 1521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 152270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard name = rctxt->function; 152370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard ns_uri = rctxt->functionURI; 1524a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, 1526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ns_uri); 1527a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1528a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 152970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 153070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * Find the function, it should be there it was there at lookup 153170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 1532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ( /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */ 1534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard current_function = libxml_xpathCallbacks[i].function; 1537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 153870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 153970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (current_function == NULL) { 1540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 1541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("libxml_xmlXPathFuncCallback: internal error %s not found !\n", 1542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name); 1543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 154470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 154570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard 1546c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard list = PyTuple_New(nargs + 1); 1547c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt)); 1548d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < nargs; i++) { 1549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = valuePop(ctxt); 1550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 1551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, i + 1, cur); 1552a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1553a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 1554a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 1555a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1556a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 1557a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 1558a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1559a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1560a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 1561d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name, 1562d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * ns_uri) 1563d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1564a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1565d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1566a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1567a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 1568d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctxt, name, ns_uri); 1569a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 157070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 157170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * This is called once only. The address is then stored in the 157270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * XPath expression evaluation, the proper object to call can 157370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * then still be found using the execution context function 157470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * and functionURI fields. 157570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 1576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((ctxt == libxml_xpathCallbacks[i].ctx) && 1578d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1580d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (libxml_xmlXPathFuncCallback); 1581d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1582a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1584a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1585a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1586a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 1587d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void) 1588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1589a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1590a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1591a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 1592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 1593a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1594a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1595a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 1596a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1597a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < 10; i++) { 1599d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].ctx = NULL; 1600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].name = NULL; 1601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].ns_uri = NULL; 1602d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = NULL; 1603a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1604a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 1605a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1606a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1607a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 1608d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self, 1609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1611a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 1612a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 1613a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 1614a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 1615a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 1616a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 1617a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 1618a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 1619a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1620d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name, 1622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &ns_uri, &pyobj_f)) 1623d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1624a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1625a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 1626a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 1627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacksInitialize(); 1628a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 1629a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 1630a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 1631d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_intWrap(-1); 1632d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1633a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1634a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 1635a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 1636d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctx, name, ns_uri); 1637a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 1638d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 1639d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((ctx == libxml_xpathCallbacks[i].ctx) && 1640d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 1641d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 1642d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 1643d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xpathCallbacks[i].function); 1644d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 1645d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 1646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto done; 1647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1648a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1649a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) { 1650d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_registerXPathFunction() table full\n"); 1651a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } else { 1652d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard i = libxml_xpathCallbacksNb++; 1653d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 1654a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = ctx; 1655a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = xmlStrdup(name); 1656a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri); 1657d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 1658d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 1659a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 1660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard done: 1661a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 1662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1663a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1664a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 16651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 16661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 1667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 1668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 1669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 1670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1671d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 1676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1677d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:name", &obj)) 1678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 1683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1685d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE:{ 1691d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 1692d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1693d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = doc->URL; 1694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1696d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1698d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1699d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->name; 1700d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1701d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1702d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 1703d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 1704d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1705d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = ns->prefix; 1706d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1707d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1708d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1709d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->name; 1710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 17121971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 1713d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1715d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1719d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1720d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1721d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1722d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 1723d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1724d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj)) 1725d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1726d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1728d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1729d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 1730d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1735d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1736d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1737d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1738d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1742d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1743d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->doc; 1744d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 1747d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1748d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1749d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1750d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->doc; 1751d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1752d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1753d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 1754d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1756d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1757d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1760d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1761d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 1762d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 1763d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj)) 1765d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1766d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1767d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 1768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->properties; 1769d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 1770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1771d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 1772d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1773d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1774d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1775d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1777d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1778d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1779d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1780d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1781d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:next", &obj)) 1783d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1784d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1785d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1786d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1787d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 1788d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1789d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1792d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1794d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1795d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) attr->next; 1802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 1805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 1806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) ns->next; 1808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->next; 1812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1813d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1814d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1815d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1816d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1817d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1818d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1819d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1820d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1821d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1822d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1823d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1824d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1825d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj)) 1827d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1828d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1829d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1830d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1831d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 1832d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1833d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1836d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1838d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1845faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = (xmlNodePtr) attr->prev; 1846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 1848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1851faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = cur->prev; 1852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1853d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1854d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1855d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1856d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1857d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1858d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1860d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1861d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1862d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1863d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1864d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:children", &obj)) 1866d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1867d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1868d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1869d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1870d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 1871d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1872d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 1875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 1876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 1877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 1878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 1879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1880d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1882d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 1885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->children; 1886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->children; 1891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1896d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1897d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1898d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1899d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1900d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1901d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1902d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1903d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1904d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1905d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1906d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1907d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1908d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 1909d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1910d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1911d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1912d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1913d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 1914d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1915d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1916d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 1918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 1919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 1920d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 1921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 1922d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1923d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1924d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1927d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 1928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->last; 1929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1931d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->last; 1934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1935d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1937d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1938d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1939d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1940d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1944d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1945d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj)) 1951d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 1956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1957d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1958d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 1959d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 1960d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 1961d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1962d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 1963d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 1967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->parent; 1970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 1971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_DECL: 1972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 1973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_START: 1974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_END: 1975d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 1976d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1977d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 1978d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->parent; 1979d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 1980d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1981d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1982d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1983d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1984d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1989d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar *res = NULL; 1991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 1993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1995d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 1998d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2000d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 2002d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "element"; 2003d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2004d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 2005d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute"; 2006d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2007d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 2008d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "text"; 2009d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2010d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 2011d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "cdata"; 2012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2013d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 2014d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_ref"; 2015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2016d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 2017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity"; 2018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2019d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 2020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "pi"; 2021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2022d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 2023d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "comment"; 2024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2025d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 2026d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_xml"; 2027d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2028d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 2029d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "doctype"; 2030d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 2032d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "fragment"; 2033d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2034d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 2035d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "notation"; 2036d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 2038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_html"; 2039d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 2041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "dtd"; 2042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2043d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 2044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "elem_decl"; 2045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2046d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 2047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute_decl"; 2048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 2050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_decl"; 2051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 2053d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "namespace"; 2054d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2055d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 2056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_start"; 2057d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2058d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 2059d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_end"; 2060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2061d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2062d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_docbook"; 2064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2065d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2067d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 2069d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2070d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 20711971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2072d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2073d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2074d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2075d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 2076d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 207736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * Specific accessor functions * 207836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 207936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/ 208036eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2082d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 208336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 208436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 208536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 208636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 208736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2089d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node)) 2090d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 209136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 209236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 209336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2094d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 209636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 209736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->nsDef; 209836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 210036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 210136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 210236eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 210536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 210636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 210736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 210836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 210936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node)) 2111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 211236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 211336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 211436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 211736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 211836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->ns; 211936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 212136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 212236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 212336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************ 212436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 21251e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * Serialization front-end * 21261e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 21271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/ 21281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 21321e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_retval = NULL; 21331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlChar *c_retval; 21341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 21351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 21361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 21381e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 21391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 21401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node, 2142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding, &format)) 2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 21441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 21451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 21461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 21491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 21501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len, 2153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (const char *) encoding, format); 2154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 21551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2173d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2174d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2186d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2187d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2188d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2197d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 21981e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2199d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 2200a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) { 2201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2206d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2210d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2212d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2213d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2214d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2231d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2233d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2235d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2237d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2238d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2239d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2241d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2244d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2254d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 22751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 22771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 22781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2281d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 22821e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_file = NULL; 22831e77438da7dd912885effa97b1079867d1e041beDaniel Veillard FILE *output; 22841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 22851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 22861e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2287d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 22881e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 22891e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 22901e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlOutputBufferPtr buf; 22911e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 22921e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2293d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node, 2294d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &py_file, &encoding, &format)) 2295d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 22961e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 22971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 22981e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2299d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 23001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 2302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 23031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard output = PyFile_AsFile(py_file); 23051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (output == NULL) { 2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 23071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 23091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 23111e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 23131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 23151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding == NULL) 2318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 23191e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23201e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (encoding != NULL) { 2321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 2324d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 23251e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23261e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2329d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 23311e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 23321e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 23331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard buf = xmlOutputBufferCreateFile(output, handler); 23341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlSaveFormatFileTo(buf, doc, encoding, format); 23361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 23391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 23421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 23451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) len)); 23471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 23481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 23491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************ 23501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 2351a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * Extra stuff * 2352a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2353a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/ 2354a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject * 2355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2357a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard PyObject *py_retval; 2358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlChar *name; 2359a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard xmlNodePtr node; 2360a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2361d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name)) 2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2363a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard node = (xmlNodePtr) xmlNewNode(NULL, name); 2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("NewNode: %s : %p\n", name, (void *) node); 2365a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2366a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard if (node == NULL) { 2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2369a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard } 2370a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard py_retval = libxml_xmlNodePtrWrap(node); 2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2372a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard} 2373a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2374a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************ 2375a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2376d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 2377d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 2378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 2379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 238096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 2381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "name", libxml_name, METH_VARARGS, NULL}, 2382d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "children", libxml_children, METH_VARARGS, NULL}, 2383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "properties", libxml_properties, METH_VARARGS, NULL}, 2384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "last", libxml_last, METH_VARARGS, NULL}, 2385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "prev", libxml_prev, METH_VARARGS, NULL}, 2386d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "next", libxml_next, METH_VARARGS, NULL}, 2387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "parent", libxml_parent, METH_VARARGS, NULL}, 2388d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "type", libxml_type, METH_VARARGS, NULL}, 2389d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "doc", libxml_doc, METH_VARARGS, NULL}, 2390d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL}, 2391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL}, 2392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL}, 2393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL}, 2394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL}, 2395c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL}, 23963e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL }, 2397e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlSetParserCtxtErrorHandler", libxml_xmlSetParserCtxtErrorHandler, METH_VARARGS, NULL }, 2398e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlSetParserCtxtWarningHandler", libxml_xmlSetParserCtxtWarningHandler, METH_VARARGS, NULL }, 2399e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL }, 2400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {NULL, NULL, 0, NULL} 2401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 2402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 24030fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 24046361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void); 24050fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 24060fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard 2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid 2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void) 2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2410af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard static int initialized = 0; 24113ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *m; 2412af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard 2413af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard if (initialized != 0) 2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 2415c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlRegisterDefaultOutputCallbacks(); 2416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlRegisterDefaultInputCallbacks(); 2417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard m = Py_InitModule((char *) "libxml2mod", libxmlMethods); 2418af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard initialized = 1; 24195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 24206361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard 24210fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 24220fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard initlibxsltmod(); 24230fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 2424d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2425