libxml.c revision 33caa0b8307eccf22010400747830b1967edb292
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 * 73ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * See Copyright for the status of this software. 83ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * 93ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * daniel@veillard.com 103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard */ 11d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <Python.h> 12f1d0e6be57b76cf4fb8a7c0612ea5e71cce5c5c2Daniel Veillard#include <libxml/xmlmemory.h> 13d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/parser.h> 14d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include <libxml/tree.h> 15a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpath.h> 165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#include <libxml/xmlerror.h> 17a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#include <libxml/xpathInternals.h> 184e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#include <libxml/xmlmemory.h> 19d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 2096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 21d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 22d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 23a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */ 245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */ 254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/* #define DEBUG_MEMORY */ 264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 274e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard/************************************************************************ 284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * Memory debug interface * 304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * * 314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ************************************************************************/ 324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void xmlMemFree(void *ptr); 344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemMalloc(size_t size); 354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern void *xmlMemRealloc(void *ptr,size_t size); 364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardextern char *xmlMemoryStrdup(const char *str); 374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebugActivated = 0; 394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic long libxmlMemoryAllocatedBase = 0; 404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 414e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic int libxmlMemoryDebug = 0; 424e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlFreeFunc freeFunc = NULL; 434e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlMallocFunc mallocFunc = NULL; 444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlReallocFunc reallocFunc = NULL; 454e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardstatic xmlStrdupFunc strdupFunc = NULL; 464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 484e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_xmlDebugMemory(PyObject *self, PyObject *args) { 494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int activate; 504e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *py_retval; 514e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard long ret; 524e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 534e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (!PyArg_ParseTuple(args, "i:xmlDebugMemory", &activate)) 544e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(NULL); 554e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 564e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_MEMORY 574e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_xmlDebugMemory(%d) called\n", activate); 584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (activate != 0) { 614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebug == 0) { 624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard /* 634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * First initialize the library and grab the old memory handlers 644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard * and switch the library to memory debugging 654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard */ 664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlMemGet((xmlFreeFunc *) &freeFunc, 674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard (xmlMallocFunc *)&mallocFunc, 684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard (xmlReallocFunc *)&reallocFunc, 694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard (xmlStrdupFunc *) &strdupFunc); 704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if ((freeFunc == xmlMemFree) && (mallocFunc == xmlMemMalloc) && 714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard (reallocFunc == xmlMemRealloc) && 724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard (strdupFunc == xmlMemoryStrdup)) { 734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = (long) xmlMemSetup(xmlMemFree, xmlMemMalloc, 764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlMemRealloc, xmlMemoryStrdup); 774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (ret < 0) 784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard goto error; 794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlInitParser(); 824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = 0; 834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else if (libxmlMemoryDebugActivated == 0) { 844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryAllocatedBase = xmlMemUsed(); 854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = 0; 864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 884e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 894e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryDebug = 1; 904e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryDebugActivated = 1; 914e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } else { 924e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebugActivated == 1) 934e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = xmlMemUsed() - libxmlMemoryAllocatedBase; 944e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard else 954e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = 0; 964e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard libxmlMemoryDebugActivated = 0; 974e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 984e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillarderror: 994e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard py_retval = libxml_longWrap(ret); 1004e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(py_retval); 1014e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 1024e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1034e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1044e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_xmlDumpMemory(PyObject *self, PyObject *args) { 1054e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1064e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (libxmlMemoryDebug != 0) 1074e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlMemoryDump(); 1084e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard Py_INCREF(Py_None); 1094e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(Py_None); 1104e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 1143ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 1171971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 11833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 11933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartElement(void *user_data, const xmlChar * name, 12033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar ** attrs) 12133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 12233caa0b8307eccf22010400747830b1967edb292Daniel Veillard int i; 12333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 12433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *dict; 12533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrname; 12633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *attrvalue; 12733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 12833caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 12933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 13033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 13133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "startElement")) 13233caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 13333caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (PyObject_HasAttrString(handler, "start")) 13433caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 13533caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 13633caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 13733caa0b8307eccf22010400747830b1967edb292Daniel Veillard * the xmllib interface always generate a dictionnary, 13833caa0b8307eccf22010400747830b1967edb292Daniel Veillard * possibly empty 13933caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 14033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if ((attrs == NULL) && (type == 1)) { 14133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 14233caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = Py_None; 14333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 14433caa0b8307eccf22010400747830b1967edb292Daniel Veillard dict = PyDict_New(); 14533caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (i = 0; attrs[i] != NULL; i++) { 14633caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrname = PyString_FromString(attrs[i]); 14733caa0b8307eccf22010400747830b1967edb292Daniel Veillard i++; 14833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (attrs[i] != NULL) { 14933caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = PyString_FromString(attrs[i]); 15033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } else { 15133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XINCREF(Py_None); 15233caa0b8307eccf22010400747830b1967edb292Daniel Veillard attrvalue = Py_None; 15333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 15433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyDict_SetItem(dict, attrname, attrvalue); 15533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 15633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 15733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 15833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 15933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "startElement", 16033caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sO", name, dict); 16133caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 16233caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "start", 16333caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sO", name, dict); 16433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 16533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 16633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(dict); 16733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 16833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 16933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 17033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 17133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 17233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonStartDocument(void *user_data) 17333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 17433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 17533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 17633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 17733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 17833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "startDocument")) { 17933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "startDocument", NULL); 18033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 18133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 18233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 18333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 18433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 18533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 18633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 18733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndDocument(void *user_data) 18833caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 18933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 19033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 19133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 19233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 19333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "endDocument")) { 19433caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "endDocument", NULL); 19533caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 19633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 19733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 19833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 19933caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* 20033caa0b8307eccf22010400747830b1967edb292Daniel Veillard * The reference to the handler is released there 20133caa0b8307eccf22010400747830b1967edb292Daniel Veillard */ 20233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(handler); 20333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 20433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 20533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 20633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEndElement(void *user_data, const xmlChar * name) 20733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 20833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 20933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 21033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 21133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 21233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "endElement")) { 21333caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "endElement", "s", name); 21433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 21533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 21633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 21733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 21833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 21933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 22033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 22133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonReference(void *user_data, const xmlChar * name) 22233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 22333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 22433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 22533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 22633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 22733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "reference")) { 22833caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "reference", "s", name); 22933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 23033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 23133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 23233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 23333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 23433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 23533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 23633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCharacters(void *user_data, const xmlChar * ch, int len) 23733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 23833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 23933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 24033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 24133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 24233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 24333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "characters")) 24433caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 24533caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (PyObject_HasAttrString(handler, "data")) 24633caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 24733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 24833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 24933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "characters", "s#", ch, len); 25033caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 25133caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "data", "s#", ch, len); 25233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 25333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 25433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 25533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 25633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 25733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 25833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 25933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonIgnorableWhitespace(void *user_data, const xmlChar * ch, int len) 26033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 26133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 26233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 26333caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 26433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 26533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 26633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "ignorableWhitespace")) 26733caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 26833caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (PyObject_HasAttrString(handler, "data")) 26933caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 27033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 27133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 27233caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 27333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject_CallMethod(handler, "ignorableWhitespace", "s#", 27433caa0b8307eccf22010400747830b1967edb292Daniel Veillard ch, len); 27533caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 27633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "data", "s#", ch, len); 27733caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 27833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 27933caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 28033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 28133caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 28233caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonProcessingInstruction(void *user_data, 28333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * target, const xmlChar * data) 28433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 28533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 28633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 28733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 28833caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 28933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "processingInstruction")) { 29033caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 29133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject_CallMethod(handler, 29233caa0b8307eccf22010400747830b1967edb292Daniel Veillard "ignorableWhitespace", "ss", target, data); 29333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 29433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 29533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 29633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 29733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 29833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonComment(void *user_data, const xmlChar * value) 29933caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 30033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 30133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 30233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 30333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 30433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "comment")) { 30533caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "comment", "s", value); 30633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 30733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 30833caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 30933caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 31033caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 31133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 31233caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 31333caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonWarning(void *user_data, const char *msg, ...) 31433caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 31533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 31633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 31733caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 31833caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 31933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 32033caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 32133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "warning")) { 32233caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 32333caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 32433caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_end(args); 32533caa0b8307eccf22010400747830b1967edb292Daniel Veillard buf[1023] = 0; 32633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "warning", "s", buf); 32733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 32833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 32933caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 33033caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 33133caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 33233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 33333caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 33433caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonError(void *user_data, const char *msg, ...) 33533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 33633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 33733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 33833caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 33933caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 34033caa0b8307eccf22010400747830b1967edb292Daniel Veillard 34133caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 34233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "error")) { 34333caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 34433caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 34533caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_end(args); 34633caa0b8307eccf22010400747830b1967edb292Daniel Veillard buf[1023] = 0; 34733caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "error", "s", buf); 34833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 34933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 35033caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 35133caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 35233caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 35333caa0b8307eccf22010400747830b1967edb292Daniel Veillard 35433caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 35533caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonFatalError(void *user_data, const char *msg, ...) 35633caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 35733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 35833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 35933caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_list args; 36033caa0b8307eccf22010400747830b1967edb292Daniel Veillard char buf[1024]; 36133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 36233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 36333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "fatalError")) { 36433caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_start(args, msg); 36533caa0b8307eccf22010400747830b1967edb292Daniel Veillard vsnprintf(buf, 1023, msg, args); 36633caa0b8307eccf22010400747830b1967edb292Daniel Veillard va_end(args); 36733caa0b8307eccf22010400747830b1967edb292Daniel Veillard buf[1023] = 0; 36833caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "fatalError", "s", buf); 36933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 37033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 37133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 37233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 37333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 37433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 37533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 37633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonCdataBlock(void *user_data, const xmlChar * ch, int len) 37733caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 37833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 37933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 38033caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type = 0; 38133caa0b8307eccf22010400747830b1967edb292Daniel Veillard 38233caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 38333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "cdataBlock")) 38433caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 1; 38533caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (PyObject_HasAttrString(handler, "cdata")) 38633caa0b8307eccf22010400747830b1967edb292Daniel Veillard type = 2; 38733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type != 0) { 38833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (type == 1) 38933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "cdataBlock", "s#", ch, len); 39033caa0b8307eccf22010400747830b1967edb292Daniel Veillard else if (type == 2) 39133caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "cdata", "s#", ch, len); 39233caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 39333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 39433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 39533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 39633caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 39733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 39833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 39933caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonExternalSubset(void *user_data, 40033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 40133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * externalID, const xmlChar * systemID) 40233caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 40333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 40433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 40533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 40633caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 40733caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "externalSubset")) { 40833caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = 40933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject_CallMethod(handler, "externalSubset", 41033caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sss", name, externalID, systemID); 41133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 41233caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 41333caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 41433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 41533caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 41633caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonEntityDecl(void *user_data, 41733caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 41833caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 41933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 42033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, xmlChar * content) 42133caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 42233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 42333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 42433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 42533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 42633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "entityDecl")) { 42733caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "entityDecl", 42833caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sisss", name, type, publicId, 42933caa0b8307eccf22010400747830b1967edb292Daniel Veillard systemId, content); 43033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 43133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 43233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 43333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 43433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 43533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 43633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 43733caa0b8307eccf22010400747830b1967edb292Daniel Veillard 43833caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 43933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 44033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonNotationDecl(void *user_data, 44133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 44233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, const xmlChar * systemId) 44333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 44433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 44533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 44633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 44733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 44833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "notationDecl")) { 44933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "notationDecl", 45033caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sss", name, publicId, systemId); 45133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 45233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 45333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 45433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 45533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 45633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 45733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 45833caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonAttributeDecl(void *user_data, 45933caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * elem, 46033caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 46133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, 46233caa0b8307eccf22010400747830b1967edb292Daniel Veillard int def, 46333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * defaultValue, 46433caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr tree) 46533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 46633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 46733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *nameList; 46833caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *newName; 46933caa0b8307eccf22010400747830b1967edb292Daniel Veillard xmlEnumerationPtr node; 47033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 47133caa0b8307eccf22010400747830b1967edb292Daniel Veillard int count; 47233caa0b8307eccf22010400747830b1967edb292Daniel Veillard 47333caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 47433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "attributeDecl")) { 47533caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 47633caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 47733caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 47833caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 47933caa0b8307eccf22010400747830b1967edb292Daniel Veillard nameList = PyList_New(count); 48033caa0b8307eccf22010400747830b1967edb292Daniel Veillard count = 0; 48133caa0b8307eccf22010400747830b1967edb292Daniel Veillard for (node = tree; node != NULL; node = node->next) { 48233caa0b8307eccf22010400747830b1967edb292Daniel Veillard newName = PyString_FromString(node->name); 48333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyList_SetItem(nameList, count, newName); 48433caa0b8307eccf22010400747830b1967edb292Daniel Veillard count++; 48533caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 48633caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "attributeDecl", 48733caa0b8307eccf22010400747830b1967edb292Daniel Veillard "ssiisO", elem, name, type, def, 48833caa0b8307eccf22010400747830b1967edb292Daniel Veillard defaultValue, nameList); 48933caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 49033caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 49133caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(nameList); 49233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 49333caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 49433caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 49533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 49633caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 49733caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonElementDecl(void *user_data, 49833caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 49933caa0b8307eccf22010400747830b1967edb292Daniel Veillard int type, xmlElementContentPtr content) 50033caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 50133caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 50233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *obj; 50333caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 50433caa0b8307eccf22010400747830b1967edb292Daniel Veillard 50533caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 50633caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "elementDecl")) { 50733caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* TODO: wrap in an elementContent object */ 50833caa0b8307eccf22010400747830b1967edb292Daniel Veillard printf("pythonElementDecl: xmlElementContentPtr wrapper missing !\n"); 50933caa0b8307eccf22010400747830b1967edb292Daniel Veillard obj = Py_None; 51033caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* Py_XINCREF(Py_None); isn't the reference just borrowed ??? */ 51133caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "elementDecl", 51233caa0b8307eccf22010400747830b1967edb292Daniel Veillard "siO", name, type, obj); 51333caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 51433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 51533caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 51633caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 51733caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 51833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 51933caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 52033caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonUnparsedEntityDecl(void *user_data, 52133caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * name, 52233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * publicId, 52333caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * systemId, 52433caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * notationName) 52533caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 52633caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 52733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 52833caa0b8307eccf22010400747830b1967edb292Daniel Veillard 52933caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 53033caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "unparsedEntityDecl")) { 53133caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "unparsedEntityDecl", 53233caa0b8307eccf22010400747830b1967edb292Daniel Veillard "ssss", name, publicId, systemId, 53333caa0b8307eccf22010400747830b1967edb292Daniel Veillard notationName); 53433caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 53533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 53633caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 53733caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 53833caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 53933caa0b8307eccf22010400747830b1967edb292Daniel Veillard 54033caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic void 54133caa0b8307eccf22010400747830b1967edb292Daniel VeillardpythonInternalSubset(void *user_data, const xmlChar * name, 54233caa0b8307eccf22010400747830b1967edb292Daniel Veillard const xmlChar * ExternalID, const xmlChar * SystemID) 54333caa0b8307eccf22010400747830b1967edb292Daniel Veillard{ 54433caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *handler; 54533caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *result; 54633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 54733caa0b8307eccf22010400747830b1967edb292Daniel Veillard handler = (PyObject *) user_data; 54833caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyObject_HasAttrString(handler, "internalSubset")) { 54933caa0b8307eccf22010400747830b1967edb292Daniel Veillard result = PyObject_CallMethod(handler, "internalSubset", 55033caa0b8307eccf22010400747830b1967edb292Daniel Veillard "sss", name, ExternalID, SystemID); 55133caa0b8307eccf22010400747830b1967edb292Daniel Veillard if (PyErr_Occurred()) 55233caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyErr_Print(); 55333caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_XDECREF(result); 55433caa0b8307eccf22010400747830b1967edb292Daniel Veillard } 55533caa0b8307eccf22010400747830b1967edb292Daniel Veillard} 55633caa0b8307eccf22010400747830b1967edb292Daniel Veillard 55733caa0b8307eccf22010400747830b1967edb292Daniel Veillardstatic xmlSAXHandler pythonSaxHandler = { 55833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonInternalSubset, 55933caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonIsStandalone, */ 56033caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonHasInternalSubset, */ 56133caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonHasExternalSubset, */ 56233caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonResolveEntity, */ 56333caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonGetEntity, */ 56433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEntityDecl, 56533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonNotationDecl, 56633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonAttributeDecl, 56733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonElementDecl, 56833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonUnparsedEntityDecl, 56933caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* OBSOLETED pythonSetDocumentLocator, */ 57033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartDocument, 57133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndDocument, 57233caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonStartElement, 57333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonEndElement, 57433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonReference, 57533caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCharacters, 57633caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonIgnorableWhitespace, 57733caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonProcessingInstruction, 57833caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonComment, 57933caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonWarning, 58033caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonError, 58133caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonFatalError, 58233caa0b8307eccf22010400747830b1967edb292Daniel Veillard NULL, /* TODO pythonGetParameterEntity, */ 58333caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonCdataBlock, 58433caa0b8307eccf22010400747830b1967edb292Daniel Veillard pythonExternalSubset, 58533caa0b8307eccf22010400747830b1967edb292Daniel Veillard 1 58633caa0b8307eccf22010400747830b1967edb292Daniel Veillard}; 587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 5883ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 5893ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 5903ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 5913ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 5923ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 5931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 5941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 5953ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) { 5963ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *chunk; 5973ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 5983ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *URI; 59933caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 6003ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 6013ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 6023ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 6033ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 6043ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX, 6053ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard &chunk, &size, &URI)) 6063ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(NULL); 6071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 6083ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR 6093ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 6103ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyobj_SAX, chunk, size, URI); 6111971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 6123ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 61333caa0b8307eccf22010400747830b1967edb292Daniel Veillard SAX = &pythonSaxHandler; 61433caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_INCREF(pyobj_SAX); 61533caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* The reference is released in pythonEndDocument() */ 6161971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 61733caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = xmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI); 6183ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 6193ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(pyret); 620a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 6215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6224e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 6234e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_htmlCreatePushParser(PyObject *self, PyObject *args) { 6244e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlChar *chunk; 6254e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 6264e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlChar *URI; 62733caa0b8307eccf22010400747830b1967edb292Daniel Veillard PyObject *pyobj_SAX = NULL; 6284e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 6294e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 6304e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 6314e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 6324e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (!PyArg_ParseTuple(args, "Oziz:htmlCreatePushParser", &pyobj_SAX, 6334e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard &chunk, &size, &URI)) 6344e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(NULL); 6354e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 6364e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_ERROR 6374e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 6384e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyobj_SAX, chunk, size, URI); 6394e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 6404e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 64133caa0b8307eccf22010400747830b1967edb292Daniel Veillard SAX = &pythonSaxHandler; 64233caa0b8307eccf22010400747830b1967edb292Daniel Veillard Py_INCREF(pyobj_SAX); 64333caa0b8307eccf22010400747830b1967edb292Daniel Veillard /* The reference is released in pythonEndDocument() */ 6444e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 64533caa0b8307eccf22010400747830b1967edb292Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, pyobj_SAX, chunk, size, URI, 6464e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard XML_CHAR_ENCODING_NONE); 6474e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 6484e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(pyret); 6494e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 6504e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 6515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 6525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 6535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 6545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 6555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 6565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 6585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 6595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 6615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) { 6625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int size; 6635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int chars; 6645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *larger; 6655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_list ap; 6665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *str; 6675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 6685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 6695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 6705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 6725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 6735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 6745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 6775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 6785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard vfprintf(stdout, msg, ap); 6795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 6805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 6815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = (char *) xmlMalloc(150); 6825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (str == NULL) 6835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 6845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size = 150; 6865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 6875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard while (1) { 6885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 6895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard chars = vsnprintf(str, size, msg, ap); 6905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 6915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((chars > -1) && (chars < size)) 6925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard break; 6935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (chars > -1) 6945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += chars + 1; 6955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard else 6965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += 100; 6975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 6985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlFree(str); 6995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 7005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 7015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = larger; 7025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 7035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard list = PyTuple_New(2); 7055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 7065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 7075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard message = libxml_charPtrWrap(str); 7085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 1, message); 7095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 7105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(list); 7115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(result); 7125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 7135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 7145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 7165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) { 7175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 7185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 7195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 7205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 7215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 7225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject * 7245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) { 7255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 7265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 7275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 7285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f, 7305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard &pyobj_ctx)) 7315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(NULL); 7325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 7345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f); 7355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 7365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 7385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 7395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 7405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 7415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 7425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 7435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 7455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 7465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 7485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 7495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 7505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 7515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 7525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(py_retval); 7535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 754a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 755a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 756a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 757a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 758a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 759a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 760a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0; 761a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 762a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback { 763a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 764a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 765a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 766a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *function; 767a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr; 768a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10]; 769a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0; 770a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10; 771a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 772a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */ 773a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL; 774a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 775a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 776a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) { 777a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 778a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 779a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 780a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 781a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 782a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncCallback called\n"); 783a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 784a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 785a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard list = PyTuple_New(nargs); 786a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < nargs;i++) { 787a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = valuePop(ctxt); 788a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 789a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyTuple_SetItem(list, i, cur); 790a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 791a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 792a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 793a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 794a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 795a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 796a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 797a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 798a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 799a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name, 800a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard const xmlChar *ns_uri) { 801a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 802a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 803a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 804a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctxt, name, ns_uri); 805a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 806a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 807a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctxt == libxml_xpathCallbacks[i].ctx) && 808a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 809a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 810a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = libxml_xpathCallbacks[i].function; 811a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(libxml_xmlXPathFuncCallback); 812a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 813a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 814a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 815a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 816a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 817a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 818a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 819a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) { 820a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 821a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 822a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 823a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return; 824a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 825a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 827a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 828a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 829a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < 10;i++) { 830a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = NULL; 831a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = NULL; 832a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = NULL; 833a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = NULL; 834a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 835a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 836a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 837a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 838a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 839a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 8407fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) { 841a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 842a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 843a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 844a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 845a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 846a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 847a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 848a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 849a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 850a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx, 851a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard &name, &ns_uri, &pyobj_f)) 852a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 853a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 854a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 855a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 856a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialize(); 857a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 858a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 859a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 860a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap(-1); 861a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 862a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 863a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 864a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 865a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 866a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx, name, ns_uri); 867a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 868a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 869a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctx == libxml_xpathCallbacks[i].ctx) && 870a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 871a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 872a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 873a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XDECREF(libxml_xpathCallbacks[i].function); 874a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 875a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard c_retval = 1; 876a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard goto done; 877a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 878a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 879a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) { 880a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction() table full\n"); 881a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } else { 882a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard i = libxml_xpathCallbacksNb++; 883a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 884a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = ctx; 885a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = xmlStrdup(name); 886a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri); 887a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 8889589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard c_retval = 1; 889a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 890a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone: 891a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 892a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 893a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 894a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 8951971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 8961971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 897d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 898d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 899d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 900d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 901d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args) 902d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 903d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 904d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 905d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 906d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 907d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:name", &obj)) 908d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 909d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 910d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 911d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 912d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 913d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 914d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 915d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 916d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 917d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 918d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 919d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 920d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: { 921d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 922d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = doc->URL; 923d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 924d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 925d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 926d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 927d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->name; 928d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 929d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 930d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 931d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 932d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = ns->prefix; 933d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 934d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 935d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 936d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->name; 937d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 938d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 9391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 940d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 941d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 942d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 943d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 944d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 945d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args) 946d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 947d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 948d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 949d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 950d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 951d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:doc", &obj)) 952d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 953d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 954d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 955d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 956d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 957d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 958d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 959d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 960d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 961d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 962d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 963d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 964d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 965d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 966d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 967d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 968d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 969d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->doc; 970d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 971d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 972d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 973d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 974d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 975d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 976d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->doc; 977d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 978d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 979d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 980d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 981d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 982d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 983d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 984d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args) 985d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 986d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 987d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 988d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 989d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 990d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:properties", &obj)) 991d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 992d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 993d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 994d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->properties; 995d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 996d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 997d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 998d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 999d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1000d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1001d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1002d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args) 1003d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1004d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1005d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1006d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1007d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1008d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:next", &obj)) 1009d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1010d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1011d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1012d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1013d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 1014d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1015d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1016d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1017d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1018d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1019d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1020d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1021d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1022d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1023d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1024d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 1025d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1026d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 1027d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1028d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1029d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 1030d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 1031d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) ns->next; 1032d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1033d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1034d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 1035d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 1036d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1037d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1038d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1039d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1040d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1041d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1042d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1043d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1044d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args) 1045d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1046d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1047d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1048d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1049d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1050d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:prev", &obj)) 1051d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1052d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1053d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1054d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1055d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 1056d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1057d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1058d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1059d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1060d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1061d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1062d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1063d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1064d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1065d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1066d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 1067d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1068d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 1069d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1070d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 1071d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1072d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1073d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 1074d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 1075d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1076d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1077d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1078d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1079d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1080d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1081d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1082d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args) 1083d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1084d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1085d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1086d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1087d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1088d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:children", &obj)) 1089d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1090d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1091d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1092d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1093d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 1094d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1095d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1096d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1097d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 1098d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 1099d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 1100d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 1101d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 1102d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1103d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1104d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1105d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1106d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1107d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 1108d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->children; 1109d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1110d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 1111d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1112d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->children; 1113d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1114d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1115d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 1116d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1117d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1118d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1119d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1120d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1121d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1123d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1124d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args) 1125d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1126d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1127d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1128d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1129d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1130d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 1131d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1132d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1133d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1134d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1135d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 1136d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1137d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1138d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1139d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 1140d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 1141d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 1142d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 1143d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 1144d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1145d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1146d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1147d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1148d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1149d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 1150d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->last; 1151d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1152d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 1153d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1154d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->last; 1155d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1156d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 1157d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1158d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1159d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1160d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1161d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1162d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1163d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1164d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1165d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args) 1166d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1167d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1168d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1169d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 1170d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1171d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:parent", &obj)) 1172d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1173d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1174d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1175d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1176d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 1177d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1178d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1179d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1180d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1181d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1182d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1183d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1184d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1185d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1186d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1187d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 1188d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 1189d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->parent; 1190d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1191d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 1192d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 1193d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 1194d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 1195d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 1196d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1197d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 1198d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->parent; 1199d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 1200d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1201d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 1202d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1203d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1204d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1205d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 1206d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args) 1207d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 1208d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 1209d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 1210d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 1211d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 1213d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 1214d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 1215d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1216d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1217d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 1218d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1219d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1220d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 1221d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 1222d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "element"; break; 1223d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 1224d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute"; break; 1225d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 1226d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "text"; break; 1227d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 1228d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "cdata"; break; 1229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 1230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_ref"; break; 1231d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 1232d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity"; break; 1233d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 1234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "pi"; break; 1235d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 1236d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "comment"; break; 1237d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 1238d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_xml"; break; 1239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 1240d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "doctype"; break; 1241d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 1242d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "fragment"; break; 1243d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 1244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "notation"; break; 1245d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 1246d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_html"; break; 1247d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 1248d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "dtd"; break; 1249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 1250d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "elem_decl"; break; 1251d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 1252d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute_decl"; break; 1253d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 1254d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_decl"; break; 1255d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 1256d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "namespace"; break; 1257d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 1258d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_start"; break; 1259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 1260d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_end"; break; 1261d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 1262d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 1263d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_docbook"; break; 1264d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1265d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 1266d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 1267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 1268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 1269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 12701971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 1271d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 1272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1273d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1274d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 1275d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 127636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * Specific accessor functions * 127736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 127836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard ************************************************************************/ 127936eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 128036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNsDefs(PyObject *self, PyObject *args) { 128136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 128236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 128336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 128436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 128536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 128636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if (!PyArg_ParseTuple(args, "O:xmlNodeGetNsDefs", &pyobj_node)) 128736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(NULL); 128836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 128936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 129036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 129136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard Py_INCREF(Py_None); 129236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(Py_None); 129336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 129436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->nsDef; 129536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 129636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(py_retval); 129736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 129836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 129936eea2d2ee84132e66552f84724e9b377d687681Daniel VeillardPyObject * 130036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillardlibxml_xmlNodeGetNs(PyObject *self, PyObject *args) { 130136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *py_retval; 130236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNsPtr c_retval; 130336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard xmlNodePtr node; 130436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard PyObject *pyobj_node; 130536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 130636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if (!PyArg_ParseTuple(args, "O:xmlNodeGetNs", &pyobj_node)) 130736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(NULL); 130836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard node = (xmlNodePtr) PyxmlNode_Get(pyobj_node); 130936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 131036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) { 131136eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard Py_INCREF(Py_None); 131236eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(Py_None); 131336eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard } 131436eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard c_retval = node->ns; 131536eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval); 131636eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard return(py_retval); 131736eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard} 131836eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard 131936eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard/************************************************************************ 132036eea2d2ee84132e66552f84724e9b377d687681Daniel Veillard * * 1321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 1322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 1323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 1324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 132596fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 1326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "name", libxml_name, METH_VARARGS }, 1327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "children", libxml_children, METH_VARARGS }, 1328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "properties", libxml_properties, METH_VARARGS }, 1329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "last", libxml_last, METH_VARARGS }, 1330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "prev", libxml_prev, METH_VARARGS }, 1331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "next", libxml_next, METH_VARARGS }, 1332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "parent", libxml_parent, METH_VARARGS }, 1333d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "type", libxml_type, METH_VARARGS }, 1334a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard { "doc", libxml_doc, METH_VARARGS }, 1335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 1336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) { 13383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *m; 1339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard m = Py_InitModule("_libxml", libxmlMethods); 13405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 1341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 1342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1343