summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--libxslt/win32config.h2
-rw-r--r--python/types.c32
3 files changed, 38 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 55669045..8e702e86 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;