diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | libxslt/win32config.h | 2 | ||||
-rw-r--r-- | python/types.c | 32 |
3 files changed, 38 insertions, 2 deletions
@@ -1,3 +1,9 @@ +Thu Mar 13 09:33:21 CET 2008 Daniel Veillard <daniel@veillard.com> + + * libxslt/win32config.h: patch from Rob Richards for VS 2008 + * python/types.c: fix a problem with namespace nodes coming from + XPath nodesets. + Mon Mar 3 09:39:31 CET 2008 Daniel Veillard <daniel@veillard.com> * doc/xsltproc.xml doc/xsltproc.1: fix maxdepth default value diff --git a/libxslt/win32config.h b/libxslt/win32config.h index 9f401280..169b03d1 100644 --- a/libxslt/win32config.h +++ b/libxslt/win32config.h @@ -80,8 +80,10 @@ static int isnan (double d) { #if defined(_MSC_VER) || defined(__MINGW32__) #define mkdir(p,m) _mkdir(p) #define snprintf _snprintf +#if _MSC_VER < 1500 #define vsnprintf(b,c,f,a) _vsnprintf(b,c,f,a) #endif +#endif #define HAVE_SYS_STAT_H #define HAVE__STAT diff --git a/python/types.c b/python/types.c index 64163543..621891ec 100644 --- a/python/types.c +++ b/python/types.c @@ -11,6 +11,7 @@ xmlParserInputPtr xmlNoNetExternalEntityLoader(const char *URL, * daniel@veillard.com */ #include "libxml_wrap.h" +#include <libxml/xpathInternals.h> PyObject * libxml_intWrap(int val) @@ -333,6 +334,24 @@ libxml_xmlParserCtxtPtrWrap(xmlParserCtxtPtr ctxt) return (ret); } +/** + * libxml_xmlXPathDestructNsNode: + * cobj: xmlNsPtr namespace node + * desc: ignored string + * + * This function is called if and when a namespace node returned in + * an XPath node set is to be destroyed. That's the only kind of + * object returned in node set not directly linked to the original + * xmlDoc document, see xmlXPathNodeSetDupNs. + */ +static void +libxml_xmlXPathDestructNsNode(void *cobj, void *desc ATTRIBUTE_UNUSED) { +#ifdef DEBUG + fprintf(stderr, "libxml_xmlXPathDestructNsNode called %p\n", cobj); +#endif + xmlXPathNodeSetFreeNs((xmlNsPtr) cobj); +} + PyObject * libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj) { @@ -383,8 +402,17 @@ libxml_xmlXPathObjectPtrWrap(xmlXPathObjectPtr obj) ret = PyList_New(obj->nodesetval->nodeNr); for (i = 0; i < obj->nodesetval->nodeNr; i++) { node = obj->nodesetval->nodeTab[i]; - /* TODO: try to cast directly to the proper node type */ - PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node)); + if (node->type == XML_NAMESPACE_DECL) { + PyObject *ns = + PyCObject_FromVoidPtrAndDesc((void *) node, + (char *) "xmlNsPtr", + libxml_xmlXPathDestructNsNode); + PyList_SetItem(ret, i, ns); + /* make sure the xmlNsPtr is not destroyed now */ + obj->nodesetval->nodeTab[i] = NULL; + } else { + PyList_SetItem(ret, i, libxml_xmlNodePtrWrap(node)); + } } } break; |