patch from Rob Richards for VS 2008 fix a problem with namespace nodes
authorDaniel Veillard <veillard@src.gnome.org>
Thu, 13 Mar 2008 08:39:24 +0000 (08:39 +0000)
committerDaniel Veillard <veillard@src.gnome.org>
Thu, 13 Mar 2008 08:39:24 +0000 (08:39 +0000)
* libxslt/win32config.h: patch from Rob Richards for VS 2008
* python/types.c: fix a problem with namespace nodes coming from
  XPath nodesets.
Daniel

svn path=/trunk/; revision=1458

ChangeLog
libxslt/win32config.h
python/types.c

index 5566904..8e702e8 100644 (file)
--- 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
index 9f40128..169b03d 100644 (file)
@@ -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
index 6416354..621891e 100644 (file)
@@ -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;