more work on the python bindings generator. Daniel

* python/generator.py python/libxml.c python/libxml.py:
  more work on the python bindings generator.
Daniel
diff --git a/python/generator.py b/python/generator.py
index afe9d7a..0eac344 100755
--- a/python/generator.py
+++ b/python/generator.py
@@ -6,6 +6,7 @@
 functions = {}
 
 import os
+import string
 import xmllib
 try:
     import sgmlop
@@ -158,6 +159,7 @@
 
     functions[name] = (desc, ret, args, file)
 
+
 skipped_modules = {
     'xmlmemory': None,
     'DOCBparser': None,
@@ -358,10 +360,12 @@
     ret = print_function_wrapper(function, wrapper, export, include)
     if ret < 0:
         failed = failed + 1
-    if ret == 1:
-        nb_wrap = nb_wrap + 1
+	del functions[function]
     if ret == 0:
         skipped = skipped + 1
+	del functions[function]
+    if ret == 1:
+        nb_wrap = nb_wrap + 1
 include.close()
 export.close()
 wrapper.close()
@@ -369,3 +373,240 @@
 print "Generated %d wrapper functions, %d failed, %d skipped\n" % (nb_wrap,
 							  failed, skipped);
 print "Missing type converters: %s" % (unknown_types.keys())
+
+function_classes = {}
+for name in functions.keys():
+    (desc, ret, args, file) = functions[name]
+    if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == "xmlNodePtr":
+        if name[0:11] == "xmlNodeList":
+	    func = name[11:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	elif name[0:7] == "xmlNode":
+	    func = name[7:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	elif name[0:6] == "xmlGet":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	else:
+	    func = name[3:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+    elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == "xmlNodePtr":
+        if name[0:11] == "xmlNodeList":
+	    func = name[11:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	elif name[0:7] == "xmlNode":
+	    func = name[7:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	elif name[0:6] == "xmlGet":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+	else:
+	    func = name[3:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlNode'):
+		function_classes['xmlNode'].append(info)
+	    else:
+		function_classes['xmlNode'] = [info]
+    elif name[0:3] == "xml" and len(args) >= 1 and args[0][1] == "xmlDocPtr":
+	if name[0:6] == "xmlDoc":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+	elif name[0:6] == "xmlGet":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+	else:
+	    func = name[3:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (0, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+    elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == "xmlDocPtr":
+	if name[0:6] == "xmlDoc":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+	elif name[0:6] == "xmlGet":
+	    func = name[6:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+	else:
+	    func = name[3:]
+	    func = string.lower(func[0:1]) + func[1:]
+	    info = (1, func, name, ret, args, file)
+	    if function_classes.has_key('xmlDoc'):
+		function_classes['xmlDoc'].append(info)
+	    else:
+		function_classes['xmlDoc'] = [info]
+    elif ret[0] == "xmlDocPtr" or ret[0] == "xmlDtdPtr":
+	func = name[3:]
+	func = string.lower(func[0:1]) + func[1:]
+	info = (0, func, name, ret, args, file)
+	if function_classes.has_key('None'):
+	    function_classes['None'].append(info)
+	else:
+	    function_classes['None'] = [info]
+    else:
+        print "unable to guess class for %s:%s" % (file,name)
+
+classes_type = {
+    "xmlNodePtr": ("._o", "xmlNode(_obj=%s)"),
+    "xmlNode *": ("._o", "xmlNode(_obj=%s)"),
+    "xmlDocPtr": ("._o", "xmlDoc(_obj=%s)"),
+    "xmlDocPtr *": ("._o", "xmlDoc(_obj=%s)"),
+    "xmlAttrPtr": ("._o", "xmlNode(_obj=%s)"),
+    "xmlAttr *": ("._o", "xmlNode(_obj=%s)"),
+    "xmlNsPtr": ("._o", "xmlNode(_obj=%s)"),
+    "xmlNs *": ("._o", "xmlNode(_obj=%s)"),
+    "xmlDtdPtr": ("._o", "xmlNode(_obj=%s)"),
+    "xmlDtd *": ("._o", "xmlNode(_obj=%s)"),
+    "xmlEntityPtr": ("._o", "xmlNode(_obj=%s)"),
+    "xmlEntity *": ("._o", "xmlNode(_obj=%s)"),
+}
+
+classes = open("libxml2class.py", "w")
+
+if function_classes.has_key("None"):
+    for info in function_classes["None"]:
+	(index, func, name, ret, args, file) = info
+	classes.write("def %s(" % func)
+	n = 0
+	for arg in args:
+	    if n != 0:
+	        classes.write(", ")
+	    classes.write("%s" % arg[0])
+	    n = n + 1
+	classes.write("):\n")
+	if ret[0] != "void":
+	    classes.write("    ret = ");
+	else:
+	    classes.write("    ");
+	classes.write("_libxml.%s(" % name)
+	n = 0
+	for arg in args:
+	    if n != 0:
+		classes.write(", ");
+	    classes.write("%s" % arg[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":
+	    if classes_type.has_key(ret[0]):
+		classes.write("    if ret == None: return None\n");
+		classes.write("    return ");
+		classes.write(classes_type[ret[0]][1] % ("ret"));
+		classes.write("\n");
+	    else:
+		classes.write("    return ret\n");
+	classes.write("\n");
+
+for classname in function_classes.keys():
+    if classname == "None":
+        pass
+    else:
+	classes.write("class %s(xmlCore):\n" % classname);
+        if classname == "xmlNode":
+	    classes.write("    def __init__(self, _obj=None):\n")
+	    classes.write("        self._o = None\n")
+	    classes.write("        xmlCore.__init__(self, _obj=_obj)\n\n")
+        elif classname == "xmlDoc":
+	    classes.write("    def __init__(self, _obj=None):\n")
+	    classes.write("        self._o = None\n")
+	    classes.write("        xmlCore.__init__(self, _obj=_obj)\n\n")
+	else:
+	    classes.write("    def __init__(self, _obj=None):\n")
+	    classes.write("        if _obj != None:self._o = _obj;return\n")
+	    classes.write("        self._o = None\n\n");
+	for info in function_classes[classname]:
+	    (index, func, name, ret, args, file) = info
+	    classes.write("    def %s(self" % func)
+	    n = 0
+	    for arg in args:
+	        if n != index:
+		    classes.write(", %s" % arg[0])
+		n = n + 1
+	    classes.write("):\n")
+	    if ret[0] != "void":
+	        classes.write("        ret = ");
+	    else:
+	        classes.write("        ");
+	    classes.write("_libxml.%s(" % name)
+	    n = 0
+	    for arg in args:
+	        if n != 0:
+		    classes.write(", ");
+	        if n != index:
+		    classes.write("%s" % arg[0])
+		else:
+		    classes.write("self");
+		if classes_type.has_key(arg[1]):
+		    classes.write(classes_type[arg[1]][0])
+		n = n + 1
+	    classes.write(")\n");
+	    if ret[0] != "void":
+	        if classes_type.has_key(ret[0]):
+		    classes.write("        if ret == None: return None\n");
+		    classes.write("        return ");
+		    classes.write(classes_type[ret[0]][1] % ("ret"));
+		    classes.write("\n");
+		else:
+		    classes.write("        return ret\n");
+	    classes.write("\n");
+
+classes.close()