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()
diff --git a/python/libxml.c b/python/libxml.c
index 8883c4b..60bd3cb 100644
--- a/python/libxml.c
+++ b/python/libxml.c
@@ -47,6 +47,7 @@
}
/* TODO: look at deallocation */
ret = PyString_FromString(str);
+ xmlFree(str);
return(ret);
}
diff --git a/python/libxml.py b/python/libxml.py
index af96383..259a08b 100644
--- a/python/libxml.py
+++ b/python/libxml.py
@@ -1,26 +1,12 @@
import _libxml
-class xmlNode:
+class xmlCore:
def __init__(self, _obj=None):
if _obj != None:
self._o = _obj;
return
self._o = None
-# def __getattr__(self, attr):
-# attrs = {
-# 'lower': _gtk.gtk_adjustment_get_lower,
-# 'upper': _gtk.gtk_adjustment_get_upper,
-# 'value': _gtk.gtk_adjustment_get_value,
-# 'step_increment': _gtk.gtk_adjustment_get_step_increment,
-# 'page_increment': _gtk.gtk_adjustment_get_page_increment,
-# 'page_size': _gtk.gtk_adjustment_get_page_size
-# }
-# if attrs.has_key(attr):
-# ret = attrs[attr](self._o)
-# if ret == None:
-# return None
-# return attrs[attr](self._o)
def __getattr__(self, attr):
if attr == "parent":
ret = _libxml.parent(self._o)
@@ -107,9 +93,6 @@
def free(self):
_libxml.freeDoc(self._o)
-
-class xmlDoc(xmlNode):
- def __init__(self, file = None, _doc=None):
- if _doc == None and file != None:
- _doc = _libxml.parseFile(file)
- xmlNode.__init__(self, _obj=_doc)
+#
+# Everything below this point is automatically generated
+#