libxml.c revision 3ce5257b293ed75d8feb18ed7ab18ea2b52510bd
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> 18d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#include "libxml_wrap.h" 1996fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-py.h" 20d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 21d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/* #define DEBUG */ 22a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* #define DEBUG_XPATH */ 235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/* #define DEBUG_ERROR */ 24d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 25d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 26d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 273ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling SAX/xmllib/sgmlop callback interfaces * 28d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 29d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 301971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 313ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardtypedef struct pySAXhandler { 323ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *startDocument; 333ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard /* TODO !!! */ 343ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard} pySAXhandler, *pySAXhandlerPtr; 35d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 363ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard/************************************************************************ 373ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 383ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * Handling of specific parser context * 393ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard * * 403ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ************************************************************************/ 411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel VeillardPyObject * 433ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillardlibxml_xmlCreatePushParser(PyObject *self, PyObject *args) { 443ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *chunk; 453ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard int size; 463ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlChar *URI; 473ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyobj_SAX; 483ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlSAXHandlerPtr SAX = NULL; 493ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pySAXhandlerPtr SAXdata = NULL; 503ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard xmlParserCtxtPtr ret; 513ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *pyret; 523ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard 533ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (!PyArg_ParseTuple(args, "Oziz:xmlCreatePushParser", &pyobj_SAX, 543ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard &chunk, &size, &URI)) 553ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(NULL); 561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 573ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard#ifdef DEBUG_ERROR 583ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("libxml_xmlCreatePushParser(%p, %s, %d, %s) called\n", 593ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyobj_SAX, chunk, size, URI); 601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#endif 613ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard if (pyobj_SAX != Py_None) { 623ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard printf("xmlCreatePushParser: event interface not supported yet !\n"); 631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard Py_INCREF(Py_None); 641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return(Py_None); 651971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard } 663ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard ret = xmlCreatePushParserCtxt(SAX, SAXdata, chunk, size, URI); 673ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard pyret = libxml_xmlParserCtxtPtrWrap(ret); 683ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard return(pyret); 69a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard/************************************************************************ 725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * Error message callback * 745d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard * * 755d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard ************************************************************************/ 765d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 775d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncHandler = NULL; 785d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic PyObject *libxml_xmlPythonErrorFuncCtxt = NULL; 795d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 805d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 815d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorFuncHandler(void *ctx, const char *msg, ...) { 825d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int size; 835d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard int chars; 845d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *larger; 855d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_list ap; 865d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard char *str; 875d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *list; 885d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *message; 895d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *result; 905d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 915d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 925d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorFuncHandler(%p, %s, ...) called\n", ctx, msg); 935d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 945d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 955d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 965d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler == NULL) { 975d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 985d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard vfprintf(stdout, msg, ap); 995d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 1005d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } else { 1015d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = (char *) xmlMalloc(150); 1025d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (str == NULL) 1035d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 1045d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1055d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size = 150; 1065d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1075d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard while (1) { 1085d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_start(ap, msg); 1095d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard chars = vsnprintf(str, size, msg, ap); 1105d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard va_end(ap); 1115d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((chars > -1) && (chars < size)) 1125d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard break; 1135d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (chars > -1) 1145d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += chars + 1; 1155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard else 1165d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard size += 100; 1175d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if ((larger = (char *) xmlRealloc(str, size)) == NULL) { 1185d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlFree(str); 1195d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return; 1205d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 1215d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard str = larger; 1225d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 1235d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1245d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard list = PyTuple_New(2); 1255d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 0, libxml_xmlPythonErrorFuncCtxt); 1265d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(libxml_xmlPythonErrorFuncCtxt); 1275d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard message = libxml_charPtrWrap(str); 1285d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyTuple_SetItem(list, 1, message); 1295d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard result = PyEval_CallObject(libxml_xmlPythonErrorFuncHandler, list); 1305d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(list); 1315d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(result); 1325d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 1335d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1345d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1355d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardstatic void 1365d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlErrorInitialize(void) { 1375d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 1385d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_xmlErrorInitialize() called\n"); 1395d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 1405d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard xmlSetGenericErrorFunc(NULL, libxml_xmlErrorFuncHandler); 1415d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 1425d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1435d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel VeillardPyObject * 1445d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillardlibxml_xmlRegisterErrorHandler(PyObject *self, PyObject *args) { 1455d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *py_retval; 1465d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_f; 1475d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard PyObject *pyobj_ctx; 1485d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1495d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (!PyArg_ParseTuple(args, "OO:xmlRegisterErrorHandler", &pyobj_f, 1505d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard &pyobj_ctx)) 1515d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(NULL); 1525d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1535d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#ifdef DEBUG_ERROR 1545d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard printf("libxml_registerXPathFunction(%p, %p) called\n", pyobj_ctx, pyobj_f); 1555d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard#endif 1565d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1575d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncHandler != NULL) { 1585d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncHandler); 1595d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 1605d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard if (libxml_xmlPythonErrorFuncCtxt != NULL) { 1615d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XDECREF(libxml_xmlPythonErrorFuncCtxt); 1625d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard } 1635d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1645d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_ctx); 1655d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard Py_XINCREF(pyobj_f); 1665d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1675d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard /* TODO: check f is a function ! */ 1685d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncHandler = pyobj_f; 1695d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlPythonErrorFuncCtxt = pyobj_ctx; 1705d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard 1715d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard py_retval = libxml_intWrap(1); 1725d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard return(py_retval); 1735d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard} 174a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/************************************************************************ 175a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 176a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * XPath extensions * 177a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard * * 178a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ************************************************************************/ 179a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 180a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksInitialized = 0; 181a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 182a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardtypedef struct libxml_xpathCallback { 183a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 184a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 185a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 186a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *function; 187a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} libxml_xpathCallback, *libxml_xpathCallbackPtr; 188a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic libxml_xpathCallback libxml_xpathCallbacks[10]; 189a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksNb = 0; 190a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic int libxml_xpathCallbacksMax = 10; 191a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 192a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard/* TODO: this is not reentrant !!! MUST FIX with a per context hash */ 193a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic PyObject *current_function = NULL; 194a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 195a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 196a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncCallback(xmlXPathParserContextPtr ctxt, int nargs) { 197a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *list, *cur, *result; 198a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathObjectPtr obj; 199a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 200a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 201a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 202a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncCallback called\n"); 203a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 204a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 205a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard list = PyTuple_New(nargs); 206a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < nargs;i++) { 207a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = valuePop(ctxt); 208a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard cur = libxml_xmlXPathObjectPtrWrap(obj); 209a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyTuple_SetItem(list, i, cur); 210a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 211a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard result = PyEval_CallObject(current_function, list); 212a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_DECREF(list); 213a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 214a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard obj = libxml_xmlXPathObjectPtrConvert(result); 215a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard valuePush(ctxt, obj); 216a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 217a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 218a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic xmlXPathFunction 219a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xmlXPathFuncLookupFunc(void *ctxt, const xmlChar *name, 220a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard const xmlChar *ns_uri) { 221a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 222a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 223a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xmlXPathFuncLookupFunc(%p, %s, %s) called\n", 224a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctxt, name, ns_uri); 225a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 226a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 227a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctxt == libxml_xpathCallbacks[i].ctx) && 228a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 229a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 230a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = libxml_xpathCallbacks[i].function; 231a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(libxml_xmlXPathFuncCallback); 232a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 233a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 234a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 235a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 236a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 237a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 238a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardstatic void 239a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillardlibxml_xpathCallbacksInitialize(void) { 240a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 241a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 242a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized != 0) 243a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return; 244a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 245a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 246a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_xpathCallbacksInitialized called\n"); 247a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 248a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 249a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < 10;i++) { 250a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = NULL; 251a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = NULL; 252a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = NULL; 253a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = NULL; 254a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 255a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard current_function = NULL; 256a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialized = 1; 257a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 258a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 259a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel VeillardPyObject * 2607fd7a94aa812e007842a4a0896bcbfa80ffdc907Daniel Veillardlibxml_xmlRegisterXPathFunction(PyObject *self, PyObject *args) { 261a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *py_retval; 262a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int c_retval = 0; 263a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *name; 264a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlChar *ns_uri; 265a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathContextPtr ctx; 266a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_ctx; 267a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard PyObject *pyobj_f; 268a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard int i; 269a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 270a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (!PyArg_ParseTuple(args, "OszO:registerXPathFunction", &pyobj_ctx, 271a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard &name, &ns_uri, &pyobj_f)) 272a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(NULL); 273a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 274a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx = (xmlXPathContextPtr) PyxmlXPathContext_Get(pyobj_ctx); 275a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksInitialized == 0) 276a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacksInitialize(); 277a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard xmlXPathRegisterFuncLookup(ctx, libxml_xmlXPathFuncLookupFunc, ctx); 278a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 279a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((pyobj_ctx == NULL) || (name == NULL) || (pyobj_f == NULL)) { 280a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap(-1); 281a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 282a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 283a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 284a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#ifdef DEBUG_XPATH 285a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction(%p, %s, %s) called\n", 286a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard ctx, name, ns_uri); 287a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#endif 288a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard for (i = 0;i < libxml_xpathCallbacksNb;i++) { 289a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if ((ctx == libxml_xpathCallbacks[i].ctx) && 290a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(name, libxml_xpathCallbacks[i].name)) && 291a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard (xmlStrEqual(ns_uri, libxml_xpathCallbacks[i].ns_uri))) { 292a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 293a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XDECREF(libxml_xpathCallbacks[i].function); 294a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 295a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard c_retval = 1; 296a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard goto done; 297a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 298a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 299a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard if (libxml_xpathCallbacksNb >= libxml_xpathCallbacksMax) { 300a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard printf("libxml_registerXPathFunction() table full\n"); 301a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } else { 302a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard i = libxml_xpathCallbacksNb++; 303a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard Py_XINCREF(pyobj_f); 304a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ctx = ctx; 305a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].name = xmlStrdup(name); 306a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].ns_uri = xmlStrdup(ns_uri); 307a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard libxml_xpathCallbacks[i].function = pyobj_f; 3089589d4551e71b598202e799ea462b7e97d00a1daDaniel Veillard c_retval = 1; 309a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard } 310a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddone: 311a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard py_retval = libxml_intWrap((int) c_retval); 312a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard return(py_retval); 313a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard} 314a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 3151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard/************************************************************************ 3161971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard * * 317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * Global properties access * 318d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 319d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 320d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 321d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_name(PyObject *self, PyObject *args) 322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 323d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 324d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 326d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:name", &obj)) 328d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 329d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 330d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 331d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 332d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_name: cur = %p type %d\n", cur, cur->type); 333d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 334d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 335d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 336d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 337d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 338d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 339d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 340d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: { 341d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr doc = (xmlDocPtr) cur; 342d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = doc->URL; 343d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 344d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 345d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 346d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 347d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->name; 348d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 349d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 350d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 351d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 352d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = ns->prefix; 353d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 354d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 355d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 356d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->name; 357d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 358d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 3591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 360d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 361d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 362d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 363d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 364d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 365d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_doc(PyObject *self, PyObject *args) 366d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 367d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 368d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 369d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlDocPtr res; 370d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 371d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:doc", &obj)) 372d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 373d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 374d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 375d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 376d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_doc: cur = %p\n", cur); 377d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 378d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 379d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 380d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 381d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 382d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 383d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 384d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 385d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 386d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 387d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 388d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 389d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->doc; 390d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 391d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 392d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 393d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 394d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 395d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 396d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->doc; 397d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 398d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 399d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlDocPtrWrap(res); 400d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 401d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 402d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 403d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 404d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_properties(PyObject *self, PyObject *args) 405d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 406d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 407d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur = NULL; 408d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr res; 409d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 410d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:properties", &obj)) 411d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 412d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 413d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (cur->type == XML_ELEMENT_NODE) 414d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->properties; 415d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard else 416d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 417d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlAttrPtrWrap(res); 418d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 419d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 420d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 421d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 422d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_next(PyObject *self, PyObject *args) 423d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 424d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 425d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 426d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 427d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 428d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:next", &obj)) 429d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 430d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 431d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 432d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 433d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_next: cur = %p\n", cur); 434d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 435d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 436d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 437d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 438d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 439d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 440d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 441d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 442d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 443d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 444d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 445d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 446d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 447d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 448d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 449d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: { 450d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNsPtr ns = (xmlNsPtr) cur; 451d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) ns->next; 452d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 453d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 454d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 455d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 456d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 457d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 458d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 459d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 460d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 461d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 462d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 463d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 464d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_prev(PyObject *self, PyObject *args) 465d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 466d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 467d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 468d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 469d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 470d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:prev", &obj)) 471d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 472d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 473d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 474d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 475d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_prev: cur = %p\n", cur); 476d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 477d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 478d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 479d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 480d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 481d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 482d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 483d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 484d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 485d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 486d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 487d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 488d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (xmlNodePtr) attr->next; 489d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 490d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 491d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 492d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 493d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 494d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->next; 495d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 496d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 497d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 498d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 499d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 500d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 501d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 502d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_children(PyObject *self, PyObject *args) 503d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 504d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 505d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 506d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 507d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 508d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:children", &obj)) 509d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 510d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 511d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 512d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 513d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_children: cur = %p\n", cur); 514d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 515d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 516d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 517d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 518d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 519d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 520d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 521d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 522d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 523d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 524d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 525d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 526d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 527d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 528d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->children; 529d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 530d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 531d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 532d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->children; 533d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 534d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 535d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 536d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 537d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 538d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 539d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 540d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 541d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 542d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 543d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 544d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_last(PyObject *self, PyObject *args) 545d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 546d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 547d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 548d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 549d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 550d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 551d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 552d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 553d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 554d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 555d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_last: cur = %p\n", cur); 556d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 557d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 558d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 559d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 560d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 561d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 562d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 563d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 564d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 565d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 566d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 567d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 568d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 569d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 570d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->last; 571d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 572d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 573d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 574d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->last; 575d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 576d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 577d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 578d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 579d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 580d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 581d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 582d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 583d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 584d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 585d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_parent(PyObject *self, PyObject *args) 586d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 587d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 588d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 589d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr res; 590d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 591d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:parent", &obj)) 592d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 593d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 594d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 595d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 596d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_parent: cur = %p\n", cur); 597d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 598d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 599d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 600d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 601d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 602d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 603d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 604d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 605d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 606d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 607d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: { 608d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlAttrPtr attr = (xmlAttrPtr) cur; 609d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = attr->parent; 610d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 611d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 612d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 613d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 614d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 615d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = NULL; 616d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 617d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard default: 618d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = cur->parent; 619d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard break; 620d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 621d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard resultobj = libxml_xmlNodePtrWrap(res); 622d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 623d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 624d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 625d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyObject * 626d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardlibxml_type(PyObject *self, PyObject *args) 627d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard{ 628d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard PyObject *resultobj, *obj; 629d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard xmlNodePtr cur; 630d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard const xmlChar *res; 631d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 632d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if (!PyArg_ParseTuple(args, "O:last", &obj)) 633d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return NULL; 634d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard cur = PyxmlNode_Get(obj); 635d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 636d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 637d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p\n", cur); 638d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 639d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 640d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard switch(cur->type) { 641d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_NODE: 642d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "element"; break; 643d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_NODE: 644d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute"; break; 645d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_TEXT_NODE: 646d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "text"; break; 647d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_CDATA_SECTION_NODE: 648d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "cdata"; break; 649d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_REF_NODE: 650d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_ref"; break; 651d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_NODE: 652d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity"; break; 653d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_PI_NODE: 654d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "pi"; break; 655d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_COMMENT_NODE: 656d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "comment"; break; 657d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_NODE: 658d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_xml"; break; 659d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_TYPE_NODE: 660d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "doctype"; break; 661d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCUMENT_FRAG_NODE: 662d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "fragment"; break; 663d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NOTATION_NODE: 664d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "notation"; break; 665d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_HTML_DOCUMENT_NODE: 666d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_html"; break; 667d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DTD_NODE: 668d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "dtd"; break; 669d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ELEMENT_DECL: 670d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "elem_decl"; break; 671d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ATTRIBUTE_DECL: 672d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "attribute_decl"; break; 673d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_ENTITY_DECL: 674d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "entity_decl"; break; 675d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_NAMESPACE_DECL: 676d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "namespace"; break; 677d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_START: 678d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_start"; break; 679d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_XINCLUDE_END: 680d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "xinclude_end"; break; 681d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef LIBXML_DOCB_ENABLED 682d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard case XML_DOCB_DOCUMENT_NODE: 683d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard res = (const xmlChar *) "document_docbook"; break; 684d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 685d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard } 686d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#ifdef DEBUG 687d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard printf("libxml_type: cur = %p: %s\n", cur, res); 688d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard#endif 689d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 6901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard resultobj = libxml_constxmlCharPtrWrap(res); 691d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard return resultobj; 692d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 693d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 694d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard/************************************************************************ 695d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 696d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * The registration stuff * 697d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard * * 698d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard ************************************************************************/ 699d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardstatic PyMethodDef libxmlMethods[] = { 70096fe095d4bf3c76301ed58ebe1ba10f8004f87efDaniel Veillard#include "libxml2-export.c" 701d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "name", libxml_name, METH_VARARGS }, 702d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "children", libxml_children, METH_VARARGS }, 703d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "properties", libxml_properties, METH_VARARGS }, 704d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "last", libxml_last, METH_VARARGS }, 705d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "prev", libxml_prev, METH_VARARGS }, 706d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "next", libxml_next, METH_VARARGS }, 707d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "parent", libxml_parent, METH_VARARGS }, 708d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard { "type", libxml_type, METH_VARARGS }, 709a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard { "doc", libxml_doc, METH_VARARGS }, 710d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard}; 711d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 712d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillardvoid init_libxml(void) { 7133ce5257b293ed75d8feb18ed7ab18ea2b52510bdDaniel Veillard PyObject *m; 714d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard m = Py_InitModule("_libxml", libxmlMethods); 7155d81903b06418c7d8cc72cf9add81c4026a2f3bcDaniel Veillard libxml_xmlErrorInitialize(); 716d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard} 717d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 718