libxml.c revision 4e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79
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 1183ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardtypedef struct pySAXhandler { 1193ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *startDocument; 1203ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard /* TODO !!! */ 1213ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard} pySAXhandler, *pySAXhandlerPtr; 122d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 1233ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 1243ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 1253ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 1263ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 1273ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 1281971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1291971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 1303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) { 1313ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *chunk; 1323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 1333ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *URI; 1343ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyobj_SAX; 1353ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 1363ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pySAXhandlerPtr SAXdata = NULL; 1373ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 1383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 1393ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 1403ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX, 1413ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard &chunk, &size, &URI)) 1423ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(NULL); 1431971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 1443ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR 1453ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 1463ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyobj_SAX, chunk, size, URI); 1471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 1483ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 1493ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("xmlCreatePushParser: event interface not supported yet !\n"); 1501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 1511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 1521971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 1533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ret = xmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI); 1543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(pyret); 156a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 1575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1584e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel VeillardPyObject * 1594e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillardlibxml_htmlCreatePushParser(PyObject *self, PyObject *args) { 1604e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlChar *chunk; 1614e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard int size; 1624e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlChar *URI; 1634e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyobj_SAX; 1644e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlSAXHandlerPtr SAX = NULL; 1654e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pySAXhandlerPtr SAXdata = NULL; 1664e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard xmlParserCtxtPtr ret; 1674e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard PyObject *pyret; 1684e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1694e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (!PyArg_ParseTuple(args, "Oziz:htmlCreatePushParser", &pyobj_SAX, 1704e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard &chunk, &size, &URI)) 1714e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(NULL); 1724e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1734e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#ifdef DEBUG_ERROR 1744e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("libxml_htmlCreatePushParser(%p, %s, %d, %s) called\n", 1754e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyobj_SAX, chunk, size, URI); 1764e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard#endif 1774e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard if (pyobj_SAX != Py_None) { 1784e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard printf("htmlCreatePushParser: event interface not supported yet !\n"); 1794e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard Py_INCREF(Py_None); 1804e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(Py_None); 1814e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard } 1824e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard ret = htmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI, 1834e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard XML_CHAR_ENCODING_NONE); 1844e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 1854e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard return(pyret); 1864e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard} 1874e1b26cfeba7f5fad4f8bd12fb5ce7029f930b79Daniel Veillard 1885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 1895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 1905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 1915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 1925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 1935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 1955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 1965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) { 1995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int size; 2005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int chars; 2015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *larger; 2025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_list ap; 2035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *str; 2045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 2055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 2065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 2075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 2095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 2105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 2115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 2145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 2155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard vfprintf(stdout, msg, ap); 2165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 2175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 2185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = (char *) xmlMalloc(150); 2195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (str == NULL) 2205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 2215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size = 150; 2235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard while (1) { 2255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 2265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard chars = vsnprintf(str, size, msg, ap); 2275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 2285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((chars > -1) && (chars < size)) 2295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard break; 2305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (chars > -1) 2315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += chars + 1; 2325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard else 2335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += 100; 2345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 2355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlFree(str); 2365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 2375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 2385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = larger; 2395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 2405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard list = PyTuple_New(2); 2425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 2435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 2445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard message = libxml_charPtrWrap(str); 2455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 1, message); 2465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 2475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(list); 2485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(result); 2495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 2505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 2515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 2535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) { 2545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 2555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 2565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 2575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 2585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 2595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject * 2615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) { 2625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 2635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 2645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 2655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f, 2675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard &pyobj_ctx)) 2685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(NULL); 2695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 2715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f); 2725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 2735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 2755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 2765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 2775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 2785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 2795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 2805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 2825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 2835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 2855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 2865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 2875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 2885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 2895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(py_retval); 2905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 291a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 292a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 293a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 294a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 295a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 296a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 297a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0; 298a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 299a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback { 300a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 301a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 302a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 303a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *function; 304a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr; 305a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10]; 306a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0; 307a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10; 308a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 309a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */ 310a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL; 311a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 312a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 313a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) { 314a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 315a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 316a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 317a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 318a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 319a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncCallback called\n"); 320a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 321a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 322a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard list = PyTuple_New(nargs); 323a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < nargs;i++) { 324a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = valuePop(ctxt); 325a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 326a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyTuple_SetItem(list, i, cur); 327a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 328a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 329a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 330a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 331a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 332a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 333a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 334a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 335a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 336a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name, 337a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard const xmlChar *ns_uri) { 338a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 339a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 340a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 341a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctxt, name, ns_uri); 342a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 343a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 344a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctxt == libxml_xpathCallbacks[i].ctx) && 345a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 346a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 347a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = libxml_xpathCallbacks[i].function; 348a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(libxml_xmlXPathFuncCallback); 349a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 350a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 351a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 352a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 353a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 354a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 355a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 356a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) { 357a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 358a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 359a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 360a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return; 361a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 362a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 363a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 364a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 365a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 366a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < 10;i++) { 367a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = NULL; 368a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = NULL; 369a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = NULL; 370a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = NULL; 371a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 372a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 373a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 374a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 375a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 376a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 3777fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) { 378a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 379a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 380a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 381a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 382a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 383a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 384a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 385a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 386a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 387a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx, 388a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard &name, &ns_uri, &pyobj_f)) 389a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 390a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 391a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 392a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 393a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialize(); 394a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 395a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 396a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 397a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap(-1); 398a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 399a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 400a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 401a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 402a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 403a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx, name, ns_uri); 404a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 405a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 406a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctx == libxml_xpathCallbacks[i].ctx) && 407a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 408a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 409a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 410a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XDECREF(libxml_xpathCallbacks[i].function); 411a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 412a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard c_retval = 1; 413a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard goto done; 414a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 415a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 416a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) { 417a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction() table full\n"); 418a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } else { 419a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard i = libxml_xpathCallbacksNb++; 420a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 421a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = ctx; 422a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = xmlStrdup(name); 423a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri); 424a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 4259589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard c_retval = 1; 426a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 427a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone: 428a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 429a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 430a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 431a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 4321971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 4331971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 438d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args) 439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:name", &obj)) 445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 446d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 448d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 449d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 450d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 451d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 452d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 454d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 456d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: { 458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = doc->URL; 460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->name; 465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = ns->prefix; 470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->name; 474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 4761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args) 483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:doc", &obj)) 489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 492d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 493d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 494d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 495d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 497d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->doc; 507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->doc; 514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args) 522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:properties", &obj)) 528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->properties; 532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 535d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 537d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 539d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args) 540d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:next", &obj)) 546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 551d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) ns->next; 569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args) 582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:prev", &obj)) 588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 597d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 600d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 603d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 606d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 609d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 612d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args) 620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:children", &obj)) 626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->children; 646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->children; 650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 651d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 652d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 653d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 654d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 661d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args) 662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 685d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 686d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->last; 688d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 690d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 691d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->last; 692d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 693d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 694d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 695d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 696d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 697d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 700d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args) 703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 704d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:parent", &obj)) 709d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 710d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 713d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 715d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 718d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 719d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 720d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 721d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 722d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 723d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 724d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 725d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 726d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->parent; 727d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 728d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 729d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 730d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 731d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 732d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 733d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 734d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 735d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->parent; 736d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 737d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 738d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 739d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 740d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 741d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 742d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 743d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args) 744d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 745d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 746d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 747d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 748d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 749d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 750d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 751d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 752d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 753d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 754d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 755d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 756d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 757d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 758d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 759d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "element"; break; 760d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 761d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute"; break; 762d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 763d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "text"; break; 764d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 765d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "cdata"; break; 766d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 767d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_ref"; break; 768d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 769d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity"; break; 770d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 771d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "pi"; break; 772d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 773d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "comment"; break; 774d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 775d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_xml"; break; 776d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 777d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "doctype"; break; 778d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 779d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "fragment"; break; 780d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 781d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "notation"; break; 782d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 783d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_html"; break; 784d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 785d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "dtd"; break; 786d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 787d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "elem_decl"; break; 788d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 789d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute_decl"; break; 790d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 791d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_decl"; break; 792d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 793d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "namespace"; break; 794d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 795d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_start"; break; 796d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 797d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_end"; break; 798d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 799d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 800d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_docbook"; break; 801d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 802d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 803d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 804d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 805d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 806d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 8071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 808d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 809d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 810d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 811d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 812d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 813d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 814d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 815d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 816d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 81796fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 818d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "name", libxml_name, METH_VARARGS }, 819d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "children", libxml_children, METH_VARARGS }, 820d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "properties", libxml_properties, METH_VARARGS }, 821d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "last", libxml_last, METH_VARARGS }, 822d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "prev", libxml_prev, METH_VARARGS }, 823d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "next", libxml_next, METH_VARARGS }, 824d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "parent", libxml_parent, METH_VARARGS }, 825d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "type", libxml_type, METH_VARARGS }, 826a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard { "doc", libxml_doc, METH_VARARGS }, 827d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 828d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 829d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) { 8303ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *m; 831d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard m = Py_InitModule("_libxml", libxmlMethods); 8325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 833d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 834d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 835