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
diff --git a/python/generator.py b/python/generator.py
index 3d28200..e665a87 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -350,7 +350,7 @@
     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 @@
     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 @@
     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 @@
 	    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 @@
 		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 @@
 		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 @@
 		    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":