libxml.c revision 4ea89f04ccd58de6cc4b83195252d0becba1fe69
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> 25d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#include <libxml/c14n.h> 26d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 2796fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 290d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf) 300d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) 31e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#elif defined(WITH_TRIO) 32e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#include "trio.h" 33e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#define vsnprintf trio_vsnprintf 340d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif 350d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard 36d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 37797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */ 38a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */ 395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */ 404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */ 41c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */ 42c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */ 434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 44d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void); 45d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO: 48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks 50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO \ 52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard "Unimplemented block at %s:%d\n", \ 54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard __FILE__, __LINE__); 558e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack/* 568e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * the following vars are used for XPath extensions, but 578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * are also referenced within the parser cleanup routine. 588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */ 598e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksInitialized = 0; 608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef struct libxml_xpathCallback { 628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlXPathContextPtr ctx; 638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlChar *name; 648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlChar *ns_uri; 658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack PyObject *function; 668e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack} libxml_xpathCallback, *libxml_xpathCallbackPtr; 678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef libxml_xpathCallback libxml_xpathCallbackArray[]; 688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksAllocd = 10; 698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic libxml_xpathCallbackArray *libxml_xpathCallbacks = NULL; 708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksNb = 0; 71c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************ 734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * Memory debug interface * 754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/ 774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 78c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#if 0 794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr); 804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size); 81d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size); 824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str); 83c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0; 864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0; 874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0; 894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL; 904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL; 914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL; 924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL; 934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 94f93a866079364a006189683eaa07f94c867389d1Daniel Veillardstatic void 95f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlErrorInitialize(void); /* forward declare */ 96f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 974e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 98c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlMemoryUsed(PyObject * self ATTRIBUTE_UNUSED, 99c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack PyObject * args ATTRIBUTE_UNUSED) 100529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard{ 101529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard long ret; 102529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard PyObject *py_retval; 103529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 104529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard ret = xmlMemUsed(); 105529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 106529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard py_retval = libxml_longWrap(ret); 107529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard return (py_retval); 108529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard} 109529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 110529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel VeillardPyObject * 111c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlDebugMemory(PyObject * self ATTRIBUTE_UNUSED, PyObject * args) 112d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1134e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int activate; 1144e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *py_retval; 1154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard long ret; 1164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate)) 118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1204e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY 1214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_xmlDebugMemory(%d) called\n", activate); 1224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (activate != 0) { 125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebug == 0) { 126d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * First initialize the library and grab the old memory handlers 128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * and switch the library to memory debugging 129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemGet((xmlFreeFunc *) & freeFunc, 131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlMallocFunc *) & mallocFunc, 132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlReallocFunc *) & reallocFunc, 133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrdupFunc *) & strdupFunc); 134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) && 135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (reallocFunc == xmlMemRealloc) && 136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (strdupFunc == xmlMemoryStrdup)) { 137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 139f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* 140f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * cleanup first, because some memory has been 141f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * allocated with the non-debug malloc in xmlInitParser 142f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * when the python module was imported 143f93a866079364a006189683eaa07f94c867389d1Daniel Veillard */ 144f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlCleanupParser(); 145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc, 146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemRealloc, xmlMemoryStrdup); 147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (ret < 0) 148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto error; 149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 150f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* reinitialize */ 151f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlInitParser(); 152f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxml_xmlErrorInitialize(); 153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (libxmlMemoryDebugActivated == 0) { 156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebug = 1; 162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 1; 1634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebugActivated == 1) 165d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else 167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 0; 1694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard error: 1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard py_retval = libxml_longWrap(ret); 172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 1744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 176f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlPythonCleanupParser(PyObject *self ATTRIBUTE_UNUSED, 177f93a866079364a006189683eaa07f94c867389d1Daniel Veillard PyObject *args ATTRIBUTE_UNUSED) { 178f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 1798e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack int ix; 1808e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack long freed = -1; 181f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 182f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryDebug) { 183f93a866079364a006189683eaa07f94c867389d1Daniel Veillard freed = xmlMemUsed(); 184f93a866079364a006189683eaa07f94c867389d1Daniel Veillard } 185f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 186f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlCleanupParser(); 1878e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack /* 1888e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * Need to confirm whether we really want to do this (required for 1898e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * memcheck) in all cases... 1908e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */ 1918e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 1928e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if (libxml_xpathCallbacks != NULL) { /* if ext funcs declared */ 1938e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack for (ix=0; ix<libxml_xpathCallbacksNb; ix++) { 1948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((*libxml_xpathCallbacks)[ix].name != NULL) 1958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree((*libxml_xpathCallbacks)[ix].name); 1968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((*libxml_xpathCallbacks)[ix].ns_uri != NULL) 1978e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree((*libxml_xpathCallbacks)[ix].ns_uri); 1988e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 1998e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksNb = 0; 2008e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree(libxml_xpathCallbacks); 2018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = NULL; 2028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 203f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 204f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryDebug) { 205f93a866079364a006189683eaa07f94c867389d1Daniel Veillard freed -= xmlMemUsed(); 206f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxmlMemoryAllocatedBase -= freed; 207f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryAllocatedBase < 0) 208f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxmlMemoryAllocatedBase = 0; 209f93a866079364a006189683eaa07f94c867389d1Daniel Veillard } 210f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 211f93a866079364a006189683eaa07f94c867389d1Daniel Veillard Py_INCREF(Py_None); 212f93a866079364a006189683eaa07f94c867389d1Daniel Veillard return(Py_None); 213f93a866079364a006189683eaa07f94c867389d1Daniel Veillard} 214f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 215f93a866079364a006189683eaa07f94c867389d1Daniel VeillardPyObject * 216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self, 217d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ATTRIBUTE_UNUSED PyObject * args) 218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2194e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 2204e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebug != 0) 221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemoryDump(); 2224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard Py_INCREF(Py_None); 223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 228c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Handling Python FILE I/O at the C level * 229c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * The raw I/O attack diectly the File objects, while the * 230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * other routines address the ioWrapper instance instead * 231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 234c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref: 236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) { 242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file, *ret; 243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileCloseUnref\n"); 246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 249118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "close", (char *) "()"); 250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 251c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(file); 254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw: 259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel 264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) { 269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: %d\n", len); 276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 277c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 279118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len); 280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 281c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is NULL\n"); 282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is not a String\n"); 293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead: 300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel. 305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) { 310c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: %d\n", len); 317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 320118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len); 321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 322c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is NULL\n"); 323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 327c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is not a String\n"); 334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite: 341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel. 346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written 348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) { 351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *string; 3536cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *ret = NULL; 354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int written = -1; 355c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: %d\n", len); 358c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard string = PyString_FromStringAndSize(buffer, len); 362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (string == NULL) return(-1); 3636cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (PyObject_HasAttrString(file, (char *) "io_write")) { 3646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", 3656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard string); 3666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } else if (PyObject_HasAttrString(file, (char *) "write")) { 3676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "write", (char *) "(O)", 3686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard string); 3696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 370c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(string); 371c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is NULL\n"); 373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyInt_Check(ret)) { 375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = (int) PyInt_AsLong(ret); 376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (ret == Py_None) { 378c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = len; 379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is not an Int nor None\n"); 382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(written); 385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose: 389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) { 3956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *file, *ret = NULL; 396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 397c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileClose\n"); 399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 4026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (PyObject_HasAttrString(file, (char *) "io_close")) { 4036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()"); 4046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } else if (PyObject_HasAttrString(file, (char *) "flush")) { 4056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "flush", (char *) "()"); 4066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 407c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 408c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 409c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 413a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 415c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile: 416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 424118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr 425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file, 426c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr encoder) { 427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr ret; 428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocOutputBuffer(encoder); 432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->writecallback = xmlPythonFileWrite; 436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 441c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 442c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr buffer; 449c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 450c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate", 452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 455118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard handler = xmlFindCharEncodingHandler((const char *) encoding); 456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 457c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlOutputBufferCreatePythonFile(file, handler); 458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n"); 460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlOutputBufferPtrWrap(buffer); 461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 4636cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard/** 4656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * libxml_outputBufferGetPythonFile: 4666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * @buffer: the I/O buffer 4676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * 4686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * read the Python I/O from the CObject 4696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * 4706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * Returns the new parser output or NULL 4716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard */ 4726cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardstatic PyObject * 4736cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self, 4746cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *args) { 4756cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *buffer; 4766cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *file; 4776cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr obj; 4786cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4796cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile", 4806cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard &buffer)) 4816cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 4826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard obj = PyoutputBuffer_Get(buffer); 4846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (obj == NULL) { 4856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard fprintf(stderr, 4866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard "outputBufferGetPythonFile: obj == NULL\n"); 4876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 4886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 4896cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 4906cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (obj->closecallback != xmlPythonFileClose) { 4916cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard fprintf(stderr, 4926cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard "outputBufferGetPythonFile: not a python file wrapper\n"); 4936cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 4946cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 4956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 4966cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard file = (PyObject *) obj->context; 4976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (file == NULL) { 4986cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 4996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 5006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 5016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(file); 5026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(file); 5036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 5046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 5066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 5076cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *py_retval; 5086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard int c_retval; 5096cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr out; 5106cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *pyobj_out; 5116cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5126cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out)) 5136cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 5146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); 515263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* Buffer may already have been destroyed elsewhere. This is harmless. */ 516263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (out == NULL) { 517263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard Py_INCREF(Py_None); 518263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(Py_None); 519263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard } 5206cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5216cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard c_retval = xmlOutputBufferClose(out); 5226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard py_retval = libxml_intWrap((int) c_retval); 5236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(py_retval); 5246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 5256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 5276cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 5286cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *py_retval; 5296cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard int c_retval; 5306cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr out; 5316cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *pyobj_out; 5326cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5336cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out)) 5346cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 5356cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); 5366cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5376cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard c_retval = xmlOutputBufferFlush(out); 5386cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard py_retval = libxml_intWrap((int) c_retval); 5396cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(py_retval); 5406cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 541263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 542263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject * 543263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 544263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *py_retval; 545263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int c_retval; 546263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlOutputBufferPtr buf; 547263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_buf; 548263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlDocPtr cur; 549263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_cur; 550263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard char * encoding; 551263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 552263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding)) 553263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(NULL); 554263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); 555263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); 556263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 557263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard c_retval = xmlSaveFileTo(buf, cur, encoding); 558263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* xmlSaveTo() freed the memory pointed to by buf, so record that in the 559263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard * Python object. */ 560263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; 561263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 562263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(py_retval); 563263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard} 564263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 565263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject * 566263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 567263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *py_retval; 568263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int c_retval; 569263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlOutputBufferPtr buf; 570263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_buf; 571263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlDocPtr cur; 572263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_cur; 573263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard char * encoding; 574263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int format; 575263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 576263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format)) 577263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(NULL); 578263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); 579263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); 580263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 581263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format); 582263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that 583263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard * in the Python object */ 584263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; 585263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 586263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(py_retval); 587263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard} 588a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 589c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 590c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 591c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 592c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile: 593c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 594c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 595c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 596c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 597c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 598c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 599c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 600c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 601118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr 602c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file, 603c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding encoding) { 604c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr ret; 605c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 606c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 607c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 608c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocParserInputBuffer(encoding); 609c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 610c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 611c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 612c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->readcallback = xmlPythonFileRead; 613c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 614c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 615c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 616c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 617c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 618c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 619c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 620c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 621c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 622c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 623c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 624c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; 625c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buffer; 626c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 627c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 628c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate", 629c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 630c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 631c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 632118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard enc = xmlParseCharEncoding((const char *) encoding); 633c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 634c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlParserInputBufferCreatePythonFile(file, enc); 635c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 636c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n"); 637c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlParserInputBufferPtrWrap(buffer); 638c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 639c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 640c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 641c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 642c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 643c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Providing the resolver at the Python level * 644c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 645c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 646c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 647c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL; 648c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext; 649c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 650c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr 651c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID, 652c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserCtxtPtr ctxt) { 653c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputPtr result = NULL; 654c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (pythonExternalEntityLoaderObjext != NULL) { 655c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 656c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ctxtobj; 657c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 658c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt); 659c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 660c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: ready to call\n"); 661c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 662c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext, 664118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard (char *) "(ssO)", URL, ID, ctxtobj); 665e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(ctxtobj); 666c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 667c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: result "); 668007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard PyObject_Print(ret, stderr, 0); 669c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("\n"); 670c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 672c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 673118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard if (PyObject_HasAttrString(ret, (char *) "read")) { 674c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buf; 675c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 676c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); 677c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buf != NULL) { 678c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->context = ret; 679c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->readcallback = xmlPythonFileReadRaw; 680c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->closecallback = xmlPythonFileCloseRaw; 681c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = xmlNewIOInputStream(ctxt, buf, 682c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard XML_CHAR_ENCODING_NONE); 683c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 6844ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#if 0 685c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 6864ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard if (URL != NULL) 6874ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard printf("pythonExternalEntityLoader: can't read %s\n", 6884ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard URL); 6894ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#endif 690c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 691c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (result == NULL) { 692c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 693c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard } else if (URL != NULL) { 694c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack result->filename = (char *) xmlStrdup((const xmlChar *)URL); 695c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard result->directory = xmlParserGetDirectory((const char *) URL); 696c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 697c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 699c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((result == NULL) && (defaultExternalEntityLoader != NULL)) { 700c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = defaultExternalEntityLoader(URL, ID, ctxt); 701c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(result); 703c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 704c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 707c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 708c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *loader; 709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader", 711c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &loader)) 712c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 713c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 714c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 715c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlSetEntityLoader\n"); 716c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 717c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (defaultExternalEntityLoader == NULL) 718c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard defaultExternalEntityLoader = xmlGetExternalEntityLoader(); 719c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 720c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard pythonExternalEntityLoaderObjext = loader; 721c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlSetExternalEntityLoader(pythonExternalEntityLoader); 722c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 723c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = PyInt_FromLong(0); 724c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 725c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 726c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 727c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 728c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 729c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 7303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 732d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 7331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 73433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 73533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name, 73633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar ** attrs) 73733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard int i; 73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *dict; 74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrname; 74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrvalue; 743d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 74533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 746797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 747797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartElement(%s) called\n", name); 748797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 74933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 750d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startElement")) 75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "start")) 75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 75433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard * the xmllib interface always generate a dictionnary, 75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard * possibly empty 75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 75933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if ((attrs == NULL) && (type == 1)) { 76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = Py_None; 762d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (attrs == NULL) { 763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard dict = PyDict_New(); 76433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 76533caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = PyDict_New(); 76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (i = 0; attrs[i] != NULL; i++) { 767d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrname = PyString_FromString((char *) attrs[i]); 76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard i++; 76933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (attrs[i] != NULL) { 770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrvalue = PyString_FromString((char *) attrs[i]); 77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 77233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = Py_None; 77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyDict_SetItem(dict, attrname, attrvalue); 77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 77833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 77933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "startElement", 781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 78233caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 783d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "start", 784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 78733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(dict); 78833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 78933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 79033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 79233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 79333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data) 79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 79633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 79733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 798797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 799797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartDocument() called\n"); 800797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startDocument")) { 803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "startDocument", NULL); 805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 80733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 80833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 80933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 81033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 81133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 81233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data) 81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 81433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 81533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 81633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 817797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 818797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndDocument() called\n"); 819797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 821d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endDocument")) { 822d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "endDocument", NULL); 824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 82633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 82733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 82833caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 82933caa0b8307eccf22010400747830b1967edb292Daniel Veillard * The reference to the handler is released there 83033caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(handler); 83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 83433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 83533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name) 83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 83733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 83833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 83933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 840797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 841797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndElement(%s) called\n", name); 842797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 84333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endElement")) { 845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "endElement", 846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 84933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (PyObject_HasAttrString(handler, (char *) "end")) { 851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "end", 852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 855797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard Py_XDECREF(result); 85633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 85733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 85833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 85933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 86033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name) 86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 86333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 86433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 865797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 866797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonReference(%s) called\n", name); 867797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 86833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "reference")) { 870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "reference", 871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 87433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 87533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 87633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 87733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 87833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 87933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len) 88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 88333caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 885797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 886797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCharacters(%s, %d) called\n", ch, len); 887797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 88833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "characters")) 890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 89333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "characters", 896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "data", 899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 90233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 90333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 90433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 90533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 90633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 90733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len) 90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 90933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 910d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 91133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 913797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 914797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len); 915797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace")) 91833caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 92133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 92333caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 924d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, 925d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ignorableWhitespace", 926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "data", 930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 93233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 93333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 93433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 93533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 93633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data, 93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * target, const xmlChar * data) 93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 93933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 94033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 942797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 943797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonProcessingInstruction(%s, %s) called\n", target, data); 944797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 94533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 946d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) { 947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) 948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard "processingInstruction", 949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ss", target, data); 95033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 95133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 95233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 95333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 95433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 95533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value) 95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 95833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 95933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 960797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 961797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonComment(%s) called\n", value); 962797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "comment")) { 965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 966d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "comment", (char *) "s", 967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard value); 968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 97033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 97133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 97233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 97333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 97433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 97533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...) 97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 97833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 97933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 982797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 983797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonWarning(%s) called\n", msg); 984797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 986d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "warning")) { 98733caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 98833caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 989d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 992d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "warning", (char *) "s", 993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 99633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 99733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 99833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 99933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 100033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 100133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...) 100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 100433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 100533caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1008797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1009797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonError(%s) called\n", msg); 1010797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 101133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1012d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "error")) { 101333caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 101433caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 1015d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 1017d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1018d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "error", (char *) "s", 1019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 1020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 102233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 102333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 102433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 102533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 102633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 102733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...) 102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 103033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 103133caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1034797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1035797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonFatalError(%s) called\n", msg); 1036797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1038d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "fatalError")) { 103933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 104033caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 1041d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 1043d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1044d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "fatalError", 1045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", buf); 1046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 104833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 104933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 105033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 105133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 105233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 105333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len) 105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 1056d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 105733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 105833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1059797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1060797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCdataBlock(%s, %d) called\n", ch, len); 1061797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 106233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1063d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "cdataBlock")) 1064d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 1065d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "cdata")) 1066d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 106733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 1068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdataBlock", 1071d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdata", 1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 1076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 107833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 107933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 108033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 108133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 108233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 108333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data, 108433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * externalID, const xmlChar * systemID) 108633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 108733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 108833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 108933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1090797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1091797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonExternalSubset(%s, %s, %s) called\n", 1092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, externalID, systemID); 1093797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 109433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1095d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "externalSubset")) { 109633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 1097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "externalSubset", 1098d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, externalID, 1099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemID); 110033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 110133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 110233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 110333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 110433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 110533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data, 110633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 110733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 110833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 110933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, xmlChar * content) 111033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 111133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 111233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 111333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 111433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1115d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "entityDecl")) { 1116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "entityDecl", 1117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sisss", name, type, 1118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard publicId, systemId, content); 1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 112133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 112233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 112333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 112433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 112533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 112733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 112833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 112933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data, 113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 113133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, const xmlChar * systemId) 113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 113333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 113433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 113533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 113633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "notationDecl")) { 1138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "notationDecl", 1139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, publicId, 1140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemId); 1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 114333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 114433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 114533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 114633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 114733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 114833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data, 114933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * elem, 115033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 115133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 115233caa0b8307eccf22010400747830b1967edb292Daniel Veillard int def, 1153d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * defaultValue, xmlEnumerationPtr tree) 115433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 115533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 115633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *nameList; 115733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *newName; 115833caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr node; 115933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 116033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int count; 116133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 116233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) { 116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 116533caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 116633caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 116733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 116833caa0b8307eccf22010400747830b1967edb292Daniel Veillard nameList = PyList_New(count); 116933caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 117033caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 1171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard newName = PyString_FromString((char *) node->name); 117233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyList_SetItem(nameList, count, newName); 117333caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 117433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 1175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "attributeDecl", 1176d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssiisO", elem, name, type, 1177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard def, defaultValue, nameList); 1178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 118033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(nameList); 118133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 118233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 118333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 118433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 118533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 118633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data, 118733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 1188d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int type, ATTRIBUTE_UNUSED xmlElementContentPtr content) 118933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 119033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 119133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *obj; 119233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 119333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 119433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1195d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "elementDecl")) { 1196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* TODO: wrap in an elementContent object */ 1197d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 1198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n"); 1199d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = Py_None; 1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */ 1201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "elementDecl", 1202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "siO", name, type, obj); 1203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 120533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 120633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 120733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 120833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 120933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 121033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data, 121133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 121233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 121333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, 121433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * notationName) 121533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 121633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 121733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 121833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 121933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) { 1221d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1222d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "unparsedEntityDecl", 1223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssss", name, publicId, systemId, 1224d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard notationName); 1225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 122733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 122833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 122933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 123033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 123133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 123233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name, 123333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * ExternalID, const xmlChar * SystemID) 123433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 123533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 123633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 123733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1238797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1239797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonInternalSubset(%s, %s, %s) called\n", 1240d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, ExternalID, SystemID); 1241797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 124233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "internalSubset")) { 1244d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "internalSubset", 1245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, ExternalID, 1246d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SystemID); 1247d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 124933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 125033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 125133caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 125233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 125333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = { 125433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonInternalSubset, 1255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonIsStandalone, */ 1256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasInternalSubset, */ 1257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasExternalSubset, */ 1258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonResolveEntity, */ 1259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetEntity, */ 126033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEntityDecl, 126133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonNotationDecl, 126233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonAttributeDecl, 126333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonElementDecl, 126433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonUnparsedEntityDecl, 1265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* OBSOLETED pythonSetDocumentLocator, */ 126633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartDocument, 126733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndDocument, 126833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartElement, 126933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndElement, 127033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonReference, 127133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCharacters, 127233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonIgnorableWhitespace, 127333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonProcessingInstruction, 127433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonComment, 127533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonWarning, 127633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonError, 127733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonFatalError, 1278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetParameterEntity, */ 127933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCdataBlock, 128033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonExternalSubset, 1281a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard 1, 1282a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL, /* TODO mograte to SAX2 */ 1283a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL, 1284871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack NULL, 1285a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL 128633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}; 1287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 12883ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 12893ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 12903ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 12913ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 12923ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 12931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 12941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1295d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1297d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 12993ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 1300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 130133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 13023ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 13033ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 13043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 13053ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 1306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk, 1308d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13101971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 13118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 1313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 13141971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 13153ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 1316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 13191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 132033caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI); 13213ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1323a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 13245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1326d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1328d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1329656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 1330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 13314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 1332d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 133333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 13344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 13354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 13364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 13374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1338d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1339d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk, 1340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 13438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 13464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 13474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 1348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1349d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 13514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 135233caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI, 1353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard XML_CHAR_ENCODING_NONE); 13544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1356656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else 1357656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard Py_INCREF(Py_None); 1358656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard return (Py_None); 1359656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 13604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 13614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 13628d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 13658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard int recover; 1366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 13678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 13688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 13698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX, 1371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &URI, &recover)) 1372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 13748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n", 1376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, recover); 13778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 13788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 13818d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 13828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 13838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 13848d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 1385f2531afe41a2232669302ceb49161d5689971ed9Daniel Veillard xmlSAXUserParseFile(SAX, pyobj_SAX, URI); 13868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1387d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 13888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 13898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 13908d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1393656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 1394d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 1395d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 13968d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 13978d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 13988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI, 1401d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding)) 1402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 14038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 14048d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 14058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n", 1406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, encoding); 14078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 14088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1410d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 14118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 14128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 14138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 14148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 14158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX); 14168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 1418656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else 1419656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard Py_INCREF(Py_None); 1420656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard return (Py_None); 1421656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 14228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 14238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 14245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 14255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 14265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 14275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 14285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 14295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 14315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 14325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1433e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */ 1434ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard/* 1435ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * disabled the loop, the repeated call to vsnprintf without reset of ap 1436ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * in case the initial buffer was too small segfaulted on x86_64 1437ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * we now directly vsnprintf on a large buffer. 1438ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard */ 1439e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char * 1440e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap) 1441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int chars; 1443e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1445ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str = (char *) xmlMalloc(1000); 1446e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (str == NULL) 1447e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1449ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard chars = vsnprintf(str, 999, msg, ap); 1450ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard if (chars >= 998) 1451ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str[999] = 0; 1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1453e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return str; 1454e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1455e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1456e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg, 1458e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ...) 1459e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_list ap; 14615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 14625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 14635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 1464ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard char str[1000]; 14655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 14675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 14685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 14695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 1472d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_start(ap, msg); 1473007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard vfprintf(stderr, msg, ap); 1474d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(ap); 14755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 1476e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1477ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard if (vsnprintf(str, 999, msg, ap) >= 998) 1478ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str[999] = 0; 1479e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1480d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard list = PyTuple_New(2); 1482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 1483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 1484ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard message = libxml_charPtrConstWrap(str); 1485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 1, message); 1486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 1487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(list); 1488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(result); 14895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 14905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 14915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void) 1494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 14955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 14965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 14975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 14985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 1499781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 15005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 15015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1502c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self, 1504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 15065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 15075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 15085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 15095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1511d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f, 1512d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &pyobj_ctx)) 1513d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 15145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 15168e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx, 1517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_f); 15185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 15195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 1521d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 15225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 15235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 1524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 15255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 15265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 15285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 15295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 15315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 15325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 15335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 1535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 15365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1538e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1539e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************ 1540e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1541e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * Per parserCtxt error handler * 1542e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1543e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/ 1544e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1545417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct 1546417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1547417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *f; 1548417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *arg; 1549417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt; 1550417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr; 1551417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1552417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) 1554e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1555e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *list; 1556e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *result; 1557417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1558e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1560e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR 1561850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 1562e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif 1563e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1564417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr)ctx; 1565417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1566e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1567417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 1568417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1570417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrWrap(str)); 1571417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, Py_None); 1573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 1575417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (result == NULL) 1576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard { 1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyErr_Print(); 1579e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(list); 1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(result); 1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1584417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...) 1586417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1587417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap)); 1591417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1592417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1593417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1594417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1595417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...) 1596417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1597417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1598417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1599417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1600417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap)); 1601417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1602417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1603417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1605417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...) 1606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); 1611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...) 1616417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1618417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); 1621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1622e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1623e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1624c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1625417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1626e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1627e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *py_retval; 1628e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1629e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1630e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1631e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_f; 1632e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_arg; 1633e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1634417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler", 1635e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard &pyobj_ctxt, &pyobj_f, &pyobj_arg)) 1636e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1637e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1638e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (ctxt->_private == NULL) { 1639e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); 1640e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt == NULL) { 1641e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(-1); 1642e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1643e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1644e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); 1645e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->_private = pyCtxt; 1646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1647e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard else { 1648417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1649e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1650e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard /* TODO: check f is a function ! */ 1651417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1652e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_f); 1653417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->f = pyobj_f; 1654417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1655e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_arg); 1656417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->arg = pyobj_arg; 1657e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1658417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyobj_f != Py_None) { 1659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; 1660417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; 1661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler; 1662417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler; 1663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1665417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = xmlParserError; 1666417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = xmlParserValidityError; 1667417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = xmlParserWarning; 1668417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = xmlParserValidityWarning; 1669417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1670e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1671e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(1); 1672e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1673e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1674e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1675c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1676417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1677e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1678417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *py_retval; 1679417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1680e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1681417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *pyobj_ctxt; 1682e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1683417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler", 1684417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard &pyobj_ctxt)) 1685417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(NULL); 1686417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1687417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard py_retval = PyTuple_New(2); 1688417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt->_private != NULL) { 1689417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1690e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1691417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 1692417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->f); 1693417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 1694417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1695417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1696417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1697417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* no python error handler registered */ 1698417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 1699417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1700417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 1701417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1702e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1703417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(py_retval); 1704e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1705e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1706c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1707417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 1708e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1709e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1710417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1711e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt)) 1713e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1715417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1716417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt != NULL) { 1717417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1718417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyCtxt) { 1719417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1720417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1721417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFree(pyCtxt); 1722e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1723417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFreeParserCtxt(ctxt); 1724e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1725e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1726417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1727417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(Py_None); 1728e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1729e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1730850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard/*** 1731850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard * xmlValidCtxt stuff 1732850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard */ 1733850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1734850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef struct 1735850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1736850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *warn; 1737850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *error; 1738850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *arg; 1739850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} xmlValidCtxtPyCtxt; 1740850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr; 1741850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1742850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1743850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) 1744850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1745850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *list; 1746850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *result; 1747850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1748850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1749850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1750850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str); 1751850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1752850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1753850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; 1754850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1755850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard list = PyTuple_New(2); 1756850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 1757850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 1758850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyCtxt->arg); 1759850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 1760850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (result == NULL) 1761850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard { 1762850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: manage for the exception to be propagated... */ 1763850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyErr_Print(); 1764850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1765850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(list); 1766850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(result); 1767850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1768850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1769850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1770850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, int severity, char *str) 1771850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1772850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *list; 1773850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *result; 1774850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1775850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1776850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1777850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str); 1778850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1779850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1780850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; 1781850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1782850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard list = PyTuple_New(2); 1783850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 1784850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 1785850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyCtxt->arg); 1786850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 1787850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (result == NULL) 1788850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard { 1789850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: manage for the exception to be propagated... */ 1790850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyErr_Print(); 1791850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1792850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(list); 1793850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(result); 1794850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1795850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1796850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1797850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...) 1798850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1799850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_list ap; 1800850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1801850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_start(ap, msg); 1802850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); 1803850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_end(ap); 1804850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1805850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1806850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1807850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...) 1808850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1809850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_list ap; 1810850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1811850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_start(ap, msg); 1812850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); 1813850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_end(ap); 1814850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1815850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1816850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic PyObject * 1817850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1818850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1819850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *py_retval; 1820850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_error; 1821850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_warn; 1822850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_ctx; 1823850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_arg = Py_None; 1824850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPtr ctxt; 1825850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1826850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1827850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (!PyArg_ParseTuple 1828850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 1829850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return (NULL); 1830850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1831850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1832850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 1833850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1834850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1835850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt = PyValidCtxt_Get(pyobj_ctx); 1836850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt)); 1837850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (pyCtxt == NULL) { 1838850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard py_retval = libxml_intWrap(-1); 1839850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return(py_retval); 1840850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1841850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt)); 1842850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1843850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1844850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: check warn and error is a function ! */ 1845850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->error); 1846850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_error); 1847850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->error = pyobj_error; 1848850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1849850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->warn); 1850850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_warn); 1851850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->warn = pyobj_warn; 1852850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1853850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->arg); 1854850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_arg); 1855850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->arg = pyobj_arg; 1856850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1857850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->error = libxml_xmlValidCtxtErrorFuncHandler; 1858850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler; 1859850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->userData = pyCtxt; 1860850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1861850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard py_retval = libxml_intWrap(1); 1862850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return (py_retval); 1863850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1864850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 186525c90c589b256f0925f081198c1525134a491e31Daniel Veillard 1866bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject * 186725c90c589b256f0925f081198c1525134a491e31Daniel Veillardlibxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 186825c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlValidCtxtPtr cur; 186925c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 187025c90c589b256f0925f081198c1525134a491e31Daniel Veillard PyObject *pyobj_cur; 187125c90c589b256f0925f081198c1525134a491e31Daniel Veillard 187225c90c589b256f0925f081198c1525134a491e31Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur)) 187325c90c589b256f0925f081198c1525134a491e31Daniel Veillard return(NULL); 187425c90c589b256f0925f081198c1525134a491e31Daniel Veillard cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur); 187525c90c589b256f0925f081198c1525134a491e31Daniel Veillard 187625c90c589b256f0925f081198c1525134a491e31Daniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData); 187725c90c589b256f0925f081198c1525134a491e31Daniel Veillard if (pyCtxt != NULL) 187825c90c589b256f0925f081198c1525134a491e31Daniel Veillard { 187925c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->error); 188025c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->warn); 188125c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->arg); 188225c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlFree(pyCtxt); 188325c90c589b256f0925f081198c1525134a491e31Daniel Veillard } 188425c90c589b256f0925f081198c1525134a491e31Daniel Veillard 188525c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlFreeValidCtxt(cur); 188625c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_INCREF(Py_None); 188725c90c589b256f0925f081198c1525134a491e31Daniel Veillard return(Py_None); 188825c90c589b256f0925f081198c1525134a491e31Daniel Veillard} 188925c90c589b256f0925f081198c1525134a491e31Daniel Veillard 1890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 1891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 189226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * Per xmlTextReader error handler * 189326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 189426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/ 189526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 189626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct 189726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 189826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *f; 189926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *arg; 190026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt; 190126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr; 190226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 190326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void 190426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg, 190526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard const char *msg, 1906417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard int severity, 1907417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlTextReaderLocatorPtr locator) 190826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 190926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg; 191026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *list; 191126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *result; 191226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1913417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 191426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 191526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 191626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg)); 1917417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1918417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator)); 191926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 192026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (result == NULL) 192126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 1922417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 192326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyErr_Print(); 192426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 192526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(list); 192626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(result); 192726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 192826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1929c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 193026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 193126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 193226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 193326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 193426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 193526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 193626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 193726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_f; 193826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_arg; 193926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 194026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 194126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg)) 194226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 194326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 194426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* clear previous error handler */ 194526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 194626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 1947c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { 194826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 194926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 195026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 195126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 195226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 195326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 195426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else { 195526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 195626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there already an arg, and it's not ours, 195726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there is definitely something wrong going on here... 195826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * we don't know how to free it, so we bail out... 195926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 196026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 196126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 196226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 196326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 196426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderSetErrorHandler(reader,NULL,NULL); 196526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* set new error handler */ 196626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyobj_f != Py_None) 196726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 196826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt)); 196926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyCtxt == NULL) { 197026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 197126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 197226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 197326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_f); 197426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->f = pyobj_f; 197526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_arg); 197626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->arg = pyobj_arg; 1977c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlTextReaderSetErrorHandler(reader, 1978c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback, 1979c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt); 198026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 198126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 198226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(1); 198326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 198426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 198526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1986c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 198726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 198826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 198926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 199026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 199126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 199226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 199326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 199426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 199526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 199626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader)) 199726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 199826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 199926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 200026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = PyTuple_New(2); 2001c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) { 200226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 200326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 200426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 200526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->f); 200626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 200726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 200826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 200926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else 201026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 201126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* f is null or it's not our error handler */ 201226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 201326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 201426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 201526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 201626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 201726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 201826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 201926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 2020c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 202126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 202226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 202326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 202426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 202526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 202626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 202726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 2028157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) 2029157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard return(NULL); 2030157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard if (!PyCObject_Check(pyobj_reader)) { 2031bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard Py_INCREF(Py_None); 2032bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard return(Py_None); 2033bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard } 203426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 2035bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard if (reader == NULL) { 2036bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard Py_INCREF(Py_None); 2037bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard return(Py_None); 2038bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard } 203926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 204026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 204126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 2042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { 204326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 204426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 204526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 204626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 204726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 204826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 204926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 205026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * else, something wrong happened, because the error handler is 205126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * not owned by the python bindings... 205226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 205326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 205426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 205526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFreeTextReader(reader); 205626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_INCREF(Py_None); 205726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(Py_None); 205826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 205926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 206026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************ 206126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 2062a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 2063a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 2064a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 2065a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2066a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 2067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) 2068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2069a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 2070a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 207170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard xmlXPathContextPtr rctxt; 207270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard PyObject *current_function = NULL; 207370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *name; 207470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *ns_uri; 2075a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2076a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 207770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (ctxt == NULL) 2078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 207970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard rctxt = ctxt->context; 208070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (rctxt == NULL) 2081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 208270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard name = rctxt->function; 208370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard ns_uri = rctxt->functionURI; 2084a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, 2086d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ns_uri); 2087a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 2088a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 208970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 209070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * Find the function, it should be there it was there at lookup 209170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 2092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ( /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */ 20948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 20958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 20968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack current_function = (*libxml_xpathCallbacks)[i].function; 2097d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 209870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 209970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (current_function == NULL) { 2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 2101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("libxml_xmlXPathFuncCallback: internal error %s not found !\n", 2102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name); 2103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 210470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 210570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard 2106c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard list = PyTuple_New(nargs + 1); 2107c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt)); 210805349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard for (i = nargs - 1; i >= 0; i--) { 2109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = valuePop(ctxt); 2110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 2111d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, i + 1, cur); 2112a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2113a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 2114a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 2115a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2116a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 2117a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 2118a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2119a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2120a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 2121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name, 2122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * ns_uri) 2123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2124a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2125d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2126a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2127a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 2128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctxt, name, ns_uri); 2129a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 213070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 213170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * This is called once only. The address is then stored in the 213270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * XPath expression evaluation, the proper object to call can 213370cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * then still be found using the execution context function 213470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * and functionURI fields. 213570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 2136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 21378e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) && 21388e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 21398e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 2140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (libxml_xmlXPathFuncCallback); 2141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2142a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2144a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2145a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2146a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void) 2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2149a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2150a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2151a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 2152d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 2153a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2154a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2155a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 2156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 21578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc( 21588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); 2159a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 21608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack for (i = 0; i < libxml_xpathCallbacksAllocd; i++) { 21618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ctx = NULL; 21628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].name = NULL; 21638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ns_uri = NULL; 21648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = NULL; 2165a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2166a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 2167a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2168a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2169a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 2170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self, 2171d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 2172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2173a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 2174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 2175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 2176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 2177a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 2178a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 2179a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 2180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name, 2184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &ns_uri, &pyobj_f)) 2185d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 2188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacksInitialize(); 2190a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 2191a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2192a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 2193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_intWrap(-1); 2194d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2196a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 2198d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctx, name, ns_uri); 2199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 22018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((ctx == (*libxml_xpathCallbacks)[i].ctx) && 22028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 22038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 2204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 22058e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack Py_XDECREF((*libxml_xpathCallbacks)[i].function); 22068e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = pyobj_f; 2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 2208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto done; 2209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2210a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 22118e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) { 22128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd+=10; 22138e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc( 22148e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks, 22158e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); 22168e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 22178e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack i = libxml_xpathCallbacksNb++; 22188e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack Py_XINCREF(pyobj_f); 22198e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ctx = ctx; 22208e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].name = xmlStrdup(name); 22218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri); 22228e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = pyobj_f; 2223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 22248e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 2225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard done: 2226a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 2227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2228a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2229a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 22301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 22311971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 2232d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 2233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 2234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 2235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2236d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2242d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:name", &obj)) 2243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 2248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2255d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE:{ 2256d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = doc->URL; 2259d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->name; 2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = ns->prefix; 2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->name; 2275d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2276d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 22771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2278d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2279d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2280d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2281d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2282d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2284d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 2288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2289d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj)) 2290d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 2295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2296d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2297d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2298d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2306d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2308d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->doc; 2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2315d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->doc; 2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 2319d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 2327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 2328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2329d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj)) 2330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 2333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->properties; 2334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 2335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 2337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2341d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2347d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:next", &obj)) 2348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 2353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2354d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2356d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2359d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2361d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2364d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2366d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) attr->next; 2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) ns->next; 2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->next; 2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2380d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2381d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2382d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2383d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2384d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2391d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj)) 2392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 2397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2398d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2402d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2408d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2410faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = (xmlNodePtr) attr->prev; 2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2416faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = cur->prev; 2417d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2420d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2424d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2430d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:children", &obj)) 2431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 2436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2439d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2440d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2441d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2442d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2443d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2444d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->children; 2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2453d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2455d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->children; 2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2457d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2458d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2467d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2473d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 2479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2482d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2483d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2484d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->last; 2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2496d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->last; 2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj)) 2516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 2521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2524d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2525d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2527d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2530d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2534d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->parent; 2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2536d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_DECL: 2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_START: 2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_END: 2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->parent; 2544d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2555d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar *res = NULL; 2556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2557d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 2563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2565d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 2567d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "element"; 2568d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 2570d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute"; 2571d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 2573d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "text"; 2574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "cdata"; 2577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_ref"; 2580d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity"; 2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 2585d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "pi"; 2586d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "comment"; 2589d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_xml"; 2592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "doctype"; 2595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 2597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "fragment"; 2598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "notation"; 2601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 2603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_html"; 2604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "dtd"; 2607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 2609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "elem_decl"; 2610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute_decl"; 2613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_decl"; 2616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "namespace"; 2619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_start"; 2622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 2624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_end"; 2625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2628d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_docbook"; 2629d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 2634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 26361971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 2641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 264236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * Specific accessor functions * 264336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 264436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/ 264536eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2646d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 264836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 264936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 265036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 265136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 265236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2653d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2654d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node)) 2655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 265636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 265736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 265836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2659d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2660d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 266136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 266236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->nsDef; 266336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 266536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 266636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 266736eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2668f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillardlibxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2669f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard{ 2670f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard PyObject *py_retval; 2671f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNsPtr ns, prev; 2672f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNodePtr node; 2673f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard PyObject *pyobj_node; 2674f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlChar *href; 2675f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNsPtr c_retval; 2676f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2677f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (!PyArg_ParseTuple 2678f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href)) 2679f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (NULL); 2680f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 2681f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = NULL; 2682f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2683f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2684f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard Py_INCREF(Py_None); 2685f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (Py_None); 2686f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2687f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2688f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (href == NULL) { 2689f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = node->nsDef; 2690f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node->nsDef = NULL; 2691f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = 0; 2692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2693f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard else { 2694f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev = NULL; 2695f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = node->nsDef; 2696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard while (ns != NULL) { 2697f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (xmlStrEqual(ns->href, href)) { 2698f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (prev != NULL) 2699f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev->next = ns->next; 2700f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard else 2701f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node->nsDef = ns->next; 2702f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns->next = NULL; 2703f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = 0; 2704f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard break; 2705f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2706f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev = ns; 2707f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = ns->next; 2708f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2709f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2710f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2711f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = ns; 2712f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2713f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (py_retval); 2714f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard} 2715f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2716f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel VeillardPyObject * 2717d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2718d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 271936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 272036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 272136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 272236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 272336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2724d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node)) 2725d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 272636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 272736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2728e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard if ((node == NULL) || 2729e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard ((node->type != XML_ELEMENT_NODE) && 2730e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard (node->type != XML_ATTRIBUTE_NODE))) { 2731d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 273336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 273436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->ns; 273536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2736d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 273736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 273836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2739a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 274036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************ 274136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 27421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * Serialization front-end * 27431e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 27441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/ 27451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2746d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2747d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2748d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 27491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_retval = NULL; 27501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlChar *c_retval; 27511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 27521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 27531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 27551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 27561e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 27571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2758d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node, 2759d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding, &format)) 2760d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 27611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 27621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 27631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 27661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 27671e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2768d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocDumpFormatMemoryEnc(doc, &c_retval, &len, 2770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (const char *) encoding, format); 2771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2772656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 27731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2774d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2775d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2778d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2779d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2781d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2782d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2783d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2786d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2791d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2792d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2793d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2795d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2800d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2801d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2802d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2803d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2804d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2805d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2811d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2812d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2813d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2814d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2815d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2816656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 28171e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 281895af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack if (node->type == XML_NAMESPACE_DECL) 281995af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack doc = NULL; 282095af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack else 282195af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack doc = node->doc; 2822a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) { 2823d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2824d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2833d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2834d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2835d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2836d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2837d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2839d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2840d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2841d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2842d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2843d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2847d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2852656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 2853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferPtr buf; 2855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 2856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) 2858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlSetMetaEncoding(doc, (const xmlChar *) encoding); 2859d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 2860d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding != NULL) { 2861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2862d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2864d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2866d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2867d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2868d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * Fallback to HTML or ASCII when the encoding is unspecified 2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 2871d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2872d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 2875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf = xmlAllocOutputBuffer(handler); 2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf == NULL) { 2878d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2879d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlOutputBufferFlush(buf); 2883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (buf->conv != NULL) { 2884d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->conv->use; 2885d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->conv->content; 2886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->conv->content = NULL; 2887d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = buf->buffer->use; 2889d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = buf->buffer->content; 2890d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf->buffer->content = NULL; 2891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (void) xmlOutputBufferClose(buf); 2893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2894656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 2895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2897d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 28991e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 29011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 29021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2903d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 29061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_file = NULL; 29071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard FILE *output; 29081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 29091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 29101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 29121e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 29131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 29141e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlOutputBufferPtr buf; 29151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 29161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node, 2918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &py_file, &encoding, &format)) 2919d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 29201e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 29211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 29221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2923d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 29241e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 29251e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 2926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 29271e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 29281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard output = PyFile_AsFile(py_file); 29291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (output == NULL) { 2930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 29311e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 29321e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 29331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 29351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2936d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 29371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2938d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 29391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2940656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 29411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2942d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding == NULL) 2943d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 29441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2945656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 29461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (encoding != NULL) { 2947d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2948d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2949d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 2950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 29511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 29521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2953d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2954d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2955d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2956d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 29571e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 29581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 29591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard buf = xmlOutputBufferCreateFile(output, handler); 29601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2961d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlSaveFormatFileTo(buf, doc, encoding, format); 2962656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 29631e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2964d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2965d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 29661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2967d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 2969656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 29701e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 29731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2974d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) len)); 29751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 2976a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 29771e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 29781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************ 29791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 2980a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * Extra stuff * 2981a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2982a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/ 2983a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject * 2984d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2985d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2986a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard PyObject *py_retval; 2987d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlChar *name; 2988a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard xmlNodePtr node; 2989a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name)) 2991d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2992a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard node = (xmlNodePtr) xmlNewNode(NULL, name); 29933b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG 2994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("NewNode: %s : %p\n", name, (void *) node); 29953b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif 2996a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2997a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard if (node == NULL) { 2998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 3000a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard } 3001a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard py_retval = libxml_xmlNodePtrWrap(node); 3002d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 3003a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard} 3004a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 30055439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30065439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************ 30075439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * * 30085439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * Local Catalog stuff * 30095439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * * 30105439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/ 30115439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject * 30125439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 30135439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{ 30145439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard xmlChar *URL; 30155439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard xmlParserCtxtPtr ctxt; 30165439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard PyObject *pyobj_ctxt; 30175439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30185439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL)) 30195439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return(NULL); 30205439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30215439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 30225439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30235439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard if (URL != NULL) { 30245439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL); 30255439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard } 30265439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30275439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG 30285439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard printf("LocalCatalog: %s\n", URL); 30295439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif 30305439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 30315439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard Py_INCREF(Py_None); 30325439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return (Py_None); 30335439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard} 30345439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 3035c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED 3036c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3037c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************ 3038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * * 3039c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration * 3040c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * * 3041c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/ 3042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3043c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct 3044c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3045c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *warn; 3046c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *error; 3047c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *arg; 3048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt; 3049c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr; 3050c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3051c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3052c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str) 3053c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3054c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *list; 3055c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *result; 3056c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3057c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3058c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 3059c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 3060c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3061c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3062c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx; 3063c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3064c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard list = PyTuple_New(2); 3065c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3066c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3067c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyCtxt->arg); 3068c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 3069c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (result == NULL) 3070c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3071c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3072c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyErr_Print(); 3073c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3074c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(list); 3075c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(result); 3076c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3077c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3078c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3079c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str) 3080c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3081c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *list; 3082c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *result; 3083c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3084c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3085c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 3086c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str); 3087c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3088c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3089c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx; 3090c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3091c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard list = PyTuple_New(2); 3092c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3093c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3094c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyCtxt->arg); 3095c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 3096c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (result == NULL) 3097c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3098c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3099c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyErr_Print(); 3100c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3101c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(list); 3102c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(result); 3103c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3104c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3105c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3106c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...) 3107c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3108c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_list ap; 3109c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3110c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_start(ap, msg); 3111c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3112c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_end(ap); 3113c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3114c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3115c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3116c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...) 3117c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3118c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_list ap; 3119c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3120c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_start(ap, msg); 3121c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3122c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_end(ap); 3123c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3124c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3125c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 3126c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3127c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3128c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *py_retval; 3129c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_error; 3130c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_warn; 3131c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_ctx; 3132c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_arg = Py_None; 3133c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPtr ctxt; 3134c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3135c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3136c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (!PyArg_ParseTuple 3137c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 3138c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return (NULL); 3139c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3140c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 3141c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 3142c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3143c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3144c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx); 3145c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1) 3146c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3147c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(-1); 3148c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(py_retval); 3149c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3150c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3151c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt == NULL) 3152c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3153c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* first time to set the error handlers */ 3154c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt)); 3155c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt == NULL) { 3156c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(-1); 3157c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(py_retval); 3158c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3159c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt)); 3160c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3161c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3162c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: check warn and error is a function ! */ 3163c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->error); 3164c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_error); 3165c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->error = pyobj_error; 3166c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3167c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->warn); 3168c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_warn); 3169c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->warn = pyobj_warn; 3170c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3171c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->arg); 3172c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_arg); 3173c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->arg = pyobj_arg; 3174c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3175c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt); 3176c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3177c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(1); 3178c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return (py_retval); 3179c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3180c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3181c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 3182c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 3183c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPtr ctxt; 3184c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3185c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_ctxt; 3186c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3187c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt)) 3188c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(NULL); 3189c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt); 3190c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3191c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0) 3192c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3193c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt != NULL) 3194c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3195c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->error); 3196c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->warn); 3197c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->arg); 3198c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlFree(pyCtxt); 3199c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3200c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3201c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3202c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGFreeValidCtxt(ctxt); 3203c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_INCREF(Py_None); 3204c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(Py_None); 3205c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3206c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3207259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef struct 3208259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3209259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *warn; 3210259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *error; 3211259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *arg; 3212259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} xmlSchemaValidCtxtPyCtxt; 3213259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef xmlSchemaValidCtxtPyCtxt *xmlSchemaValidCtxtPyCtxtPtr; 3214259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3215259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3216259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericErrorFuncHandler(void *ctx, char *str) 3217259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3218259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *list; 3219259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *result; 3220259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3221259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3222259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3223259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaValiditiyGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 3224259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3225259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3226259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx; 3227259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3228259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard list = PyTuple_New(2); 3229259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3230259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3231259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyCtxt->arg); 3232259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 3233259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (result == NULL) 3234259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3235259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3236259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyErr_Print(); 3237259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3238259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(list); 3239259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(result); 3240259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3241259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3242259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3243259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericWarningFuncHandler(void *ctx, char *str) 3244259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3245259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *list; 3246259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *result; 3247259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3248259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3249259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3250259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str); 3251259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3252259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3253259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx; 3254259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3255259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard list = PyTuple_New(2); 3256259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3257259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3258259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyCtxt->arg); 3259259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 3260259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (result == NULL) 3261259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3262259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3263259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyErr_Print(); 3264259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3265259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(list); 3266259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(result); 3267259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3268259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3269259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3270259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityErrorFunc(void *ctx, const char *msg, ...) 3271259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3272259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_list ap; 3273259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3274259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_start(ap, msg); 3275259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard libxml_xmlSchemaValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3276259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_end(ap); 3277259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3278259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3279259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3280259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityWarningFunc(void *ctx, const char *msg, ...) 3281259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3282259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_list ap; 3283259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3284259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_start(ap, msg); 3285259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard libxml_xmlSchemaValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3286259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_end(ap); 3287259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3288259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 32896ebf3c4c1a78406d15e8629b4a7b3d52549f0c8bDaniel VeillardPyObject * 3290259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3291259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3292259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *py_retval; 3293259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_error; 3294259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_warn; 3295259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_ctx; 3296259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_arg = Py_None; 3297259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPtr ctxt; 3298259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3299259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3300259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (!PyArg_ParseTuple 3301259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard (args, (char *) "OOO|O:xmlSchemaSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 3302259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return (NULL); 3303259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3304259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3305259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 3306259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3307259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3308259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard ctxt = PySchemaValidCtxt_Get(pyobj_ctx); 3309259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1) 3310259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3311259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(-1); 3312259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3313259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3314259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3315259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt == NULL) 3316259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3317259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* first time to set the error handlers */ 3318259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = xmlMalloc(sizeof(xmlSchemaValidCtxtPyCtxt)); 3319259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt == NULL) { 3320259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(-1); 3321259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3322259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3323259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard memset(pyCtxt, 0, sizeof(xmlSchemaValidCtxtPyCtxt)); 3324259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3325259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3326259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: check warn and error is a function ! */ 3327259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->error); 3328259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_error); 3329259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->error = pyobj_error; 3330259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3331259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->warn); 3332259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_warn); 3333259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->warn = pyobj_warn; 3334259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3335259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->arg); 3336259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_arg); 3337259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->arg = pyobj_arg; 3338259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3339259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaSetValidErrors(ctxt, &libxml_xmlSchemaValidityErrorFunc, &libxml_xmlSchemaValidityWarningFunc, pyCtxt); 3340259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3341259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(1); 3342259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3343259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3344259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3345bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject * 3346259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaFreeValidCtxt(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3347259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3348259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPtr ctxt; 3349259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3350259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_ctxt; 3351259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3352259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlSchemaFreeValidCtxt", &pyobj_ctxt)) 3353259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(NULL); 3354259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard ctxt = (xmlSchemaValidCtxtPtr) PySchemaValidCtxt_Get(pyobj_ctxt); 3355259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3356259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0) 3357259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3358259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt != NULL) 3359259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3360259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->error); 3361259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->warn); 3362259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->arg); 3363259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlFree(pyCtxt); 3364259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3365259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3366259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3367259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaFreeValidCtxt(ctxt); 3368259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_INCREF(Py_None); 3369259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(Py_None); 3370259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3371259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3372c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3373c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED 3375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard/************************************************************************ 3378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * * 3379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * XML Canonicalization c14n * 3380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * * 3381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ************************************************************************/ 3382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int 3384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPyxmlNodeSet_Convert(PyObject *py_nodeset, xmlNodeSetPtr *result) 3385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodeSet; 3387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int is_tuple = 0; 3388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (PyTuple_Check(py_nodeset)) 3390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 1; 3391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (PyList_Check(py_nodeset)) 3392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 0; 3393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (py_nodeset == Py_None) { 3394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = NULL; 3395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3397d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3398d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3399d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of nodes."); 3400d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3401d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3402d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3403d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3404d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodeSet == NULL) { 3405d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3406d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3407d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3408d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3409d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeNr = 0; 3410d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeMax = (is_tuple 3411d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_SIZE(py_nodeset) 3412d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_SIZE(py_nodeset)); 3413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeTab 3414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard = (xmlNodePtr *) xmlMalloc (nodeSet->nodeMax 3415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * sizeof(xmlNodePtr)); 3416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodeSet->nodeTab == NULL) { 3417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodeSet); 3418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard memset(nodeSet->nodeTab, 0 , 3422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeMax * sizeof(xmlNodePtr)); 3423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard { 3425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int idx; 3426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard for (idx=0; idx < nodeSet->nodeMax; ++idx) { 3427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodePtr pynode = 3428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyxmlNode_Get (is_tuple 3429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_ITEM(py_nodeset, idx) 3430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_ITEM(py_nodeset, idx)); 3431d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (pynode) 3432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeTab[nodeSet->nodeNr++] = pynode; 3433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = nodeSet; 3436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int 3440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPystringSet_Convert(PyObject *py_strings, xmlChar *** result) 3441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard /* NOTE: the array should be freed, but the strings are shared 3443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with the python strings and so must not be freed. */ 3444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3445d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** strings; 3446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int is_tuple = 0; 3447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int count; 3448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int init_index = 0; 3449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (PyTuple_Check(py_strings)) 3451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 1; 3452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (PyList_Check(py_strings)) 3453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 0; 3454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (py_strings == Py_None) { 3455d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = NULL; 3456d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3457d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3458d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3459d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3460d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of strings."); 3461d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3462d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3463d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3464d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard count = (is_tuple 3465d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_SIZE(py_strings) 3466d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_SIZE(py_strings)); 3467d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3468d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard strings = (xmlChar **) xmlMalloc(sizeof(xmlChar *) * count); 3469d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3470d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (strings == NULL) { 3471d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3472d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3473d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3474d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3475d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard memset(strings, 0 , sizeof(xmlChar *) * count); 3476d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3477d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard { 3478d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int idx; 3479d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard for (idx=0; idx < count; ++idx) { 3480d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard char* s = PyString_AsString 3481d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard (is_tuple 3482d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_ITEM(py_strings, idx) 3483d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_ITEM(py_strings, idx)); 3484d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (s) 3485d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard strings[init_index++] = (xmlChar *)s; 3486d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3487d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(strings); 3488d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3489d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of strings."); 3490d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3491d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3492d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3493d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3494d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3495d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = strings; 3496d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3497d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3498d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3499d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 3500d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * self, 3501d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject * args) 3502d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3503d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *py_retval = NULL; 3504d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_doc; 3506d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_nodes; 3507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int exclusive; 3508d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_prefixes; 3509d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int with_comments; 3510d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3511d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlDocPtr doc; 3512d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodes; 3513d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar **prefixes = NULL; 3514d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar *doc_txt; 3515d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3516d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int result; 3517d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3518d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOiOi:C14NDocDumpMemory", 3519d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_doc, 3520d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_nodes, 3521d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &exclusive, 3522d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_prefixes, 3523d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &with_comments)) 3524d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return (NULL); 3525d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc); 3527d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!doc) { 3528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad document."); 3529d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3530d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3531d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3532d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes); 3533d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) return NULL; 3534d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3535d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (exclusive) { 3536d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PystringSet_Convert(pyobj_prefixes, &prefixes); 3537d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3538d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3539d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3540d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3541d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3542d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3543d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3544d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3545d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3546d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = xmlC14NDocDumpMemory(doc, 3547d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 3548d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive, 3549d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 3550d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments, 3551d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &doc_txt); 3552d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3553d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3554d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3555d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3556d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3557d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (prefixes) { 3558d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** idx = prefixes; 3559d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard while (*idx) xmlFree(*(idx++)); 3560d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(prefixes); 3561d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3562d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3563d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3564d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_Exception, 3565d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "libxml2 xmlC14NDocDumpMemory failure."); 3566d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3567d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3568d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3569d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard py_retval = PyString_FromStringAndSize((const char *) doc_txt, 3570d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result); 3571d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(doc_txt); 3572d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return py_retval; 3573d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3574d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3575d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3576d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 3577d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self, 3578d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject * args) 3579d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3580d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_doc; 3581d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *py_file; 3582d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_nodes; 3583d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int exclusive; 3584d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_prefixes; 3585d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int with_comments; 3586d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3587d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlDocPtr doc; 3588d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodes; 3589d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar **prefixes = NULL; 3590d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard FILE * output; 3591d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlOutputBufferPtr buf; 3592d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3593d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int result; 3594d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int len; 3595d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3596d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOiOiO:C14NDocSaveTo", 3597d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_doc, 3598d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_nodes, 3599d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &exclusive, 3600d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_prefixes, 3601d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &with_comments, 3602d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &py_file)) 3603d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return (NULL); 3604d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3605d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc); 3606d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!doc) { 3607d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad document."); 3608d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3609d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3610d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3611d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 3612d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad file."); 3613d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3614d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3615d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard output = PyFile_AsFile(py_file); 3616d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (output == NULL) { 3617d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad file."); 3618d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3619d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3620d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard buf = xmlOutputBufferCreateFile(output, NULL); 3621d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3622d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes); 3623d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) return NULL; 3624d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3625d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (exclusive) { 3626d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PystringSet_Convert(pyobj_prefixes, &prefixes); 3627d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3628d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3629d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3630d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3631d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3632d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3633d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3634d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3635d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3636d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = xmlC14NDocSaveTo(doc, 3637d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 3638d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive, 3639d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 3640d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments, 3641d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard buf); 3642d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3643d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3644d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3645d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3646d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3647d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (prefixes) { 3648d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** idx = prefixes; 3649d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard while (*idx) xmlFree(*(idx++)); 3650d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(prefixes); 3651d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3652d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3653d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard len = xmlOutputBufferClose(buf); 3654d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3655d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3656d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_Exception, 3657d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "libxml2 xmlC14NDocSaveTo failure."); 3658d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3659d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3660d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else 3661d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return PyInt_FromLong((long) len); 3662d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3663d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3664d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3665d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3666d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3667c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brackstatic PyObject * 3668c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 3669c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack 3670c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack PyObject *obj; 3671c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack char *str; 3672d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3673c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj)) 3674c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack return NULL; 3675c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack str = PyCObject_GetDesc(obj); 3676c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack return Py_BuildValue((char *)"s", str); 3677c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack} 3678d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3679a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************ 3680a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 3681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 3682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 3683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 3684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 368596fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 3686d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "name", libxml_name, METH_VARARGS, NULL}, 3687d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "children", libxml_children, METH_VARARGS, NULL}, 3688d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "properties", libxml_properties, METH_VARARGS, NULL}, 3689d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "last", libxml_last, METH_VARARGS, NULL}, 3690d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "prev", libxml_prev, METH_VARARGS, NULL}, 3691d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "next", libxml_next, METH_VARARGS, NULL}, 3692d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "parent", libxml_parent, METH_VARARGS, NULL}, 3693d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "type", libxml_type, METH_VARARGS, NULL}, 3694d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "doc", libxml_doc, METH_VARARGS, NULL}, 3695d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL}, 3696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard {(char *) "xmlNodeRemoveNsDef", libxml_xmlNodeRemoveNsDef, METH_VARARGS, NULL}, 3697850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard {(char *)"xmlSetValidErrors", libxml_xmlSetValidErrors, METH_VARARGS, NULL}, 369825c90c589b256f0925f081198c1525134a491e31Daniel Veillard {(char *)"xmlFreeValidCtxt", libxml_xmlFreeValidCtxt, METH_VARARGS, NULL}, 3699a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3700d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL}, 3701d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL}, 3702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL}, 37036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL}, 37046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL}, 37056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL }, 3706263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard { (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL }, 3707263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard { (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL }, 3708a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 3709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL}, 3710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL}, 37113e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL }, 3712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL }, 3713417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL }, 3714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL }, 371526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL }, 371626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL }, 371726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL }, 37185439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL }, 3719c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED 3720c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL}, 3721c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL}, 3722eff45a92da861195551a2050487fcca0492cac7cDaniel Veillard {(char *)"xmlSchemaSetValidErrors", libxml_xmlSchemaSetValidErrors, METH_VARARGS, NULL}, 3723bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillard {(char *)"xmlSchemaFreeValidCtxt", libxml_xmlSchemaFreeValidCtxt, METH_VARARGS, NULL}, 3724c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3725d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED 3726d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3727d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard {(char *)"xmlC14NDocDumpMemory", libxml_C14NDocDumpMemory, METH_VARARGS, NULL}, 3728d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard {(char *)"xmlC14NDocSaveTo", libxml_C14NDocSaveTo, METH_VARARGS, NULL}, 3729d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3730d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3731c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL}, 3732d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {NULL, NULL, 0, NULL} 3733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 3734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 37350fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 37366361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void); 37370fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 37380fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard 3739d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid 3740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void) 3741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 3742af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard static int initialized = 0; 3743af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard 3744af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard if (initialized != 0) 3745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 37468e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 3747f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* intialize the python extension module */ 3748f93a866079364a006189683eaa07f94c867389d1Daniel Veillard Py_InitModule((char *) "libxml2mod", libxmlMethods); 3749f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 3750f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* initialize libxml2 */ 3751f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlInitParser(); 37525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 37536361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard 3754f93a866079364a006189683eaa07f94c867389d1Daniel Veillard initialized = 1; 3755f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 37560fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 37570fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard initlibxsltmod(); 37580fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 3759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 3760