+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
#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
* daniel@veillard.com
*/
#include "libxml_wrap.h"
+#include <libxml/xpathInternals.h>
PyObject *
libxml_intWrap(int val)
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)
{
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;