libxml.c revision c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6
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> 26438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#include <libxml/xmlreader.h> 27da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard#include <libxml/xmlsave.h> 28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 2996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 30d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 310d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#if (defined(_MSC_VER) || defined(__MINGW32__)) && !defined(vsnprintf) 320d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) 33e306260f543aa4c47e8087b2eb013bb7586d801fKoop Mast#elif defined(WITH_TRIO) && !defined(vsnprintf) 34e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#include "trio.h" 35e4fa293265c935365717dc9accf6c6ec23d5f22fDaniel Veillard#define vsnprintf trio_vsnprintf 360d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard#endif 370d132cffc1733447f0fa9624f0265369a7f8c02aDaniel Veillard 38d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 39797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard/* #define DEBUG_SAX */ 40a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */ 415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */ 424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */ 43c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_FILES */ 44c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/* #define DEBUG_LOADER */ 454e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 46d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid initlibxml2mod(void); 47d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * TODO: 50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * macro to flag unimplemented blocks 52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#define TODO \ 54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlGenericError(xmlGenericErrorContext, \ 55c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard "Unimplemented block at %s:%d\n", \ 56c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard __FILE__, __LINE__); 578e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack/* 588e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * the following vars are used for XPath extensions, but 598e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * are also referenced within the parser cleanup routine. 608e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */ 618e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksInitialized = 0; 628e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 638e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef struct libxml_xpathCallback { 648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlXPathContextPtr ctx; 658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlChar *name; 668e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlChar *ns_uri; 678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack PyObject *function; 688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack} libxml_xpathCallback, *libxml_xpathCallbackPtr; 698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Bracktypedef libxml_xpathCallback libxml_xpathCallbackArray[]; 708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksAllocd = 10; 718e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic libxml_xpathCallbackArray *libxml_xpathCallbacks = NULL; 728e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brackstatic int libxml_xpathCallbacksNb = 0; 73c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************ 754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * Memory debug interface * 774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/ 794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 80c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#if 0 814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr); 824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size); 83d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardextern void *xmlMemRealloc(void *ptr, size_t size); 844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str); 85c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0; 884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0; 894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0; 914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL; 924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL; 934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL; 944e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL; 954e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 96f93a866079364a006189683eaa07f94c867389d1Daniel Veillardstatic void 97f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlErrorInitialize(void); /* forward declare */ 98f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 100c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlMemoryUsed(PyObject * self ATTRIBUTE_UNUSED, 101c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack PyObject * args ATTRIBUTE_UNUSED) 102529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard{ 103529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard long ret; 104529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard PyObject *py_retval; 105529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 106529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard ret = xmlMemUsed(); 107529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 108529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard py_retval = libxml_longWrap(ret); 109529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard return (py_retval); 110529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard} 111529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel Veillard 112529233ccdd43203fd74ec18a1d5a071c122c6e46Daniel VeillardPyObject * 113c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_xmlDebugMemory(PyObject * self ATTRIBUTE_UNUSED, PyObject * args) 114d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1154e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int activate; 1164e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *py_retval; 1174e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard long ret; 1184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "i:xmlDebugMemory", &activate)) 120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 1214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY 1234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_xmlDebugMemory(%d) called\n", activate); 1244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 1254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (activate != 0) { 127d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebug == 0) { 128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* 129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * First initialize the library and grab the old memory handlers 130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard * and switch the library to memory debugging 131d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard */ 132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemGet((xmlFreeFunc *) & freeFunc, 133d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlMallocFunc *) & mallocFunc, 134d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlReallocFunc *) & reallocFunc, 135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (xmlStrdupFunc *) & strdupFunc); 136d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) && 137d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (reallocFunc == xmlMemRealloc) && 138d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (strdupFunc == xmlMemoryStrdup)) { 139d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 140d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 141f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* 142f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * cleanup first, because some memory has been 143f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * allocated with the non-debug malloc in xmlInitParser 144f93a866079364a006189683eaa07f94c867389d1Daniel Veillard * when the python module was imported 145f93a866079364a006189683eaa07f94c867389d1Daniel Veillard */ 146f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlCleanupParser(); 147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc, 148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemRealloc, xmlMemoryStrdup); 149d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (ret < 0) 150d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto error; 151d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 152f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* reinitialize */ 153f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlInitParser(); 154f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxml_xmlErrorInitialize(); 155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 156d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (libxmlMemoryDebugActivated == 0) { 158d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 160d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 161d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 162d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 163d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebug = 1; 164d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 1; 1654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 166d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (libxmlMemoryDebugActivated == 1) 167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 168d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else 169d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ret = 0; 170d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxmlMemoryDebugActivated = 0; 1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 172d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard error: 1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard py_retval = libxml_longWrap(ret); 174d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 1764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 178f93a866079364a006189683eaa07f94c867389d1Daniel Veillardlibxml_xmlPythonCleanupParser(PyObject *self ATTRIBUTE_UNUSED, 179f93a866079364a006189683eaa07f94c867389d1Daniel Veillard PyObject *args ATTRIBUTE_UNUSED) { 180f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 1818e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack int ix; 1828e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack long freed = -1; 183f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 184f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryDebug) { 185f93a866079364a006189683eaa07f94c867389d1Daniel Veillard freed = xmlMemUsed(); 186f93a866079364a006189683eaa07f94c867389d1Daniel Veillard } 187f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 188f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlCleanupParser(); 1898e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack /* 1908e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * Need to confirm whether we really want to do this (required for 1918e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack * memcheck) in all cases... 1928e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack */ 1938e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 1948e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if (libxml_xpathCallbacks != NULL) { /* if ext funcs declared */ 1958e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack for (ix=0; ix<libxml_xpathCallbacksNb; ix++) { 1968e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((*libxml_xpathCallbacks)[ix].name != NULL) 1978e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree((*libxml_xpathCallbacks)[ix].name); 1988e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((*libxml_xpathCallbacks)[ix].ns_uri != NULL) 1998e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree((*libxml_xpathCallbacks)[ix].ns_uri); 2008e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 2018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksNb = 0; 2028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack xmlFree(libxml_xpathCallbacks); 2038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = NULL; 2048e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 205f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 206f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryDebug) { 207f93a866079364a006189683eaa07f94c867389d1Daniel Veillard freed -= xmlMemUsed(); 208f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxmlMemoryAllocatedBase -= freed; 209f93a866079364a006189683eaa07f94c867389d1Daniel Veillard if (libxmlMemoryAllocatedBase < 0) 210f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxmlMemoryAllocatedBase = 0; 211f93a866079364a006189683eaa07f94c867389d1Daniel Veillard } 212f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 213f93a866079364a006189683eaa07f94c867389d1Daniel Veillard Py_INCREF(Py_None); 214f93a866079364a006189683eaa07f94c867389d1Daniel Veillard return(Py_None); 215f93a866079364a006189683eaa07f94c867389d1Daniel Veillard} 216f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 217f93a866079364a006189683eaa07f94c867389d1Daniel VeillardPyObject * 218d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlDumpMemory(ATTRIBUTE_UNUSED PyObject * self, 219d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ATTRIBUTE_UNUSED PyObject * args) 220d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2214e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 2224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebug != 0) 223d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlMemoryDump(); 2244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard Py_INCREF(Py_None); 225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 230c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Handling Python FILE I/O at the C level * 231c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * The raw I/O attack diectly the File objects, while the * 232c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * other routines address the ioWrapper instance instead * 233c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 234c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 235c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 236c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 237c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileCloseUnref: 238c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 239c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 240c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 241c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 242c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 243c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileCloseRaw (void * context) { 244c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file, *ret; 245c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 246c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 247c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileCloseUnref\n"); 248c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 249c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 250c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 251118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "close", (char *) "()"); 252c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 253c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 254c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 255c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(file); 256c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 257c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 258c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 259c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 260c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileReadRaw: 261c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 262c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 263c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 264c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 265c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the Python file in the I/O channel 266c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 267c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 268c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 269c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 270c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileReadRaw (void * context, char * buffer, int len) { 271c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 272c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 273c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 274c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 275c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 276c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 277c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: %d\n", len); 278c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 279c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 280c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 281118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "read", (char *) "(i)", len); 282c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 283c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is NULL\n"); 284c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 285c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 286c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 287c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 288c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 289c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 290c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 291c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 292c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 293c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 294c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileReadRaw: result is not a String\n"); 295c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 296c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 297c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 298c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 299c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 300c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 301c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileRead: 302c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 303c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 304c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 305c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 306c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Read @len bytes to @buffer from the I/O channel. 307c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 308c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes read 309c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 310c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 311c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileRead (void * context, char * buffer, int len) { 312c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 313c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 314c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int lenread = -1; 315c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard char *data; 316c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 317c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 318c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: %d\n", len); 319c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 320c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 321c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 322118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard ret = PyEval_CallMethod(file, (char *) "io_read", (char *) "(i)", len); 323c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 324c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is NULL\n"); 325c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 326c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyString_Check(ret)) { 327c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard lenread = PyString_Size(ret); 328c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard data = PyString_AsString(ret); 329c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (lenread > len) 330c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, len); 331c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard else 332c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard memcpy(buffer, data, lenread); 333c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 334c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 335c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileRead: result is not a String\n"); 336c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 337c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 338c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(lenread); 339c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 340c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 341c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 342c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlFileWrite: 343c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 344c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @buffer: where to drop data 345c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @len: number of bytes to write 346c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 347c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Write @len bytes from @buffer to the I/O channel. 348c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 349c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the number of bytes written 350c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 351c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 352c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileWrite (void * context, const char * buffer, int len) { 353c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 354c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *string; 3556cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *ret = NULL; 356c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard int written = -1; 357c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 358c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 359c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: %d\n", len); 360c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 361c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 362c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 363c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard string = PyString_FromStringAndSize(buffer, len); 364c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (string == NULL) return(-1); 3656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (PyObject_HasAttrString(file, (char *) "io_write")) { 3666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "io_write", (char *) "(O)", 3676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard string); 3686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } else if (PyObject_HasAttrString(file, (char *) "write")) { 3696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "write", (char *) "(O)", 3706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard string); 3716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 372c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(string); 373c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret == NULL) { 374c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is NULL\n"); 375c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(-1); 376c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (PyInt_Check(ret)) { 377c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = (int) PyInt_AsLong(ret); 378c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 379c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else if (ret == Py_None) { 380c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard written = len; 381c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 382c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 383c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileWrite: result is not an Int nor None\n"); 384c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 385c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 386c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(written); 387c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 388c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 389c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 390c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlPythonFileClose: 391c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @context: the I/O context 392c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 393c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Close an I/O channel 394c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 395c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic int 396c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlPythonFileClose (void * context) { 3976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *file, *ret = NULL; 398c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 399c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_FILES 400c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("xmlPythonFileClose\n"); 401c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 402c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard file = (PyObject *) context; 403c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(-1); 4046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (PyObject_HasAttrString(file, (char *) "io_close")) { 4056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "io_close", (char *) "()"); 4066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } else if (PyObject_HasAttrString(file, (char *) "flush")) { 4076cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard ret = PyEval_CallMethod(file, (char *) "flush", (char *) "()"); 4086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 409c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 410c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 411c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 412c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(0); 413c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 414c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 415a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 416c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 417c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlOutputBufferCreatePythonFile: 418c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 419c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 420c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 421c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 422c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 423c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 424c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 425c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 426118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlOutputBufferPtr 427c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlOutputBufferCreatePythonFile(PyObject *file, 428c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr encoder) { 429c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr ret; 430c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 431c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 432c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 433c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocOutputBuffer(encoder); 434c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 435c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 436c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 437c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->writecallback = xmlPythonFileWrite; 438c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 439c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 440c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 441c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 442c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 443c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 444c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 445c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateOutputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 446c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 447c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 448c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 449c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 450c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlOutputBufferPtr buffer; 451c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 452c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 453c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlOutputBufferCreate", 454c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 455c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 456c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 457118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard handler = xmlFindCharEncodingHandler((const char *) encoding); 458c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 459c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlOutputBufferCreatePythonFile(file, handler); 460c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 461c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlCreateOutputBuffer: buffer == NULL\n"); 462c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlOutputBufferPtrWrap(buffer); 463c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 464c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 4656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard/** 4676cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * libxml_outputBufferGetPythonFile: 4686cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * @buffer: the I/O buffer 4696cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * 4706cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * read the Python I/O from the CObject 4716cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * 4726cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard * Returns the new parser output or NULL 4736cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard */ 4746cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardstatic PyObject * 4756cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_outputBufferGetPythonFile(ATTRIBUTE_UNUSED PyObject *self, 4766cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *args) { 4776cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *buffer; 4786cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *file; 4796cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr obj; 4806cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4816cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:outputBufferGetPythonFile", 4826cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard &buffer)) 4836cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 4846cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 4856cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard obj = PyoutputBuffer_Get(buffer); 4866cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (obj == NULL) { 4876cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard fprintf(stderr, 4886cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard "outputBufferGetPythonFile: obj == NULL\n"); 4896cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 4906cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 4916cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 4926cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (obj->closecallback != xmlPythonFileClose) { 4936cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard fprintf(stderr, 4946cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard "outputBufferGetPythonFile: not a python file wrapper\n"); 4956cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 4966cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 4976cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 4986cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard file = (PyObject *) obj->context; 4996cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (file == NULL) { 5006cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(Py_None); 5016cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(Py_None); 5026cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard } 5036cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard Py_INCREF(file); 5046cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(file); 5056cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 5066cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 5086cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferClose(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 5096cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *py_retval; 5106cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard int c_retval; 5116cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr out; 5126cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *pyobj_out; 5136cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5146cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferClose", &pyobj_out)) 5156cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 5166cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); 517263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* Buffer may already have been destroyed elsewhere. This is harmless. */ 518263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (out == NULL) { 519263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard Py_INCREF(Py_None); 520263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(Py_None); 521263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard } 5226cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5236cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard c_retval = xmlOutputBufferClose(out); 5246cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard py_retval = libxml_intWrap((int) c_retval); 5256cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(py_retval); 5266cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 5276cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 5296cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillardlibxml_xmlOutputBufferFlush(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 5306cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *py_retval; 5316cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard int c_retval; 5326cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard xmlOutputBufferPtr out; 5336cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard PyObject *pyobj_out; 5346cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5356cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlOutputBufferFlush", &pyobj_out)) 5366cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(NULL); 5376cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard out = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_out); 5386cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard 5396cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard c_retval = xmlOutputBufferFlush(out); 5406cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard py_retval = libxml_intWrap((int) c_retval); 5416cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard return(py_retval); 5426cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard} 543263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 544263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject * 545263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 546263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *py_retval; 547263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int c_retval; 548263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlOutputBufferPtr buf; 549263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_buf; 550263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlDocPtr cur; 551263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_cur; 552263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard char * encoding; 553263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 554263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOz:xmlSaveFileTo", &pyobj_buf, &pyobj_cur, &encoding)) 555263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(NULL); 556263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); 557263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); 558263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 559263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard c_retval = xmlSaveFileTo(buf, cur, encoding); 560263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* xmlSaveTo() freed the memory pointed to by buf, so record that in the 561263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard * Python object. */ 562263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; 563263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 564263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(py_retval); 565263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard} 566263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 567263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardstatic PyObject * 568263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillardlibxml_xmlSaveFormatFileTo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 569263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *py_retval; 570263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int c_retval; 571263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlOutputBufferPtr buf; 572263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_buf; 573263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard xmlDocPtr cur; 574263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard PyObject *pyobj_cur; 575263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard char * encoding; 576263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard int format; 577263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 578263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOzi:xmlSaveFormatFileTo", &pyobj_buf, &pyobj_cur, &encoding, &format)) 579263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(NULL); 580263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard buf = (xmlOutputBufferPtr) PyoutputBuffer_Get(pyobj_buf); 581263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard cur = (xmlDocPtr) PyxmlNode_Get(pyobj_cur); 582263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard 583263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard c_retval = xmlSaveFormatFileTo(buf, cur, encoding, format); 584263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard /* xmlSaveFormatFileTo() freed the memory pointed to by buf, so record that 585263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard * in the Python object */ 586263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard ((PyoutputBuffer_Object *)(pyobj_buf))->obj = NULL; 587263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 588263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard return(py_retval); 589263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard} 590a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 591c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 592c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 593c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/** 594c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * xmlParserInputBufferCreatePythonFile: 595c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @file: a PyFile_Type 596c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * @encoder: the encoding converter or NULL 597c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 598c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Create a buffered output for the progressive saving to a PyFile_Type 599c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * buffered C I/O 600c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * 601c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Returns the new parser output or NULL 602c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard */ 603118aed78f360f51d182770e62b251ef324707aa2Daniel Veillardstatic xmlParserInputBufferPtr 604c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardxmlParserInputBufferCreatePythonFile(PyObject *file, 605c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding encoding) { 606c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr ret; 607c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 608c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (file == NULL) return(NULL); 609c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 610c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = xmlAllocParserInputBuffer(encoding); 611c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 612c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->context = file; 613c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard /* Py_INCREF(file); */ 614c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->readcallback = xmlPythonFileRead; 615c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret->closecallback = xmlPythonFileClose; 616c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 617c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 618c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(ret); 619c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 620c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 621c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 622c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlCreateInputBuffer(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 623c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 624c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *file; 625c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlChar *encoding; 626c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlCharEncoding enc = XML_CHAR_ENCODING_NONE; 627c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buffer; 628c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 629c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 630c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Oz:xmlParserInputBufferCreate", 631c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &file, &encoding)) 632c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 633c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((encoding != NULL) && (encoding[0] != 0)) { 634118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard enc = xmlParseCharEncoding((const char *) encoding); 635c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 636c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buffer = xmlParserInputBufferCreatePythonFile(file, enc); 637c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buffer == NULL) 638c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlParserInputBufferCreate: buffer == NULL\n"); 639c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = libxml_xmlParserInputBufferPtrWrap(buffer); 640c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 641c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 642c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 643c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 644c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 645c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * Providing the resolver at the Python level * 646c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 647c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ************************************************************************/ 648c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 649c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlExternalEntityLoader defaultExternalEntityLoader = NULL; 650c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic PyObject *pythonExternalEntityLoaderObjext; 651c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 652c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardstatic xmlParserInputPtr 653c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardpythonExternalEntityLoader(const char *URL, const char *ID, 654c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserCtxtPtr ctxt) { 655c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputPtr result = NULL; 656c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (pythonExternalEntityLoaderObjext != NULL) { 657c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ret; 658c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *ctxtobj; 659c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 660c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ctxtobj = libxml_xmlParserCtxtPtrWrap(ctxt); 661c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 662c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: ready to call\n"); 663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 664c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 665c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ret = PyObject_CallFunction(pythonExternalEntityLoaderObjext, 666118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard (char *) "(ssO)", URL, ID, ctxtobj); 667e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard Py_XDECREF(ctxtobj); 668c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 669c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("pythonExternalEntityLoader: result "); 670007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard PyObject_Print(ret, stderr, 0); 671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("\n"); 672c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 673c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 674c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (ret != NULL) { 675118aed78f360f51d182770e62b251ef324707aa2Daniel Veillard if (PyObject_HasAttrString(ret, (char *) "read")) { 676c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlParserInputBufferPtr buf; 677c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 678c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf = xmlAllocParserInputBuffer(XML_CHAR_ENCODING_NONE); 679c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (buf != NULL) { 680c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->context = ret; 681c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->readcallback = xmlPythonFileReadRaw; 682c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard buf->closecallback = xmlPythonFileCloseRaw; 683c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = xmlNewIOInputStream(ctxt, buf, 684c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard XML_CHAR_ENCODING_NONE); 685c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 6864ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#if 0 687c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } else { 6884ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard if (URL != NULL) 6894ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard printf("pythonExternalEntityLoader: can't read %s\n", 6904ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard URL); 6914ea89f04ccd58de6cc4b83195252d0becba1fe69Daniel Veillard#endif 692c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 693c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (result == NULL) { 694c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard Py_DECREF(ret); 695c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard } else if (URL != NULL) { 696c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack result->filename = (char *) xmlStrdup((const xmlChar *)URL); 697c64b8e984c13a0d989dea436c13128b289a4d4d6Daniel Veillard result->directory = xmlParserGetDirectory((const char *) URL); 698c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 699c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 700c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 701c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if ((result == NULL) && (defaultExternalEntityLoader != NULL)) { 702c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard result = defaultExternalEntityLoader(URL, ID, ctxt); 703c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard } 704c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(result); 705c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 706c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 707c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel VeillardPyObject * 708c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardlibxml_xmlSetEntityLoader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 709c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *py_retval; 710c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard PyObject *loader; 711c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 712c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:libxml_xmlSetEntityLoader", 713c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard &loader)) 714c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(NULL); 715c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 716c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#ifdef DEBUG_LOADER 717c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard printf("libxml_xmlSetEntityLoader\n"); 718c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard#endif 719c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if (defaultExternalEntityLoader == NULL) 720c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard defaultExternalEntityLoader = xmlGetExternalEntityLoader(); 721c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 722c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard pythonExternalEntityLoaderObjext = loader; 723c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard xmlSetExternalEntityLoader(pythonExternalEntityLoader); 724c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 725c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard py_retval = PyInt_FromLong(0); 726c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard return(py_retval); 727c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard} 728c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 729c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 730c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard/************************************************************************ 731c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard * * 7323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 7351971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 73633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 73733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name, 73833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar ** attrs) 73933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 74033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int i; 74133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 74233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *dict; 74333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrname; 74433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrvalue; 745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 74633caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 74733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 748797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 749797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartElement(%s) called\n", name); 750797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 75133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 752d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startElement")) 75333caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 754d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "start")) 75533caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 75633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 75733caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 75833caa0b8307eccf22010400747830b1967edb292Daniel Veillard * the xmllib interface always generate a dictionnary, 75933caa0b8307eccf22010400747830b1967edb292Daniel Veillard * possibly empty 76033caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 76133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if ((attrs == NULL) && (type == 1)) { 76233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 76333caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = Py_None; 764d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (attrs == NULL) { 765d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard dict = PyDict_New(); 76633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 76733caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = PyDict_New(); 76833caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (i = 0; attrs[i] != NULL; i++) { 769d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrname = PyString_FromString((char *) attrs[i]); 77033caa0b8307eccf22010400747830b1967edb292Daniel Veillard i++; 77133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (attrs[i] != NULL) { 772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard attrvalue = PyString_FromString((char *) attrs[i]); 77333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 77433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 77533caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = Py_None; 77633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 77733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyDict_SetItem(dict, attrname, attrvalue); 778a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard Py_DECREF(attrname); 779a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard Py_DECREF(attrvalue); 78033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 78133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 78233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 78333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "startElement", 785d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 78633caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 787d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "start", 788d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sO", name, dict); 789d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 790d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 79133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(dict); 79233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 79333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 79433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 79533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 79633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 79733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data) 79833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 79933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 80033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 80133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 802797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 803797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonStartDocument() called\n"); 804797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 80533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 806d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "startDocument")) { 807d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 808d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "startDocument", NULL); 809d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 810d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 81133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 81233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 81333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 81433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 81533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 81633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data) 81733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 81833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 81933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 82033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 821797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 822797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndDocument() called\n"); 823797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 82433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 825d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endDocument")) { 826d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "endDocument", NULL); 828d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 829d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 83033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 83133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 83233caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 83333caa0b8307eccf22010400747830b1967edb292Daniel Veillard * The reference to the handler is released there 83433caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 83533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(handler); 83633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 83733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 83833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 83933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name) 84033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 84133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 84233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 84333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 844797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 845797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonEndElement(%s) called\n", name); 846797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 84733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 848d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "endElement")) { 849d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "endElement", 850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 851d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 852d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 85333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 854d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (PyObject_HasAttrString(handler, (char *) "end")) { 855d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "end", 856d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 858d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 859797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard Py_XDECREF(result); 86033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 86133caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 86233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 86333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 86433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name) 86533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 86633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 86733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 86833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 869797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 870797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonReference(%s) called\n", name); 871797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 87233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 873d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "reference")) { 874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "reference", 875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", name); 876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 87833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 87933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 88033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 88133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 88233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 88333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len) 88433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 88533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 886d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 88733caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 88833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 889797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 890797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCharacters(%s, %d) called\n", ch, len); 891797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 89233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 893d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "characters")) 894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 896d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 89733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "characters", 900d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 902d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "data", 903d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 904d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 905d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 90633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 90733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 90833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 90933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 91033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 91133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len) 91233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 91333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 91533caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 91633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 917797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 918797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonIgnorableWhitespace(%s, %d) called\n", ch, len); 919797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 92033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "ignorableWhitespace")) 92233caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 923d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "data")) 92433caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 92533caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 92633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 92733caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 928d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, 929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ignorableWhitespace", 930d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 93133caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 932d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 933d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "data", 934d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 93533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 93633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 93733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 93833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 93933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 94033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data, 94133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * target, const xmlChar * data) 94233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 94333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 94433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 94533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 946797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 947797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonProcessingInstruction(%s, %s) called\n", target, data); 948797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 94933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 950d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "processingInstruction")) { 951d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) 952d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard "processingInstruction", 953d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ss", target, data); 95433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 95533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 95633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 95733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 95833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 95933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value) 96033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 96133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 96233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 96333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 964797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 965797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonComment(%s) called\n", value); 966797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 96733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 968d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "comment")) { 969d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 970d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "comment", (char *) "s", 971d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard value); 972d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 973d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 97433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 97533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 97633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 97733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 97833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 97933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...) 98033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 98133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 98233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 98333caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 98433caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 98533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 986797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 987797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonWarning(%s) called\n", msg); 988797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 98933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 990d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "warning")) { 99133caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 99233caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 993d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 994d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 995d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 996d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "warning", (char *) "s", 997d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 998d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 999d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 100033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 100133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 100233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 100333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 100433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 100533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...) 100633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 100733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 100833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 100933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 101033caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 101133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1012797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1013797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonError(%s) called\n", msg); 1014797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 101533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1016d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "error")) { 101733caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 101833caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 1019d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 1020d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 1021d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1022d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "error", (char *) "s", 1023d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf); 1024d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1025d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 102633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 102733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 102833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 102933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 103033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 103133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...) 103233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 103333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 103433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 103533caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 103633caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 103733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1038797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1039797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonFatalError(%s) called\n", msg); 1040797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 104133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1042d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "fatalError")) { 104333caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 104433caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 1045d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(args); 1046d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard buf[1023] = 0; 1047d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1048d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "fatalError", 1049d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s", buf); 1050d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1051d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 105233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 105333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 105433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 105533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 105633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 105733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len) 105833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 105933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 1060d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject *result = NULL; 106133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 106233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1063797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1064797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonCdataBlock(%s, %d) called\n", ch, len); 1065797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 106633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1067d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "cdataBlock")) 1068d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 1; 1069d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (PyObject_HasAttrString(handler, (char *) "cdata")) 1070d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard type = 2; 107133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 1072d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (type == 1) 1073d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdataBlock", 1075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 1076d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard else if (type == 2) 1077d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1078d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "cdata", 1079d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "s#", ch, len); 1080d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1081d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 108233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 108333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 108433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 108533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 108633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 108733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data, 108833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 108933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * externalID, const xmlChar * systemID) 109033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 109133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 109233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 109333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1094797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1095797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonExternalSubset(%s, %s, %s) called\n", 1096d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, externalID, systemID); 1097797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 109833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "externalSubset")) { 110033caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 1101d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "externalSubset", 1102d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, externalID, 1103d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemID); 110433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 110533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 110633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 110733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 110833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 110933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data, 111033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 111133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 111233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 111333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, xmlChar * content) 111433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 111533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 111633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 111733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 111833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1119d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "entityDecl")) { 1120d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "entityDecl", 1121d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sisss", name, type, 1122d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard publicId, systemId, content); 1123d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1124d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 112533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 112633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 112733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 112833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 112933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 113033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 113133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 113233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 113333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data, 113433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 113533caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, const xmlChar * systemId) 113633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 113733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 113833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 113933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 114033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1141d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "notationDecl")) { 1142d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "notationDecl", 1143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, publicId, 1144d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard systemId); 1145d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1146d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 114733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 114833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 114933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 115033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 115133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 115233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data, 115333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * elem, 115433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 115533caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 115633caa0b8307eccf22010400747830b1967edb292Daniel Veillard int def, 1157d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * defaultValue, xmlEnumerationPtr tree) 115833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 115933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 116033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *nameList; 116133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *newName; 116233caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr node; 116333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 116433caa0b8307eccf22010400747830b1967edb292Daniel Veillard int count; 116533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 116633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1167d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "attributeDecl")) { 116833caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 116933caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 117033caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 117133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 117233caa0b8307eccf22010400747830b1967edb292Daniel Veillard nameList = PyList_New(count); 117333caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 117433caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 1175d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard newName = PyString_FromString((char *) node->name); 117633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyList_SetItem(nameList, count, newName); 1177a3d230513c3f28dc475ee09ffd6787762da07d56Daniel Veillard Py_DECREF(newName); 117833caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 117933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 1180d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "attributeDecl", 1181d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssiisO", elem, name, type, 1182d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard def, defaultValue, nameList); 1183d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1184d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 118533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(nameList); 118633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 118733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 118833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 118933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 119033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 119133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data, 119233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 1193d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int type, ATTRIBUTE_UNUSED xmlElementContentPtr content) 119433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 119533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 119633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *obj; 119733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 119833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 119933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "elementDecl")) { 1201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* TODO: wrap in an elementContent object */ 1202d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 1203d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("pythonElementDecl: xmlElementContentPtr wrapper missing !\n"); 1204d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = Py_None; 1205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */ 1206d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "elementDecl", 1207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "siO", name, type, obj); 1208d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1209d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 121033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 121133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 121233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 121333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 121433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 121533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data, 121633caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 121733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 121833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, 121933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * notationName) 122033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 122133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 122233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 122333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 122433caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1225d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "unparsedEntityDecl")) { 1226d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = 1227d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject_CallMethod(handler, (char *) "unparsedEntityDecl", 1228d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "ssss", name, publicId, systemId, 1229d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard notationName); 1230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1231d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 123233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 123333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 123433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 123533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 123633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 123733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name, 123833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * ExternalID, const xmlChar * SystemID) 123933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 124033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 124133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 124233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1243797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#ifdef DEBUG_SAX 1244797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard printf("pythonInternalSubset(%s, %s, %s) called\n", 1245d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name, ExternalID, SystemID); 1246797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard#endif 124733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 1248d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyObject_HasAttrString(handler, (char *) "internalSubset")) { 1249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyObject_CallMethod(handler, (char *) "internalSubset", 1250d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (char *) "sss", name, ExternalID, 1251d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SystemID); 1252d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (PyErr_Occurred()) 1253d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyErr_Print(); 125433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 125533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 125633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 125733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 125833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = { 125933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonInternalSubset, 1260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonIsStandalone, */ 1261d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasInternalSubset, */ 1262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonHasExternalSubset, */ 1263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonResolveEntity, */ 1264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetEntity, */ 126533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEntityDecl, 126633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonNotationDecl, 126733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonAttributeDecl, 126833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonElementDecl, 126933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonUnparsedEntityDecl, 1270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* OBSOLETED pythonSetDocumentLocator, */ 127133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartDocument, 127233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndDocument, 127333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartElement, 127433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndElement, 127533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonReference, 127633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCharacters, 127733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonIgnorableWhitespace, 127833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonProcessingInstruction, 127933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonComment, 128033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonWarning, 128133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonError, 128233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonFatalError, 1283d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard NULL, /* TODO pythonGetParameterEntity, */ 128433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCdataBlock, 128533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonExternalSubset, 1286a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard 1, 1287a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL, /* TODO mograte to SAX2 */ 1288a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL, 1289871611bb0325095b30559ff1edc1fdaa2ad5fd2fWilliam M. Brack NULL, 1290a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard NULL 129133caa0b8307eccf22010400747830b1967edb292Daniel Veillard}; 1292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 12933ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 12943ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 12953ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 12963ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 12973ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 12981971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 12991971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1300d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1301d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1302d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1303d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 13043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 1305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 130633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 13073ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 13083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 13093ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 13103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 1311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:xmlCreatePushParser", &pyobj_SAX, &chunk, 1313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 13168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13173ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 1318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 13191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 13203ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 1321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 13241971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 132533caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI); 13263ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1327d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1328a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 13295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 13304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1331d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlCreatePushParser(ATTRIBUTE_UNUSED PyObject * self, 1332d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1333d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1334656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 1335d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *chunk; 13364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 1337d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 133833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 13394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 13404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 13414e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 13424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1343d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1344d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Oziz:htmlCreatePushParser", &pyobj_SAX, &chunk, 1345d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &size, &URI)) 1346d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 13488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 1350d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, chunk, size, URI); 13514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 13524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 1353d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard SAX = &pythonSaxHandler; 1354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(pyobj_SAX); 1355d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard /* The reference is released in pythonEndDocument() */ 13564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 135733caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI, 1358d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard XML_CHAR_ENCODING_NONE); 13594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1360d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (pyret); 1361656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else 1362656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard Py_INCREF(Py_None); 1363656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard return (Py_None); 1364656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 13654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 13664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 13678d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 13708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard int recover; 1371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 13728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 13738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 13748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Osi:xmlSAXParseFile", &pyobj_SAX, 1376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &URI, &recover)) 1377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 13788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 13798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 13808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_xmlSAXParseFile(%p, %s, %d) called\n", 1381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, recover); 13828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 13838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1385d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 13868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 13878d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 13888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 13898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 1390f2531afe41a2232669302ceb49161d5689971ed9Daniel Veillard xmlSAXUserParseFile(SAX, pyobj_SAX, URI); 13918d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 13938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 13948d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 13958d24cc189845663509623fbd6b5106cc01266994Daniel VeillardPyObject * 1396d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_htmlSAXParseFile(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1397d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1398656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 1399d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *URI; 1400d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 14018d24cc189845663509623fbd6b5106cc01266994Daniel Veillard PyObject *pyobj_SAX = NULL; 14028d24cc189845663509623fbd6b5106cc01266994Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 14038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1404d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1405d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "Osz:htmlSAXParseFile", &pyobj_SAX, &URI, 1406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding)) 1407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 14088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 14098d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#ifdef DEBUG 14108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard printf("libxml_htmlSAXParseFile(%p, %s, %s) called\n", 1411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_SAX, URI, encoding); 14128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#endif 14138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard if (pyobj_SAX == Py_None) { 1414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 1415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 14168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard } 14178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard SAX = &pythonSaxHandler; 14188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(pyobj_SAX); 14198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard /* The reference is released in pythonEndDocument() */ 14208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard htmlSAXParseFile(URI, encoding, SAX, pyobj_SAX); 14218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard Py_INCREF(Py_None); 1422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 1423656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#else 1424656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard Py_INCREF(Py_None); 1425656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard return (Py_None); 1426656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 14278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard} 14288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 14295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 14305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 14315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 14325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 14335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 14345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 14365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 14375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1438e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/* helper to build a xmlMalloc'ed string from a format and va_list */ 1439ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard/* 1440ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * disabled the loop, the repeated call to vsnprintf without reset of ap 1441ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * in case the initial buffer was too small segfaulted on x86_64 1442ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard * we now directly vsnprintf on a large buffer. 1443ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard */ 1444e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic char * 1445e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_buildMessage(const char *msg, va_list ap) 1446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 1447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard int chars; 1448e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard char *str; 1449e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1450ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str = (char *) xmlMalloc(1000); 1451e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (str == NULL) 1452e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return NULL; 1453e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1454ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard chars = vsnprintf(str, 999, msg, ap); 1455ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard if (chars >= 998) 1456ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str[999] = 0; 1457e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1458e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return str; 1459e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1460e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1461e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardstatic void 1462e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardlibxml_xmlErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, const char *msg, 1463e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ...) 1464e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1465d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_list ap; 14665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 14675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 14685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 1469ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard char str[1000]; 14705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 14725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 14735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 14745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 1477d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_start(ap, msg); 1478007d51eb73cd5c78b676e13aae5bcfce83550a5dDaniel Veillard vfprintf(stderr, msg, ap); 1479d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard va_end(ap); 14805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 1481e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_start(ap, msg); 1482ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard if (vsnprintf(str, 999, msg, ap) >= 998) 1483ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard str[999] = 0; 1484e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard va_end(ap); 1485d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1486d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard list = PyTuple_New(2); 1487d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 1488d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 1489ad9fb7c06fea9cf63911c63cc9488ab1d0267005Daniel Veillard message = libxml_charPtrConstWrap(str); 1490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, 1, message); 1491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 1492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(list); 1493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(result); 14945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 14955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 14965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 14975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1498d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlErrorInitialize(void) 1499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 15005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 15015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 15025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 15035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 1504781ac8b19bfc10635a8bb83158f874116fd7559eDaniel Veillard xmlThrDefSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 15055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 15065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1507c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterErrorHandler(ATTRIBUTE_UNUSED PyObject * self, 1509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 1510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 15115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 15125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 15135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 15145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1515d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 1516d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OO:xmlRegisterErrorHandler", &pyobj_f, 1517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &pyobj_ctx)) 1518d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 15195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 15218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack printf("libxml_xmlRegisterErrorHandler(%p, %p) called\n", pyobj_ctx, 1522d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard pyobj_f); 15235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 15245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 1526d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 15275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 15285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 1529d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 15305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 15315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 15335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 15345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 15365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 15375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 15385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 15395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 1540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 15415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 1543e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1544e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard/************************************************************************ 1545e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1546e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * Per parserCtxt error handler * 1547e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard * * 1548e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ************************************************************************/ 1549e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1550417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef struct 1551417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1552417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *f; 1553417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *arg; 1554417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} xmlParserCtxtPyCtxt; 1555417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardtypedef xmlParserCtxtPyCtxt *xmlParserCtxtPyCtxtPtr; 1556417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1557417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1558417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGenericErrorFuncHandler(void *ctx, int severity, char *str) 1559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1560e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *list; 1561e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *result; 1562417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1563e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1564e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1565e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#ifdef DEBUG_ERROR 1566850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlParserCtxtGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 1567e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard#endif 1568e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1569417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr)ctx; 1570417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1571e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 1573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 1574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1575417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrWrap(str)); 1576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1577417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, Py_None); 1578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1579417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 1580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (result == NULL) 1581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard { 1582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 1583417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyErr_Print(); 1584e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1585417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(list); 1586417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(result); 1587417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtErrorFuncHandler(void *ctx, const char *msg, ...) 1591417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1592417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1593417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1594417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1595417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_ERROR,libxml_buildMessage(msg,ap)); 1596417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1597417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1598417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1599417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1600417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtWarningFuncHandler(void *ctx, const char *msg, ...) 1601417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1602417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1603417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1605417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_WARNING,libxml_buildMessage(msg,ap)); 1606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityErrorFuncHandler(void *ctx, const char *msg, ...) 1611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1615417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); 1616417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard} 1618417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardstatic void 1620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtValidityWarningFuncHandler(void *ctx, const char *msg, ...) 1621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard{ 1622417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_list ap; 1623417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1624417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_start(ap, msg); 1625417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml_xmlParserCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); 1626417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard va_end(ap); 1627e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1628e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1629c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1630417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1631e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1632e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *py_retval; 1633e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1634e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1635e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1636e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_f; 1637e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_arg; 1638e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1639417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlParserCtxtSetErrorHandler", 1640e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard &pyobj_ctxt, &pyobj_f, &pyobj_arg)) 1641e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1642e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1643e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (ctxt->_private == NULL) { 1644e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlParserCtxtPyCtxt)); 1645e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if (pyCtxt == NULL) { 1646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(-1); 1647e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1648e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1649e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard memset(pyCtxt,0,sizeof(xmlParserCtxtPyCtxt)); 1650e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt->_private = pyCtxt; 1651e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1652e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard else { 1653417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1654e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1655e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard /* TODO: check f is a function ! */ 1656417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1657e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_f); 1658417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->f = pyobj_f; 1659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1660e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard Py_XINCREF(pyobj_arg); 1661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt->arg = pyobj_arg; 1662e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyobj_f != Py_None) { 1664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = libxml_xmlParserCtxtErrorFuncHandler; 1665417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = libxml_xmlParserCtxtWarningFuncHandler; 1666417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = libxml_xmlParserCtxtValidityErrorFuncHandler; 1667417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = libxml_xmlParserCtxtValidityWarningFuncHandler; 1668417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1669417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1670417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->error = xmlParserError; 1671417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.error = xmlParserValidityError; 1672417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->sax->warning = xmlParserWarning; 1673417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt->vctxt.warning = xmlParserValidityWarning; 1674417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1675e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1676e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard py_retval = libxml_intWrap(1); 1677e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(py_retval); 1678e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1679e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1680c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1681417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlParserCtxtGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 1682e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard{ 1683417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *py_retval; 1684417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPtr ctxt; 1685e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1686417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyObject *pyobj_ctxt; 1687e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1688417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlParserCtxtGetErrorHandler", 1689417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard &pyobj_ctxt)) 1690417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(NULL); 1691417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1692417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard py_retval = PyTuple_New(2); 1693417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt->_private != NULL) { 1694417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)ctxt->_private; 1695e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1696417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 1697417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->f); 1698417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 1699417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(pyCtxt->arg); 1700417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard } 1701417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else { 1702417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* no python error handler registered */ 1703417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 1704417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1705417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 1706417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XINCREF(Py_None); 1707e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard } 1708417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(py_retval); 1709e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1710e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1711c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 1712417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillardlibxml_xmlFreeParserCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 1713e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard xmlParserCtxtPtr ctxt; 1714e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard PyObject *pyobj_ctxt; 1715417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlParserCtxtPyCtxtPtr pyCtxt; 1716e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1717417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeParserCtxt", &pyobj_ctxt)) 1718e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return(NULL); 1719e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 1720417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 1721417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (ctxt != NULL) { 1722417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard pyCtxt = (xmlParserCtxtPyCtxtPtr)((xmlParserCtxtPtr)ctxt)->_private; 1723417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if (pyCtxt) { 1724417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->f); 1725417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_XDECREF(pyCtxt->arg); 1726417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFree(pyCtxt); 1727e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1728417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlFreeParserCtxt(ctxt); 1729e4a07e7b77b191d61291d44dffa19b65387e04e4Daniel Veillard } 1730e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1731417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard Py_INCREF(Py_None); 1732417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return(Py_None); 1733e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard} 1734e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 1735850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard/*** 1736850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard * xmlValidCtxt stuff 1737850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard */ 1738850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1739850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef struct 1740850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1741850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *warn; 1742850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *error; 1743850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *arg; 1744850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} xmlValidCtxtPyCtxt; 1745850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardtypedef xmlValidCtxtPyCtxt *xmlValidCtxtPyCtxtPtr; 1746850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1747850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1748c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6Stefan Kostlibxml_xmlValidCtxtGenericErrorFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str) 1749850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1750850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *list; 1751850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *result; 1752850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1753850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1754850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1755850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlValidCtxtGenericErrorFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str); 1756850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1757850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1758850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; 1759850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1760850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard list = PyTuple_New(2); 1761850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 1762850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 1763850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyCtxt->arg); 1764850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 1765850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (result == NULL) 1766850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard { 1767850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: manage for the exception to be propagated... */ 1768850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyErr_Print(); 1769850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1770850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(list); 1771850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(result); 1772850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1773850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1774850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1775c31e06cc18ac5d876eb712dcd2d7e2cbe74832a6Stefan Kostlibxml_xmlValidCtxtGenericWarningFuncHandler(void *ctx, ATTRIBUTE_UNUSED int severity, char *str) 1776850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1777850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *list; 1778850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *result; 1779850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1780850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1781850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1782850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlValidCtxtGenericWarningFuncHandler(%p, %d, %s, ...) called\n", ctx, severity, str); 1783850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1784850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1785850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)ctx; 1786850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1787850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard list = PyTuple_New(2); 1788850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 1789850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 1790850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyCtxt->arg); 1791850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 1792850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (result == NULL) 1793850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard { 1794850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: manage for the exception to be propagated... */ 1795850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyErr_Print(); 1796850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1797850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(list); 1798850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(result); 1799850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1800850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1801850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1802850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtErrorFuncHandler(void *ctx, const char *msg, ...) 1803850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1804850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_list ap; 1805850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1806850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_start(ap, msg); 1807850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard libxml_xmlValidCtxtGenericErrorFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_ERROR,libxml_buildMessage(msg,ap)); 1808850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_end(ap); 1809850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1810850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1811850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic void 1812850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlValidCtxtWarningFuncHandler(void *ctx, const char *msg, ...) 1813850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1814850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_list ap; 1815850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1816850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_start(ap, msg); 1817850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard libxml_xmlValidCtxtGenericWarningFuncHandler(ctx,XML_PARSER_SEVERITY_VALIDITY_WARNING,libxml_buildMessage(msg,ap)); 1818850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard va_end(ap); 1819850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1820850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1821850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardstatic PyObject * 1822850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillardlibxml_xmlSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 1823850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard{ 1824850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *py_retval; 1825850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_error; 1826850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_warn; 1827850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_ctx; 1828850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard PyObject *pyobj_arg = Py_None; 1829850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPtr ctxt; 1830850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 1831850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1832850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (!PyArg_ParseTuple 1833850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard (args, (char *) "OOO|O:xmlSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 1834850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return (NULL); 1835850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1836850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#ifdef DEBUG_ERROR 1837850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard printf("libxml_xmlSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 1838850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard#endif 1839850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1840850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt = PyValidCtxt_Get(pyobj_ctx); 1841850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt = xmlMalloc(sizeof(xmlValidCtxtPyCtxt)); 1842850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard if (pyCtxt == NULL) { 1843850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard py_retval = libxml_intWrap(-1); 1844850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return(py_retval); 1845850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard } 1846850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard memset(pyCtxt, 0, sizeof(xmlValidCtxtPyCtxt)); 1847850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1848850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1849850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard /* TODO: check warn and error is a function ! */ 1850850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->error); 1851850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_error); 1852850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->error = pyobj_error; 1853850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1854850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->warn); 1855850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_warn); 1856850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->warn = pyobj_warn; 1857850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1858850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XDECREF(pyCtxt->arg); 1859850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard Py_XINCREF(pyobj_arg); 1860850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard pyCtxt->arg = pyobj_arg; 1861850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1862850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->error = libxml_xmlValidCtxtErrorFuncHandler; 1863850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->warning = libxml_xmlValidCtxtWarningFuncHandler; 1864850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard ctxt->userData = pyCtxt; 1865850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 1866850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard py_retval = libxml_intWrap(1); 1867850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard return (py_retval); 1868850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard} 1869850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard 187025c90c589b256f0925f081198c1525134a491e31Daniel Veillard 1871bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject * 187225c90c589b256f0925f081198c1525134a491e31Daniel Veillardlibxml_xmlFreeValidCtxt(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 187325c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlValidCtxtPtr cur; 187425c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlValidCtxtPyCtxtPtr pyCtxt; 187525c90c589b256f0925f081198c1525134a491e31Daniel Veillard PyObject *pyobj_cur; 187625c90c589b256f0925f081198c1525134a491e31Daniel Veillard 187725c90c589b256f0925f081198c1525134a491e31Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeValidCtxt", &pyobj_cur)) 187825c90c589b256f0925f081198c1525134a491e31Daniel Veillard return(NULL); 187925c90c589b256f0925f081198c1525134a491e31Daniel Veillard cur = (xmlValidCtxtPtr) PyValidCtxt_Get(pyobj_cur); 188025c90c589b256f0925f081198c1525134a491e31Daniel Veillard 188125c90c589b256f0925f081198c1525134a491e31Daniel Veillard pyCtxt = (xmlValidCtxtPyCtxtPtr)(cur->userData); 188225c90c589b256f0925f081198c1525134a491e31Daniel Veillard if (pyCtxt != NULL) 188325c90c589b256f0925f081198c1525134a491e31Daniel Veillard { 188425c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->error); 188525c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->warn); 188625c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_XDECREF(pyCtxt->arg); 188725c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlFree(pyCtxt); 188825c90c589b256f0925f081198c1525134a491e31Daniel Veillard } 188925c90c589b256f0925f081198c1525134a491e31Daniel Veillard 189025c90c589b256f0925f081198c1525134a491e31Daniel Veillard xmlFreeValidCtxt(cur); 189125c90c589b256f0925f081198c1525134a491e31Daniel Veillard Py_INCREF(Py_None); 189225c90c589b256f0925f081198c1525134a491e31Daniel Veillard return(Py_None); 189325c90c589b256f0925f081198c1525134a491e31Daniel Veillard} 189425c90c589b256f0925f081198c1525134a491e31Daniel Veillard 1895438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#ifdef LIBXML_READER_ENABLED 1896a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 1897a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 189826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * Per xmlTextReader error handler * 189926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 190026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard ************************************************************************/ 190126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 190226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef struct 190326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 190426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *f; 190526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *arg; 190626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} xmlTextReaderPyCtxt; 190726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardtypedef xmlTextReaderPyCtxt *xmlTextReaderPyCtxtPtr; 190826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 190926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardstatic void 191026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderErrorCallback(void *arg, 191126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard const char *msg, 1912417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard int severity, 1913417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard xmlTextReaderLocatorPtr locator) 191426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 191526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxt *pyCtxt = (xmlTextReaderPyCtxt *)arg; 191626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *list; 191726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *result; 191826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1919417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard list = PyTuple_New(4); 192026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 0, pyCtxt->arg); 192126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 192226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(list, 1, libxml_charPtrConstWrap(msg)); 1923417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 2, libxml_intWrap(severity)); 1924417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard PyTuple_SetItem(list, 3, libxml_xmlTextReaderLocatorPtrWrap(locator)); 192526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard result = PyEval_CallObject(pyCtxt->f, list); 192626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (result == NULL) 192726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 1928417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard /* TODO: manage for the exception to be propagated... */ 192926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyErr_Print(); 193026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 193126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(list); 193226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(result); 193326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 193426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1935c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 193626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderSetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 193726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 193826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 193926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 194026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 194126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 194226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 194326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_f; 194426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_arg; 194526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 194626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 194726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"OOO:xmlTextReaderSetErrorHandler", &pyobj_reader, &pyobj_f, &pyobj_arg)) 194826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 194926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 195026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* clear previous error handler */ 195126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 195226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 1953c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { 195426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 195526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 195626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 195726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 195826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 195926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 196026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else { 196126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 196226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there already an arg, and it's not ours, 196326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * there is definitely something wrong going on here... 196426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * we don't know how to free it, so we bail out... 196526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 196626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 196726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 196826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 196926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 197026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderSetErrorHandler(reader,NULL,NULL); 197126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* set new error handler */ 197226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyobj_f != Py_None) 197326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 197426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)xmlMalloc(sizeof(xmlTextReaderPyCtxt)); 197526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (pyCtxt == NULL) { 197626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(-1); 197726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 197826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 197926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_f); 198026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->f = pyobj_f; 198126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyobj_arg); 198226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt->arg = pyobj_arg; 1983c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlTextReaderSetErrorHandler(reader, 1984c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback, 1985c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt); 198626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 198726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 198826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = libxml_intWrap(1); 198926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 199026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 199126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 1992c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 199326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlTextReaderGetErrorHandler(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) 199426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard{ 199526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 199626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 199726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 199826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 199926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 200026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *py_retval; 200126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 200226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlTextReaderSetErrorHandler", &pyobj_reader)) 200326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(NULL); 200426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 200526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 200626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard py_retval = PyTuple_New(2); 2007c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc)libxml_xmlTextReaderErrorCallback) { 200826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 200926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 201026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, pyCtxt->f); 201126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->f); 201226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, pyCtxt->arg); 201326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(pyCtxt->arg); 201426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 201526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard else 201626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard { 201726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* f is null or it's not our error handler */ 201826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 0, Py_None); 201926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 202026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyTuple_SetItem(py_retval, 1, Py_None); 202126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XINCREF(Py_None); 202226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 202326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(py_retval); 202426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 202526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 2026c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 202726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardlibxml_xmlFreeTextReader(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 202826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPtr reader; 202926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard PyObject *pyobj_reader; 203026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderPyCtxtPtr pyCtxt; 203126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderErrorFunc f; 203226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard void *arg; 203326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 2034157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlFreeTextReader", &pyobj_reader)) 2035157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard return(NULL); 2036157fee019d02e1ba4ed377ea21172b67f479241bDaniel Veillard if (!PyCObject_Check(pyobj_reader)) { 2037bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard Py_INCREF(Py_None); 2038bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard return(Py_None); 2039bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard } 204026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard reader = (xmlTextReaderPtr) PyxmlTextReader_Get(pyobj_reader); 2041bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard if (reader == NULL) { 2042bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard Py_INCREF(Py_None); 2043bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard return(Py_None); 2044bb3ba326e6ba5b661ca51aab53b17f519eda5924Daniel Veillard } 204526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 204626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlTextReaderGetErrorHandler(reader,&f,&arg); 204726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if (arg != NULL) { 2048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (f == (xmlTextReaderErrorFunc) libxml_xmlTextReaderErrorCallback) { 204926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* ok, it's our error handler! */ 205026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard pyCtxt = (xmlTextReaderPyCtxtPtr)arg; 205126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->f); 205226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_XDECREF(pyCtxt->arg); 205326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFree(pyCtxt); 205426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 205526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard /* 205626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * else, something wrong happened, because the error handler is 205726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * not owned by the python bindings... 205826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard */ 205926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard } 206026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 206126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard xmlFreeTextReader(reader); 206226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard Py_INCREF(Py_None); 206326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard return(Py_None); 206426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard} 2065438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#endif 206626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 206726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard/************************************************************************ 206826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard * * 2069a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 2070a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 2071a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 2072a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2073a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 2074d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) 2075d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2076a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 2077a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 207870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard xmlXPathContextPtr rctxt; 207970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard PyObject *current_function = NULL; 208070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *name; 208170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard const xmlChar *ns_uri; 2082a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2083a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 208470cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (ctxt == NULL) 2085d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 208670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard rctxt = ctxt->context; 208770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (rctxt == NULL) 2088d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 208970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard name = rctxt->function; 209070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard ns_uri = rctxt->functionURI; 2091a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2092d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("libxml_xmlXPathFuncCallback called name %s URI %s\n", name, 2093d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ns_uri); 2094a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 2095a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 209670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 209770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * Find the function, it should be there it was there at lookup 209870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 2099d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 2100d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if ( /* TODO (ctxt == libxml_xpathCallbacks[i].ctx) && */ 21018e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 21028e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 21038e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack current_function = (*libxml_xpathCallbacks)[i].function; 2104d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 210570cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 210670cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard if (current_function == NULL) { 2107d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf 2108d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ("libxml_xmlXPathFuncCallback: internal error %s not found !\n", 2109d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard name); 2110d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 211170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard } 211270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard 2113c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard list = PyTuple_New(nargs + 1); 2114c575b997d85d4791d852ad43e175d47a64cf8b3cDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlXPathParserContextPtrWrap(ctxt)); 211505349ab2f6995d33f06932aa3cc62cf420ce0477Daniel Veillard for (i = nargs - 1; i >= 0; i--) { 2116d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard obj = valuePop(ctxt); 2117d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 2118d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyTuple_SetItem(list, i + 1, cur); 2119a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2120a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 2121a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 2122a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2123a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 2124a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 2125a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2126a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2127a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 2128d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar * name, 2129d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar * ns_uri) 2130d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2131a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2132d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2133a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2134a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 2135d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctxt, name, ns_uri); 2136a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 213770cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard /* 213870cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * This is called once only. The address is then stored in the 213970cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * XPath expression evaluation, the proper object to call can 214070cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * then still be found using the execution context function 214170cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard * and functionURI fields. 214270cab35abbb75eb9f0e328d498aa7a85195a1d5bDaniel Veillard */ 2143d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 21448e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((ctxt == (*libxml_xpathCallbacks)[i].ctx) && 21458e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 21468e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 2147d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (libxml_xmlXPathFuncCallback); 2148d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2149a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2150d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2151a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2152a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2153a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 2154d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xpathCallbacksInitialize(void) 2155d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2157a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2158a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 2159d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 2160a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2161a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2162a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 2163a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 21648e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlMalloc( 21658e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); 2166a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 21678e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack for (i = 0; i < libxml_xpathCallbacksAllocd; i++) { 21688e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ctx = NULL; 21698e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].name = NULL; 21708e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ns_uri = NULL; 21718e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = NULL; 2172a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2173a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 2174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 2177d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlRegisterXPathFunction(ATTRIBUTE_UNUSED PyObject * self, 2178d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard PyObject * args) 2179d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 2181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 2182a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 2183a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 2184a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 2185a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 2186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 2187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 2188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2189d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2190d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "OszO:registerXPathFunction", &pyobj_ctx, &name, 2191d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &ns_uri, &pyobj_f)) 2192d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2193a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2194a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 2195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 2196d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard libxml_xpathCallbacksInitialize(); 2197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 2198a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 2199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 2200d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard py_retval = libxml_intWrap(-1); 2201d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2202a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 2203a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 2204a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 2205d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard ctx, name, ns_uri); 2206a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 2207d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard for (i = 0; i < libxml_xpathCallbacksNb; i++) { 22088e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if ((ctx == (*libxml_xpathCallbacks)[i].ctx) && 22098e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(name, (*libxml_xpathCallbacks)[i].name)) && 22108e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (xmlStrEqual(ns_uri, (*libxml_xpathCallbacks)[i].ns_uri))) { 2211d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_XINCREF(pyobj_f); 22128e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack Py_XDECREF((*libxml_xpathCallbacks)[i].function); 22138e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = pyobj_f; 2214d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 2215d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard goto done; 2216d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2217a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 22188e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksAllocd) { 22198e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd+=10; 22208e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks = (libxml_xpathCallbackArray*)xmlRealloc( 22218e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacks, 22228e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack libxml_xpathCallbacksAllocd*sizeof(libxml_xpathCallback)); 22238e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack } 22248e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack i = libxml_xpathCallbacksNb++; 22258e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack Py_XINCREF(pyobj_f); 22268e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ctx = ctx; 22278e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].name = xmlStrdup(name); 22288e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].ns_uri = xmlStrdup(ns_uri); 22298e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack (*libxml_xpathCallbacks)[i].function = pyobj_f; 2230d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard c_retval = 1; 22318e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 2232d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard done: 2233a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 2234d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2235a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 2236a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 22371971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 22381971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 2239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 2240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 2241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 2242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2243d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_name(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 2248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2249d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:name", &obj)) 2250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2251d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2253d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 2255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2257d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2258d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2260d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2262d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE:{ 2263d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 2264d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2265d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = doc->URL; 2266d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2267d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2268d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2269d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2270d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2271d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->name; 2272d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2273d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2274d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 2275d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 2276d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2277d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = ns->prefix; 2278d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2279d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2280d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2281d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->name; 2282d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2283d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 22841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2285d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2286d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2287d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2288d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2289d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2290d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_doc(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2291d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2293d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2294d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 2295d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2296d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:doc", &obj)) 2297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2298d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2299d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2300d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 2302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2303d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2304d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2305d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2306d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2307d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2308d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2309d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2310d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2311d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2312d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2313d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2314d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2315d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->doc; 2316d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2317d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2318d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2319d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2320d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2321d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2322d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->doc; 2323d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 2326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2330d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_properties(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 23332728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard xmlNodePtr cur; 2334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 2335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2336d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:properties", &obj)) 2337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 23392728f845c5581af9213057ace8b3f664d64c15a9Daniel Veillard if ((cur != NULL) && (cur->type == XML_ELEMENT_NODE)) 2340d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->properties; 2341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 2342d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 2344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2348d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_next(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2354d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:next", &obj)) 2355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2356d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2358d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2359d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 2360d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2361d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2362d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2363d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2364d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2365d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2366d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2367d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2368d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2369d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2370d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2371d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2372d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2373d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) attr->next; 2374d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2375d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2376d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL:{ 2377d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 2378d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2379d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (xmlNodePtr) ns->next; 2380d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2381d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2382d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2383d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->next; 2384d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2385d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2392d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_prev(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2398d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:prev", &obj)) 2399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2400d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 2404d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2405d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2406d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2407d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2408d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2409d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2410d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2411d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2412d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2413d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2414d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2415d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2416d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2417faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = (xmlNodePtr) attr->prev; 2418d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2419594e5dfb48ee6fbac1b64155839063648022fc57Daniel Veillard break; 2420d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2421d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2422d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2423d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2424faa35ff3cdcf15154dd207606a31b34923da9be9Daniel Veillard res = cur->prev; 2425d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2432d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_children(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2438d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:children", &obj)) 2439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 2444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2446d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2447d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2448d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2449d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2450d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2451d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2452d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2454d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2456d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2457d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2458d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->children; 2459d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2460d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2461d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2462d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2463d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->children; 2464d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2465d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2466d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2467d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2468d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2475d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_last(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2481d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 2487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2489d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2490d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ELEMENT_NODE: 2491d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_REF_NODE: 2492d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_NODE: 2493d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_PI_NODE: 2494d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_COMMENT_NODE: 2495d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2497d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2499d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2500d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DTD_NODE: 2501d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->last; 2502d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2503d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2504d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2505d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2506d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->last; 2507d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 2508d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2509d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2510d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2517d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_parent(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 2522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2523d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:parent", &obj)) 2524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 2529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2531d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2532d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCUMENT_NODE: 2533d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_HTML_DOCUMENT_NODE: 2534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2535d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2537d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2538d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2539d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ATTRIBUTE_NODE:{ 2540d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 2541d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard 2542d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = attr->parent; 2543d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 254422eda2bc82acd047247df3f88aa9a5ab08d6a434Daniel Veillard break; 2545d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_ENTITY_DECL: 2546d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_NAMESPACE_DECL: 2547d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_START: 2548d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_XINCLUDE_END: 2549d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = NULL; 2550d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2551d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard default: 2552d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = cur->parent; 2553d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 2556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 2560d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_type(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 2562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 2563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 2564d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const xmlChar *res = NULL; 2565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2566d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:last", &obj)) 2567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 2568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 2569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 2572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2574d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard switch (cur->type) { 2575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 2576d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "element"; 2577d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 2579d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute"; 2580d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 2582d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "text"; 2583d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 2585d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "cdata"; 2586d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 2588d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_ref"; 2589d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 2591d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity"; 2592d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 2594d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "pi"; 2595d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 2597d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "comment"; 2598d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 2600d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_xml"; 2601d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 2603d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "doctype"; 2604d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 2606d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "fragment"; 2607d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 2609d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "notation"; 2610d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 2612d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_html"; 2613d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 2615d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "dtd"; 2616d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 2618d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "elem_decl"; 2619d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 2621d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "attribute_decl"; 2622d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 2624d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "entity_decl"; 2625d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 2627d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "namespace"; 2628d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 2630d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_start"; 2631d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 2633d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "xinclude_end"; 2634d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 2636d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard case XML_DOCB_DOCUMENT_NODE: 2637d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard res = (const xmlChar *) "document_docbook"; 2638d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard break; 2639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 2641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 2642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 2643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 2644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 26451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 2646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 2647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 2648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 2649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 2650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 265136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * Specific accessor functions * 265236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 265336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/ 265436eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNsDefs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2656d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 265736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 265836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 265936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 266036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 266136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple 2663d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard (args, (char *) "O:xmlNodeGetNsDefs", &pyobj_node)) 2664d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 266536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 266636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 266736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2668d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2669d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 267036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 267136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->nsDef; 267236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2673d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 267436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 267536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 267636eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 2677f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillardlibxml_xmlNodeRemoveNsDef(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2678f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard{ 2679f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard PyObject *py_retval; 2680f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNsPtr ns, prev; 2681f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNodePtr node; 2682f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard PyObject *pyobj_node; 2683f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlChar *href; 2684f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard xmlNsPtr c_retval; 2685f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2686f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (!PyArg_ParseTuple 2687f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard (args, (char *) "Oz:xmlNodeRemoveNsDef", &pyobj_node, &href)) 2688f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (NULL); 2689f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 2690f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = NULL; 2691f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2692f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 2693f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard Py_INCREF(Py_None); 2694f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (Py_None); 2695f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2696f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2697f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (href == NULL) { 2698f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = node->nsDef; 2699f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node->nsDef = NULL; 2700f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = 0; 2701f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2702f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard else { 2703f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev = NULL; 2704f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = node->nsDef; 2705f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard while (ns != NULL) { 2706f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (xmlStrEqual(ns->href, href)) { 2707f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if (prev != NULL) 2708f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev->next = ns->next; 2709f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard else 2710f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard node->nsDef = ns->next; 2711f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns->next = NULL; 2712f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = 0; 2713f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard break; 2714f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2715f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard prev = ns; 2716f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ns = ns->next; 2717f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2718f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard } 2719f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2720f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard c_retval = ns; 2721f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2722f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return (py_retval); 2723f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard} 2724f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 2725f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel VeillardPyObject * 2726d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNodeGetNs(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2727d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 272836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 272936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 273036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 273136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 273236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2733d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "O:xmlNodeGetNs", &pyobj_node)) 2734d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 273536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 273636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2737e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard if ((node == NULL) || 2738e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard ((node->type != XML_ELEMENT_NODE) && 2739e96a2a4bf040ec93f83d9c33f8ae4ac3f1e512e9Daniel Veillard (node->type != XML_ATTRIBUTE_NODE))) { 2740d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2741d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 274236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 274336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->ns; 274436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 2745d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 274636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 274736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 2748a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 274936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************ 275036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 27511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * Serialization front-end * 27521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 27531e77438da7dd912885effa97b1079867d1e041beDaniel Veillard ************************************************************************/ 27541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2755d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2756d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_serializeNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2757d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 27581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_retval = NULL; 27591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlChar *c_retval; 27601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 27611e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 27621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2763d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 27641e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 27651e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 2766da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlSaveCtxtPtr ctxt; 2767da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlBufferPtr buf; 2768da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard int options = 0; 27691e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2770d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "Ozi:serializeNode", &pyobj_node, 2771d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &encoding, &format)) 2772d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 27731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 27741e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 27751e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2776d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2777d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 27781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 27791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2780d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2781da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard node = NULL; 2782656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 27831e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2784d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 2785da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard node = NULL; 2786da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard#endif 27871e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 278895af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack if (node->type == XML_NAMESPACE_DECL) 278995af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack doc = NULL; 279095af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack else 279195af594b0bd28ad8847de96ec00ff9244bd94da7William M. Brack doc = node->doc; 2792a8c0adbc395e48f0a65ccbd6c4931525380cf55cDaniel Veillard if ((doc == NULL) || (doc->type == XML_DOCUMENT_NODE)) { 2793656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 2794d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2795656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 2796d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } else { 2797d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2798d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2799d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 28001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2801da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard 2802da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard 2803da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard buf = xmlBufferCreate(); 2804da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard if (buf == NULL) { 2805da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard Py_INCREF(Py_None); 2806da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard return (Py_None); 2807da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard } 2808da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard if (format) options |= XML_SAVE_FORMAT; 2809da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard ctxt = xmlSaveToBuffer(buf, encoding, options); 2810da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard if (ctxt == NULL) { 2811da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlBufferFree(buf); 2812da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard Py_INCREF(Py_None); 2813da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard return (Py_None); 2814da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard } 2815da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard if (node == NULL) 2816da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlSaveDoc(ctxt, doc); 2817da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard else 2818da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlSaveTree(ctxt, node); 2819da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlSaveClose(ctxt); 2820da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard 2821da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard c_retval = buf->content; 2822da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard buf->content = NULL; 2823da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard 2824da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard xmlBufferFree(buf); 2825da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard py_retval = libxml_charPtrWrap((char *) c_retval); 2826da3fee406da96c344d7b5f4e0631faee74f7e11dDaniel Veillard 2827d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 28281e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 28291e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2830d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardstatic PyObject * 2831d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_saveNodeTo(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2832d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 28331e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *py_file = NULL; 28341e77438da7dd912885effa97b1079867d1e041beDaniel Veillard FILE *output; 28351e77438da7dd912885effa97b1079867d1e041beDaniel Veillard PyObject *pyobj_node; 28361e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlNodePtr node; 28371e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlDocPtr doc; 2838d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard const char *encoding; 28391e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int format; 28401e77438da7dd912885effa97b1079867d1e041beDaniel Veillard int len; 28411e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlOutputBufferPtr buf; 28421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard xmlCharEncodingHandlerPtr handler = NULL; 28431e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 2844d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOzi:serializeNode", &pyobj_node, 2845d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard &py_file, &encoding, &format)) 2846d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 28471e77438da7dd912885effa97b1079867d1e041beDaniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 28481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 28491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node == NULL) { 2850d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 28511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 28521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 2853d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 28541e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 28551e77438da7dd912885effa97b1079867d1e041beDaniel Veillard output = PyFile_AsFile(py_file); 28561e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (output == NULL) { 2857d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 28581e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 28591e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 28601e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2861d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 28621e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2863d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = (xmlDocPtr) node; 28641e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2865d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard doc = node->doc; 28661e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2867656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 28681e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2869d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (encoding == NULL) 2870d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard encoding = (const char *) htmlGetMetaEncoding(doc); 28711e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2872656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 28731e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (encoding != NULL) { 2874d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler(encoding); 2875d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) { 2876d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) -1)); 2877d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard } 28781e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 28791e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (doc->type == XML_HTML_DOCUMENT_NODE) { 2880d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2881d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("HTML"); 2882d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (handler == NULL) 2883d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard handler = xmlFindCharEncodingHandler("ascii"); 28841e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 28851e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 28861e77438da7dd912885effa97b1079867d1e041beDaniel Veillard buf = xmlOutputBufferCreateFile(output, handler); 28871e77438da7dd912885effa97b1079867d1e041beDaniel Veillard if (node->type == XML_DOCUMENT_NODE) { 2888d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlSaveFormatFileTo(buf, doc, encoding, format); 2889656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#ifdef LIBXML_HTML_ENABLED 28901e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (node->type == XML_HTML_DOCUMENT_NODE) { 2891d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlDocContentDumpFormatOutput(buf, doc, encoding, format); 2892d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 28931e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else if (doc->type == XML_HTML_DOCUMENT_NODE) { 2894d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard htmlNodeDumpFormatOutput(buf, doc, node, encoding, format); 2895d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 2896656ce948ab664ce96298c5f419a03a7ffcc88d9dDaniel Veillard#endif /* LIBXML_HTML_ENABLED */ 28971e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } else { 2898d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlNodeDumpOutput(buf, doc, node, 0, format, encoding); 2899d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard len = xmlOutputBufferClose(buf); 29001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard } 2901d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (PyInt_FromLong((long) len)); 29021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard} 2903a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 29041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 29051e77438da7dd912885effa97b1079867d1e041beDaniel Veillard/************************************************************************ 29061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard * * 2907a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * Extra stuff * 2908a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 2909a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard ************************************************************************/ 2910a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel VeillardPyObject * 2911d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardlibxml_xmlNewNode(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 2912d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 2913a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard PyObject *py_retval; 2914d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard xmlChar *name; 2915a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard xmlNodePtr node; 2916a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2917d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "s:xmlNewNode", &name)) 2918d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (NULL); 2919a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard node = (xmlNodePtr) xmlNewNode(NULL, name); 29203b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#ifdef DEBUG 2921d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard printf("NewNode: %s : %p\n", name, (void *) node); 29223b2e4e1c1477e9eb0889a8c9d35da4ce36a2e3f1Daniel Veillard#endif 2923a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 2924a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard if (node == NULL) { 2925d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard Py_INCREF(Py_None); 2926d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (Py_None); 2927a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard } 2928a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard py_retval = libxml_xmlNodePtrWrap(node); 2929d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return (py_retval); 2930a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard} 2931a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard 29325439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29335439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard/************************************************************************ 29345439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * * 29355439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * Local Catalog stuff * 29365439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard * * 29375439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ************************************************************************/ 29385439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardstatic PyObject * 29395439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillardlibxml_addLocalCatalog(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 29405439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard{ 29415439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard xmlChar *URL; 29425439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard xmlParserCtxtPtr ctxt; 29435439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard PyObject *pyobj_ctxt; 29445439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29455439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"Os:addLocalCatalog", &pyobj_ctxt, &URL)) 29465439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return(NULL); 29475439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29485439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ctxt = (xmlParserCtxtPtr) PyparserCtxt_Get(pyobj_ctxt); 29495439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29505439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard if (URL != NULL) { 29515439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard ctxt->catalogs = xmlCatalogAddLocal(ctxt->catalogs, URL); 29525439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard } 29535439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29545439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#ifdef DEBUG 29555439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard printf("LocalCatalog: %s\n", URL); 29565439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard#endif 29575439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 29585439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard Py_INCREF(Py_None); 29595439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return (Py_None); 29605439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard} 29615439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 2962c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED 2963c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2964c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard/************************************************************************ 2965c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * * 2966c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * RelaxNG error handler registration * 2967c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard * * 2968c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ************************************************************************/ 2969c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2970c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef struct 2971c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 2972c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *warn; 2973c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *error; 2974c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *arg; 2975c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} xmlRelaxNGValidCtxtPyCtxt; 2976c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardtypedef xmlRelaxNGValidCtxtPyCtxt *xmlRelaxNGValidCtxtPyCtxtPtr; 2977c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2978c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 2979c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericErrorFuncHandler(void *ctx, char *str) 2980c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 2981c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *list; 2982c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *result; 2983c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 2984c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2985c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 2986c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGValidityGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 2987c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 2988c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2989c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx; 2990c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 2991c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard list = PyTuple_New(2); 2992c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 2993c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 2994c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyCtxt->arg); 2995c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 2996c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (result == NULL) 2997c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 2998c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: manage for the exception to be propagated... */ 2999c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyErr_Print(); 3000c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3001c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(list); 3002c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(result); 3003c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3004c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3005c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3006c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityGenericWarningFuncHandler(void *ctx, char *str) 3007c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3008c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *list; 3009c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *result; 3010c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3011c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3012c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 3013c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str); 3014c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3015c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3016c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = (xmlRelaxNGValidCtxtPyCtxtPtr)ctx; 3017c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3018c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard list = PyTuple_New(2); 3019c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3020c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3021c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyCtxt->arg); 3022c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 3023c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (result == NULL) 3024c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3025c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3026c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyErr_Print(); 3027c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3028c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(list); 3029c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(result); 3030c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3031c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3032c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3033c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityErrorFunc(void *ctx, const char *msg, ...) 3034c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3035c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_list ap; 3036c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3037c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_start(ap, msg); 3038c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard libxml_xmlRelaxNGValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3039c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_end(ap); 3040c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3041c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3042c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic void 3043c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGValidityWarningFunc(void *ctx, const char *msg, ...) 3044c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3045c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_list ap; 3046c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3047c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_start(ap, msg); 3048c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard libxml_xmlRelaxNGValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3049c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard va_end(ap); 3050c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3051c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3052c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 3053c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3054c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard{ 3055c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *py_retval; 3056c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_error; 3057c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_warn; 3058c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_ctx; 3059c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_arg = Py_None; 3060c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPtr ctxt; 3061c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3062c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3063c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (!PyArg_ParseTuple 3064c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard (args, (char *) "OOO|O:xmlRelaxNGSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 3065c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return (NULL); 3066c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3067c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef DEBUG_ERROR 3068c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard printf("libxml_xmlRelaxNGSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 3069c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3070c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3071c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ctxt = PyrelaxNgValidCtxt_Get(pyobj_ctx); 3072c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1) 3073c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3074c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(-1); 3075c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(py_retval); 3076c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3077c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3078c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt == NULL) 3079c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3080c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* first time to set the error handlers */ 3081c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt = xmlMalloc(sizeof(xmlRelaxNGValidCtxtPyCtxt)); 3082c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt == NULL) { 3083c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(-1); 3084c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(py_retval); 3085c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3086c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard memset(pyCtxt, 0, sizeof(xmlRelaxNGValidCtxtPyCtxt)); 3087c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3088c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3089c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard /* TODO: check warn and error is a function ! */ 3090c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->error); 3091c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_error); 3092c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->error = pyobj_error; 3093c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3094c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->warn); 3095c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_warn); 3096c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->warn = pyobj_warn; 3097c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3098c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->arg); 3099c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XINCREF(pyobj_arg); 3100c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard pyCtxt->arg = pyobj_arg; 3101c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3102c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGSetValidErrors(ctxt, &libxml_xmlRelaxNGValidityErrorFunc, &libxml_xmlRelaxNGValidityWarningFunc, pyCtxt); 3103c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3104c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard py_retval = libxml_intWrap(1); 3105c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return (py_retval); 3106c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3107c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3108c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardstatic PyObject * 3109c2664641740126714bb363bd6b5f65f724031c83Daniel Veillardlibxml_xmlRelaxNGFreeValidCtxt(ATTRIBUTE_UNUSED PyObject *self, PyObject *args) { 3110c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPtr ctxt; 3111c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGValidCtxtPyCtxtPtr pyCtxt; 3112c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard PyObject *pyobj_ctxt; 3113c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3114c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlRelaxNGFreeValidCtxt", &pyobj_ctxt)) 3115c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(NULL); 3116c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard ctxt = (xmlRelaxNGValidCtxtPtr) PyrelaxNgValidCtxt_Get(pyobj_ctxt); 3117c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3118c193956ee1c3b229556301cf09f6ff1b6eb9cb70William M. Brack if (xmlRelaxNGGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0) 3119c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3120c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard if (pyCtxt != NULL) 3121c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard { 3122c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->error); 3123c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->warn); 3124c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_XDECREF(pyCtxt->arg); 3125c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlFree(pyCtxt); 3126c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3127c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard } 3128c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3129c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard xmlRelaxNGFreeValidCtxt(ctxt); 3130c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard Py_INCREF(Py_None); 3131c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard return(Py_None); 3132c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard} 3133c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3134259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef struct 3135259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3136259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *warn; 3137259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *error; 3138259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *arg; 3139259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} xmlSchemaValidCtxtPyCtxt; 3140259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardtypedef xmlSchemaValidCtxtPyCtxt *xmlSchemaValidCtxtPyCtxtPtr; 3141259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3142259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3143259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericErrorFuncHandler(void *ctx, char *str) 3144259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3145259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *list; 3146259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *result; 3147259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3148259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3149259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3150259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaValiditiyGenericErrorFuncHandler(%p, %s, ...) called\n", ctx, str); 3151259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3152259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3153259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx; 3154259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3155259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard list = PyTuple_New(2); 3156259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3157259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3158259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyCtxt->arg); 3159259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard result = PyEval_CallObject(pyCtxt->error, list); 3160259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (result == NULL) 3161259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3162259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3163259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyErr_Print(); 3164259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3165259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(list); 3166259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(result); 3167259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3168259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3169259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3170259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityGenericWarningFuncHandler(void *ctx, char *str) 3171259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3172259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *list; 3173259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *result; 3174259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3175259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3176259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3177259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaValidityGenericWarningFuncHandler(%p, %s, ...) called\n", ctx, str); 3178259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3179259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3180259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = (xmlSchemaValidCtxtPyCtxtPtr) ctx; 3181259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3182259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard list = PyTuple_New(2); 3183259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 0, libxml_charPtrWrap(str)); 3184259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyTuple_SetItem(list, 1, pyCtxt->arg); 3185259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyCtxt->arg); 3186259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard result = PyEval_CallObject(pyCtxt->warn, list); 3187259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (result == NULL) 3188259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3189259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: manage for the exception to be propagated... */ 3190259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyErr_Print(); 3191259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3192259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(list); 3193259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(result); 3194259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3195259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3196259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3197259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityErrorFunc(void *ctx, const char *msg, ...) 3198259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3199259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_list ap; 3200259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3201259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_start(ap, msg); 3202259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard libxml_xmlSchemaValidityGenericErrorFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3203259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_end(ap); 3204259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3205259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3206259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardstatic void 3207259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaValidityWarningFunc(void *ctx, const char *msg, ...) 3208259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3209259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_list ap; 3210259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3211259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_start(ap, msg); 3212259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard libxml_xmlSchemaValidityGenericWarningFuncHandler(ctx, libxml_buildMessage(msg, ap)); 3213259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard va_end(ap); 3214259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3215259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 32166ebf3c4c1a78406d15e8629b4a7b3d52549f0c8bDaniel VeillardPyObject * 3217259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaSetValidErrors(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3218259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3219259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *py_retval; 3220259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_error; 3221259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_warn; 3222259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_ctx; 3223259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_arg = Py_None; 3224259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPtr ctxt; 3225259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3226259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3227259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (!PyArg_ParseTuple 3228259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard (args, (char *) "OOO|O:xmlSchemaSetValidErrors", &pyobj_ctx, &pyobj_error, &pyobj_warn, &pyobj_arg)) 3229259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return (NULL); 3230259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3231259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#ifdef DEBUG_ERROR 3232259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard printf("libxml_xmlSchemaSetValidErrors(%p, %p, %p) called\n", pyobj_ctx, pyobj_error, pyobj_warn); 3233259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard#endif 3234259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3235259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard ctxt = PySchemaValidCtxt_Get(pyobj_ctx); 3236259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == -1) 3237259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3238259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(-1); 3239259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3240259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3241259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3242259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt == NULL) 3243259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3244259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* first time to set the error handlers */ 3245259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt = xmlMalloc(sizeof(xmlSchemaValidCtxtPyCtxt)); 3246259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt == NULL) { 3247259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(-1); 3248259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3249259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3250259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard memset(pyCtxt, 0, sizeof(xmlSchemaValidCtxtPyCtxt)); 3251259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3252259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3253259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard /* TODO: check warn and error is a function ! */ 3254259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->error); 3255259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_error); 3256259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->error = pyobj_error; 3257259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3258259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->warn); 3259259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_warn); 3260259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->warn = pyobj_warn; 3261259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3262259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->arg); 3263259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XINCREF(pyobj_arg); 3264259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard pyCtxt->arg = pyobj_arg; 3265259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3266259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaSetValidErrors(ctxt, &libxml_xmlSchemaValidityErrorFunc, &libxml_xmlSchemaValidityWarningFunc, pyCtxt); 3267259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3268259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard py_retval = libxml_intWrap(1); 3269259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(py_retval); 3270259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3271259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3272bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillardstatic PyObject * 3273259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillardlibxml_xmlSchemaFreeValidCtxt(ATTRIBUTE_UNUSED PyObject * self, PyObject * args) 3274259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard{ 3275259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPtr ctxt; 3276259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaValidCtxtPyCtxtPtr pyCtxt; 3277259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard PyObject *pyobj_ctxt; 3278259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3279259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (!PyArg_ParseTuple(args, (char *)"O:xmlSchemaFreeValidCtxt", &pyobj_ctxt)) 3280259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(NULL); 3281259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard ctxt = (xmlSchemaValidCtxtPtr) PySchemaValidCtxt_Get(pyobj_ctxt); 3282259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3283259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (xmlSchemaGetValidErrors(ctxt, NULL, NULL, (void **) &pyCtxt) == 0) 3284259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3285259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard if (pyCtxt != NULL) 3286259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard { 3287259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->error); 3288259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->warn); 3289259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_XDECREF(pyCtxt->arg); 3290259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlFree(pyCtxt); 3291259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3292259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard } 3293259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3294259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard xmlSchemaFreeValidCtxt(ctxt); 3295259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard Py_INCREF(Py_None); 3296259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard return(Py_None); 3297259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard} 3298259f0dfa8b4f29158954959b4d0d7c03dd1eab05Daniel Veillard 3299c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3300c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard 3301d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED 3302d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3303d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3304d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard/************************************************************************ 3305d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * * 3306d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * XML Canonicalization c14n * 3307d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * * 3308d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ************************************************************************/ 3309d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3310d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int 3311d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPyxmlNodeSet_Convert(PyObject *py_nodeset, xmlNodeSetPtr *result) 3312d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3313d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodeSet; 3314d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int is_tuple = 0; 3315d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3316d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (PyTuple_Check(py_nodeset)) 3317d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 1; 3318d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (PyList_Check(py_nodeset)) 3319d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 0; 3320d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (py_nodeset == Py_None) { 3321d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = NULL; 3322d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3323d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3324d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3325d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3326d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of nodes."); 3327d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3328d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3329d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3330d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet = (xmlNodeSetPtr) xmlMalloc(sizeof(xmlNodeSet)); 3331d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodeSet == NULL) { 3332d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3333d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3334d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3335d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3336d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeNr = 0; 3337d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeMax = (is_tuple 3338d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_SIZE(py_nodeset) 3339d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_SIZE(py_nodeset)); 3340d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeTab 3341d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard = (xmlNodePtr *) xmlMalloc (nodeSet->nodeMax 3342d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard * sizeof(xmlNodePtr)); 3343d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodeSet->nodeTab == NULL) { 3344d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodeSet); 3345d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3346d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3347d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3348d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard memset(nodeSet->nodeTab, 0 , 3349d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeMax * sizeof(xmlNodePtr)); 3350d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3351d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard { 3352d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int idx; 3353d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard for (idx=0; idx < nodeSet->nodeMax; ++idx) { 3354d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodePtr pynode = 3355d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyxmlNode_Get (is_tuple 3356d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_ITEM(py_nodeset, idx) 3357d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_ITEM(py_nodeset, idx)); 3358d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (pynode) 3359d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodeSet->nodeTab[nodeSet->nodeNr++] = pynode; 3360d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3361d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3362d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = nodeSet; 3363d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3364d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3365d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3366d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic int 3367d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel VeillardPystringSet_Convert(PyObject *py_strings, xmlChar *** result) 3368d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3369d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard /* NOTE: the array should be freed, but the strings are shared 3370d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with the python strings and so must not be freed. */ 3371d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3372d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** strings; 3373d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int is_tuple = 0; 3374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int count; 3375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int init_index = 0; 3376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (PyTuple_Check(py_strings)) 3378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 1; 3379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (PyList_Check(py_strings)) 3380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard is_tuple = 0; 3381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else if (py_strings == Py_None) { 3382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = NULL; 3383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of strings."); 3388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard count = (is_tuple 3392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_SIZE(py_strings) 3393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_SIZE(py_strings)); 3394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard strings = (xmlChar **) xmlMalloc(sizeof(xmlChar *) * count); 3396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3397d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (strings == NULL) { 3398d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_MemoryError, ""); 3399d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3400d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3401d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3402d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard memset(strings, 0 , sizeof(xmlChar *) * count); 3403d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3404d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard { 3405d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int idx; 3406d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard for (idx=0; idx < count; ++idx) { 3407d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard char* s = PyString_AsString 3408d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard (is_tuple 3409d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard ? PyTuple_GET_ITEM(py_strings, idx) 3410d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard : PyList_GET_ITEM(py_strings, idx)); 3411d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (s) 3412d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard strings[init_index++] = (xmlChar *)s; 3413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(strings); 3415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, 3416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "must be a tuple or list of strings."); 3417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return -1; 3418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard *result = strings; 3423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return 0; 3424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 3427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocDumpMemory(ATTRIBUTE_UNUSED PyObject * self, 3428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject * args) 3429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *py_retval = NULL; 3431d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_doc; 3433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_nodes; 3434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int exclusive; 3435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_prefixes; 3436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int with_comments; 3437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlDocPtr doc; 3439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodes; 3440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar **prefixes = NULL; 3441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar *doc_txt; 3442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int result; 3444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3445d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOiOi:C14NDocDumpMemory", 3446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_doc, 3447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_nodes, 3448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &exclusive, 3449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_prefixes, 3450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &with_comments)) 3451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return (NULL); 3452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc); 3454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!doc) { 3455d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad document."); 3456d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3457d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3458d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3459d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes); 3460d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) return NULL; 3461d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3462d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (exclusive) { 3463d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PystringSet_Convert(pyobj_prefixes, &prefixes); 3464d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3465d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3466d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3467d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3468d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3469d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3470d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3471d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3472d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3473d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = xmlC14NDocDumpMemory(doc, 3474d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 3475d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive, 3476d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 3477d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments, 3478d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &doc_txt); 3479d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3480d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3481d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3482d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3483d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3484d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (prefixes) { 3485d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** idx = prefixes; 3486d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard while (*idx) xmlFree(*(idx++)); 3487d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(prefixes); 3488d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3489d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3490d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3491d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_Exception, 3492d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "libxml2 xmlC14NDocDumpMemory failure."); 3493d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3494d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3495d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else { 3496d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard py_retval = PyString_FromStringAndSize((const char *) doc_txt, 3497d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result); 3498d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(doc_txt); 3499d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return py_retval; 3500d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3501d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3502d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3503d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardstatic PyObject * 3504d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillardlibxml_C14NDocSaveTo(ATTRIBUTE_UNUSED PyObject * self, 3505d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject * args) 3506d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard{ 3507d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_doc; 3508d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *py_file; 3509d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_nodes; 3510d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int exclusive; 3511d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyObject *pyobj_prefixes; 3512d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int with_comments; 3513d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3514d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlDocPtr doc; 3515d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlNodeSetPtr nodes; 3516d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar **prefixes = NULL; 3517d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard FILE * output; 3518d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlOutputBufferPtr buf; 3519d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3520d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int result; 3521d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard int len; 3522d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3523d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!PyArg_ParseTuple(args, (char *) "OOiOiO:C14NDocSaveTo", 3524d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_doc, 3525d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_nodes, 3526d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &exclusive, 3527d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &pyobj_prefixes, 3528d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &with_comments, 3529d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard &py_file)) 3530d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return (NULL); 3531d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3532d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard doc = (xmlDocPtr) PyxmlNode_Get(pyobj_doc); 3533d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (!doc) { 3534d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad document."); 3535d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3536d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3537d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3538d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if ((py_file == NULL) || (!(PyFile_Check(py_file)))) { 3539d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad file."); 3540d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3541d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3542d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard output = PyFile_AsFile(py_file); 3543d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (output == NULL) { 3544d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_TypeError, "bad file."); 3545d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3546d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3547d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard buf = xmlOutputBufferCreateFile(output, NULL); 3548d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3549d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PyxmlNodeSet_Convert(pyobj_nodes, &nodes); 3550d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) return NULL; 3551d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3552d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (exclusive) { 3553d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = PystringSet_Convert(pyobj_prefixes, &prefixes); 3554d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3555d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3556d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3557d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3558d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3559d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3560d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3561d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3562d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3563d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard result = xmlC14NDocSaveTo(doc, 3564d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 3565d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive, 3566d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 3567d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments, 3568d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard buf); 3569d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3570d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (nodes) { 3571d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes->nodeTab); 3572d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(nodes); 3573d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3574d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (prefixes) { 3575d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlChar ** idx = prefixes; 3576d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard while (*idx) xmlFree(*(idx++)); 3577d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard xmlFree(prefixes); 3578d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3579d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3580d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard len = xmlOutputBufferClose(buf); 3581d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3582d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if (result < 0) { 3583d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard PyErr_SetString(PyExc_Exception, 3584d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard "libxml2 xmlC14NDocSaveTo failure."); 3585d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return NULL; 3586d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard } 3587d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard else 3588d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return PyInt_FromLong((long) len); 3589d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard} 3590d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3591d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3592d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3593d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3594c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brackstatic PyObject * 3595c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Bracklibxml_getObjDesc(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 3596c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack 3597c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack PyObject *obj; 3598c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack char *str; 3599d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 3600c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack if (!PyArg_ParseTuple(args, (char *)"O:getObjDesc", &obj)) 3601c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack return NULL; 3602c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack str = PyCObject_GetDesc(obj); 3603c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack return Py_BuildValue((char *)"s", str); 3604c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack} 3605d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 360640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brackstatic PyObject * 360740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Bracklibxml_compareNodesEqual(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 360840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 360940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack PyObject *py_node1, *py_node2; 361040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack xmlNodePtr node1, node2; 361140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 361240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack if (!PyArg_ParseTuple(args, (char *)"OO:compareNodesEqual", 361340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack &py_node1, &py_node2)) 361440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack return NULL; 361540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack /* To compare two node objects, we compare their pointer addresses */ 361640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack node1 = PyxmlNode_Get(py_node1); 361740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack node2 = PyxmlNode_Get(py_node2); 361840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack if ( node1 == node2 ) 361940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack return Py_BuildValue((char *)"i", 1); 362040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack else 362140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack return Py_BuildValue((char *)"i", 0); 362240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 362340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack} 362440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 362540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brackstatic PyObject * 362640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Bracklibxml_nodeHash(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { 362740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 362840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack PyObject *py_node1; 362940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack xmlNodePtr node1; 363040cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 363140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack if (!PyArg_ParseTuple(args, (char *)"O:nodeHash", &py_node1)) 363240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack return NULL; 363340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack /* For simplicity, we use the node pointer address as a hash value */ 363440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack node1 = PyxmlNode_Get(py_node1); 363540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 363640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack return PyLong_FromVoidPtr(node1); 363740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 363840cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack} 363940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 3640a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard/************************************************************************ 3641a94ec6ff13d9617ff22e790cef82208e7d1bd375Daniel Veillard * * 3642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 3643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 3644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 3645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 364696fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 3647d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "name", libxml_name, METH_VARARGS, NULL}, 3648d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "children", libxml_children, METH_VARARGS, NULL}, 3649d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "properties", libxml_properties, METH_VARARGS, NULL}, 3650d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "last", libxml_last, METH_VARARGS, NULL}, 3651d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "prev", libxml_prev, METH_VARARGS, NULL}, 3652d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "next", libxml_next, METH_VARARGS, NULL}, 3653d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "parent", libxml_parent, METH_VARARGS, NULL}, 3654d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "type", libxml_type, METH_VARARGS, NULL}, 3655d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "doc", libxml_doc, METH_VARARGS, NULL}, 3656d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "xmlNewNode", libxml_xmlNewNode, METH_VARARGS, NULL}, 3657f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard {(char *) "xmlNodeRemoveNsDef", libxml_xmlNodeRemoveNsDef, METH_VARARGS, NULL}, 3658850ce9b6584ecc2893632392f1d3ba46fefc13acDaniel Veillard {(char *)"xmlSetValidErrors", libxml_xmlSetValidErrors, METH_VARARGS, NULL}, 365925c90c589b256f0925f081198c1525134a491e31Daniel Veillard {(char *)"xmlFreeValidCtxt", libxml_xmlFreeValidCtxt, METH_VARARGS, NULL}, 3660a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3661d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "serializeNode", libxml_serializeNode, METH_VARARGS, NULL}, 3662d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {(char *) "saveNodeTo", libxml_saveNodeTo, METH_VARARGS, NULL}, 3663c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "outputBufferCreate", libxml_xmlCreateOutputBuffer, METH_VARARGS, NULL}, 36646cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard {(char *) "outputBufferGetPythonFile", libxml_outputBufferGetPythonFile, METH_VARARGS, NULL}, 36656cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard {(char *) "xmlOutputBufferClose", libxml_xmlOutputBufferClose, METH_VARARGS, NULL}, 36666cbd6c0738efb6c55d08f39c0731d46d678858faDaniel Veillard { (char *)"xmlOutputBufferFlush", libxml_xmlOutputBufferFlush, METH_VARARGS, NULL }, 3667263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard { (char *)"xmlSaveFileTo", libxml_xmlSaveFileTo, METH_VARARGS, NULL }, 3668263ec86a75f7b5ec2d37dbb89356bf7fca11cff3Daniel Veillard { (char *)"xmlSaveFormatFileTo", libxml_xmlSaveFormatFileTo, METH_VARARGS, NULL }, 3669a9cce9cd0d7aff3ec318b5d8d376da131b6aaad4Daniel Veillard#endif /* LIBXML_OUTPUT_ENABLED */ 3670c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "inputBufferCreate", libxml_xmlCreateInputBuffer, METH_VARARGS, NULL}, 3671c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard {(char *) "setEntityLoader", libxml_xmlSetEntityLoader, METH_VARARGS, NULL}, 36723e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard {(char *)"xmlRegisterErrorHandler", libxml_xmlRegisterErrorHandler, METH_VARARGS, NULL }, 3673417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtSetErrorHandler", libxml_xmlParserCtxtSetErrorHandler, METH_VARARGS, NULL }, 3674417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard {(char *)"xmlParserCtxtGetErrorHandler", libxml_xmlParserCtxtGetErrorHandler, METH_VARARGS, NULL }, 3675e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard {(char *)"xmlFreeParserCtxt", libxml_xmlFreeParserCtxt, METH_VARARGS, NULL }, 3676438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#ifdef LIBXML_READER_ENABLED 367726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderSetErrorHandler", libxml_xmlTextReaderSetErrorHandler, METH_VARARGS, NULL }, 367826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlTextReaderGetErrorHandler", libxml_xmlTextReaderGetErrorHandler, METH_VARARGS, NULL }, 367926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard {(char *)"xmlFreeTextReader", libxml_xmlFreeTextReader, METH_VARARGS, NULL }, 3680438ebbd59af78c436397ae488e42aeca5cad7542Daniel Veillard#endif 36815439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard {(char *)"addLocalCatalog", libxml_addLocalCatalog, METH_VARARGS, NULL }, 3682c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#ifdef LIBXML_SCHEMAS_ENABLED 3683c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard {(char *)"xmlRelaxNGSetValidErrors", libxml_xmlRelaxNGSetValidErrors, METH_VARARGS, NULL}, 3684c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard {(char *)"xmlRelaxNGFreeValidCtxt", libxml_xmlRelaxNGFreeValidCtxt, METH_VARARGS, NULL}, 3685eff45a92da861195551a2050487fcca0492cac7cDaniel Veillard {(char *)"xmlSchemaSetValidErrors", libxml_xmlSchemaSetValidErrors, METH_VARARGS, NULL}, 3686bb8502c0ef2af706fbdff69119e994e40da64a88Daniel Veillard {(char *)"xmlSchemaFreeValidCtxt", libxml_xmlSchemaFreeValidCtxt, METH_VARARGS, NULL}, 3687c2664641740126714bb363bd6b5f65f724031c83Daniel Veillard#endif 3688d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_C14N_ENABLED 3689d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#ifdef LIBXML_OUTPUT_ENABLED 3690d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard {(char *)"xmlC14NDocDumpMemory", libxml_C14NDocDumpMemory, METH_VARARGS, NULL}, 3691d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard {(char *)"xmlC14NDocSaveTo", libxml_C14NDocSaveTo, METH_VARARGS, NULL}, 3692d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3693d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard#endif 3694c68d78d25a17e65d172ccc1ac24d609c7c1d5cdeWilliam M. Brack {(char *) "getObjDesc", libxml_getObjDesc, METH_VARARGS, NULL}, 369540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack {(char *) "compareNodesEqual", libxml_compareNodesEqual, METH_VARARGS, NULL}, 369640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack {(char *) "nodeHash", libxml_nodeHash, METH_VARARGS, NULL}, 3697d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard {NULL, NULL, 0, NULL} 3698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 3699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 37000fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 37016361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillardextern void initlibxsltmod(void); 37020fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 37030fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard 3704d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardvoid 3705d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillardinitlibxml2mod(void) 3706d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard{ 3707af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard static int initialized = 0; 3708af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard 3709af43f63aaabf0dc4b4a070773875d0927da3d8a2Daniel Veillard if (initialized != 0) 3710d2379010b1aa04ff87876d5b6dfd42ce2e12928fDaniel Veillard return; 37118e2cc6f2b53f536692f3c8ad8112bb67e0a1a629William M. Brack 3712f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* intialize the python extension module */ 3713f93a866079364a006189683eaa07f94c867389d1Daniel Veillard Py_InitModule((char *) "libxml2mod", libxmlMethods); 3714f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 3715f93a866079364a006189683eaa07f94c867389d1Daniel Veillard /* initialize libxml2 */ 3716f93a866079364a006189683eaa07f94c867389d1Daniel Veillard xmlInitParser(); 37175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 37186361da0c25e355affdeed84cfccb187ccaadfccbDaniel Veillard 3719f93a866079364a006189683eaa07f94c867389d1Daniel Veillard initialized = 1; 3720f93a866079364a006189683eaa07f94c867389d1Daniel Veillard 37210fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#ifdef MERGED_MODULES 37220fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard initlibxsltmod(); 37230fea6f45cd6f158418318c0af922533e44f9c0e2Daniel Veillard#endif 3724d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 3725