Commit 36eea2d2 authored by Daniel Veillard's avatar Daniel Veillard
Browse files

hardened the addChild function added accessors needed for xmlNode, a bit

* tree.c: hardened the addChild function
* python/generator.py python/libxml.c python/libxml2-python-api.xml
  python/libxml2class.txt python/libxml_wrap.h python/TODO:
  added accessors needed for xmlNode, a bit more testing and
  extension of interfaces
* python/tests/Makefile.am python/tests/build.py: added a test
  build from scratch/save/load/check
Daniel
parent 4e1b26cf
Mon Feb 4 01:12:42 CET 2002 Daniel Veillard <daniel@veillard.com>
* tree.c: hardened the addChild function
* python/generator.py python/libxml.c python/libxml2-python-api.xml
python/libxml2class.txt python/libxml_wrap.h python/TODO:
added accessors needed for xmlNode, a bit more testing and
extension of interfaces
* python/tests/Makefile.am python/tests/build.py: added a test
build from scratch/save/load/check
Sun Feb 3 21:10:39 CET 2002 Daniel Veillard <daniel@veillard.com>
* parserInternals.c: change a small bit in the way valididy
......
......@@ -350,7 +350,7 @@ def print_function_wrapper(name, output, export, include):
elif py_types.has_key(ret[0]):
(f, t, n, c) = py_types[ret[0]]
c_return = " %s c_retval;\n" % (ret[0])
if file == "python_accessor":
if file == "python_accessor" and ret[2] != None:
c_call = "\n c_retval = %s->%s;\n" % (args[0][0], ret[2])
else:
c_call = "\n c_retval = %s(%s);\n" % (name, c_call);
......@@ -380,6 +380,9 @@ def print_function_wrapper(name, output, export, include):
if file == "python":
# Those have been manually generated
return 1
if file == "python_accessor" and ret[0] != "void" and ret[2] == None:
# Those have been manually generated
return 1
output.write("PyObject *\n")
output.write("libxml_%s(PyObject *self, PyObject *args) {\n" % (name))
......@@ -559,6 +562,9 @@ def nameFixup(function, classe, type, file):
elif name[0:12] == "xmlParserSet" and file == "python_accessor":
func = name[12:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:10] == "xmlNodeGet" and file == "python_accessor":
func = name[10:]
func = string.lower(func[0:1]) + func[1:]
elif name[0:l] == classe:
func = name[l:]
func = string.lower(func[0:1]) + func[1:]
......@@ -690,6 +696,13 @@ if function_classes.has_key("None"):
n = n + 1
classes.write("):\n")
writeDoc(name, args, ' ', classes);
for arg in args:
if classes_type.has_key(arg[1]):
classes.write(" if %s == None: %s__o = None\n" %
(arg[0], arg[0]))
classes.write(" else: %s__o = %s%s\n" %
(arg[0], arg[0], classes_type[arg[1]][0]))
if ret[0] != "void":
classes.write(" ret = ");
else:
......@@ -701,7 +714,7 @@ if function_classes.has_key("None"):
classes.write(", ");
classes.write("%s" % arg[0])
if classes_type.has_key(arg[1]):
classes.write(classes_type[arg[1]][0])
classes.write("__o");
n = n + 1
classes.write(")\n");
if ret[0] != "void":
......@@ -771,6 +784,15 @@ for classname in classes_list:
n = n + 1
classes.write("):\n")
writeDoc(name, args, ' ', classes);
n = 0
for arg in args:
if classes_type.has_key(arg[1]):
if n != index:
classes.write(" if %s == None: %s__o = None\n" %
(arg[0], arg[0]))
classes.write(" else: %s__o = %s%s\n" %
(arg[0], arg[0], classes_type[arg[1]][0]))
n = n + 1
if ret[0] != "void":
classes.write(" ret = ");
else:
......@@ -782,10 +804,12 @@ for classname in classes_list:
classes.write(", ");
if n != index:
classes.write("%s" % arg[0])
if classes_type.has_key(arg[1]):
classes.write("__o");
else:
classes.write("self");
if classes_type.has_key(arg[1]):
classes.write(classes_type[arg[1]][0])
if classes_type.has_key(arg[1]):
classes.write(classes_type[arg[1]][0])
n = n + 1
classes.write(")\n");
if ret[0] != "void":
......
......@@ -808,6 +808,51 @@ libxml_type(PyObject *self, PyObject *args)
return resultobj;
}
/************************************************************************
* *
* Specific accessor functions *
* *
************************************************************************/
PyObject *
libxml_xmlNodeGetNsDefs(PyObject *self, PyObject *args) {
PyObject *py_retval;
xmlNsPtr c_retval;
xmlNodePtr node;
PyObject *pyobj_node;
if (!PyArg_ParseTuple(args, "O:xmlNodeGetNsDefs", &pyobj_node))
return(NULL);
node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
Py_INCREF(Py_None);
return(Py_None);
}
c_retval = node->nsDef;
py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
return(py_retval);
}
PyObject *
libxml_xmlNodeGetNs(PyObject *self, PyObject *args) {
PyObject *py_retval;
xmlNsPtr c_retval;
xmlNodePtr node;
PyObject *pyobj_node;
if (!PyArg_ParseTuple(args, "O:xmlNodeGetNs", &pyobj_node))
return(NULL);
node = (xmlNodePtr) PyxmlNode_Get(pyobj_node);
if ((node == NULL) || (node->type != XML_ELEMENT_NODE)) {
Py_INCREF(Py_None);
return(Py_None);
}
c_retval = node->ns;
py_retval = libxml_xmlNsPtrWrap((xmlNsPtr) c_retval);
return(py_retval);
}
/************************************************************************
* *
* The registration stuff *
......
......@@ -90,5 +90,15 @@
<info>dump the memory allocated in the file .memdump</info>
<return type='void'/>
</function>
<function name='xmlNodeGetNs' file='python_accessor'>
<info>Get the namespace of a node</info>
<return type='xmlNsPtr' info="The namespace or None"/>
<arg name='node' type='xmlNodePtr' info='the node'/>
</function>
<function name='xmlNodeGetNsDefs' file='python_accessor'>
<info>Get the namespace of a node</info>
<return type='xmlNsPtr' info="The namespace or None"/>
<arg name='node' type='xmlNodePtr' info='the node'/>
</function>
</symbols>
</api>
......@@ -155,6 +155,9 @@ checkVersion()
Class xmlNode(xmlCore)
# accessors
ns()
nsDefs()
# functions from module debugXML
lsCountNode()
......
......@@ -15,20 +15,25 @@
#include <libxml/xinclude.h>
#include <libxml/xpointer.h>
#define PyxmlNode_Get(v) (((PyxmlNode_Object *)(v))->obj)
#define PyxmlNode_Get(v) (((v) == Py_None) ? NULL : \
(((PyxmlNode_Object *)(v))->obj))
typedef struct {
PyObject_HEAD
xmlNodePtr obj;
} PyxmlNode_Object;
#define PyxmlXPathContext_Get(v) (((PyxmlXPathContext_Object *)(v))->obj)
#define PyxmlXPathContext_Get(v) (((v) == Py_None) ? NULL : \
(((PyxmlXPathContext_Object *)(v))->obj))
typedef struct {
PyObject_HEAD
xmlXPathContextPtr obj;
} PyxmlXPathContext_Object;
#define PyparserCtxt_Get(v) (((PyparserCtxt_Object *)(v))->obj)
#define PyparserCtxt_Get(v) (((v) == Py_None) ? NULL : \
(((PyparserCtxt_Object *)(v))->obj))
typedef struct {
PyObject_HEAD
xmlParserCtxtPtr obj;
......
EXAMPLE_DIR = $(prefix)/share/doc/libxml2-python-$(LIBXML_VERSION)/examples
TESTS= \
build.py \
tst.py \
tstxpath.py \
xpathext.py \
......
#!/usr/bin/python -u
import libxml2
import sys
# Memory debug specific
libxml2.debugMemory(1)
doc = libxml2.newDoc("1.0")
comment = doc.newDocComment("This is a generated document")
doc.addChild(comment)
pi = libxml2.newPI("test", "PI content")
doc.addChild(pi)
root = doc.newChild(None, "doc", None)
ns = root.newNs("http://example.com/doc", "my")
root.setNs(ns)
elem = root.newChild(None, "foo", "bar")
elem.setBase("http://example.com/imgs")
elem.setProp("img", "image.gif")
doc.saveFile("tmp.xml")
doc.freeDoc()
doc = libxml2.parseFile("tmp.xml")
comment = doc.children
if comment.type != "comment" or \
comment.content != "This is a generated document":
print "error rereading comment"
sys.exit(1)
pi = comment.next
if pi.type != "pi" or pi.name != "test" or pi.content != "PI content":
print "error rereading PI"
sys.exit(1)
root = pi.next
if root.name != "doc":
print "error rereading root"
sys.exit(1)
ns = root.ns()
if ns.name != "my" or ns.content != "http://example.com/doc":
print "error rereading namespace"
sys.exit(1)
elem = root.children
if elem.name != "foo":
print "error rereading elem"
sys.exit(1)
if elem.getBase(None) != "http://example.com/imgs":
print "error rereading base"
sys.exit(1)
if elem.prop("img") != "image.gif":
print "error rereading property"
sys.exit(1)
doc.freeDoc()
# Memory debug specific
libxml2.cleanupParser()
if libxml2.debugMemory(1) == 0:
print "OK"
else:
print "Memory leak %d bytes" % (libxml2.debugMemory(1))
libxml2.dumpMemory()
......@@ -1950,10 +1950,20 @@ xmlNewChild(xmlNodePtr parent, xmlNsPtr ns,
/*
* Allocate a new node
*/
if (ns == NULL)
cur = xmlNewDocNode(parent->doc, parent->ns, name, content);
else
cur = xmlNewDocNode(parent->doc, ns, name, content);
if (parent->type == XML_ELEMENT_NODE) {
if (ns == NULL)
cur = xmlNewDocNode(parent->doc, parent->ns, name, content);
else
cur = xmlNewDocNode(parent->doc, ns, name, content);
} else if ((parent->type == XML_DOCUMENT_NODE) ||
(parent->type == XML_HTML_DOCUMENT_NODE)) {
if (ns == NULL)
cur = xmlNewDocNode((xmlDocPtr) parent, NULL, name, content);
else
cur = xmlNewDocNode((xmlDocPtr) parent, ns, name, content);
} else {
return(NULL);
}
if (cur == NULL) return(NULL);
/*
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment