summaryrefslogtreecommitdiffstats
path: root/bindings
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2008-04-29 12:01:30 +0000
committerFrederic Peters <fpeters@entrouvert.com>2008-04-29 12:01:30 +0000
commit951991f4f8ebf309d9cb2f8499c63fd44e3869eb (patch)
treed5443a15a2859e597fb79f43c26c8664d128302e /bindings
parenteffa4d926726616b7719745bb633d4dfd8e4744f (diff)
downloadlasso-951991f4f8ebf309d9cb2f8499c63fd44e3869eb.tar.gz
lasso-951991f4f8ebf309d9cb2f8499c63fd44e3869eb.tar.xz
lasso-951991f4f8ebf309d9cb2f8499c63fd44e3869eb.zip
[project @ fpeters@0d.be-20071005100459-r1mm9241ko41pcfv]
python generation (classes, members & methods; missing constructors and layer using python C API) Original author: Frederic Peters <fpeters@0d.be> Date: 2007-10-05 12:04:59.172000+02:00
Diffstat (limited to 'bindings')
-rw-r--r--bindings/lang_python.py130
-rw-r--r--bindings/t.py16
2 files changed, 142 insertions, 4 deletions
diff --git a/bindings/lang_python.py b/bindings/lang_python.py
new file mode 100644
index 00000000..729d3b00
--- /dev/null
+++ b/bindings/lang_python.py
@@ -0,0 +1,130 @@
+import re
+import string
+
+def format_as_python(var):
+ if var[0] in string.uppercase:
+ var = var[0].lower() + var[1:]
+ return var
+
+def format_as_underscored(var):
+ def rep(s):
+ return s.group(0)[0] + '_' + s.group(1).lower()
+ var = re.sub(r'[a-z0-9]([A-Z])', rep, var).lower()
+ var = var.replace('id_wsf2_', 'idwsf2_')
+ var = var.replace('_saslresponse', '_sasl_response')
+ return var
+
+def format_underscore_as_py(var):
+ def rep(s):
+ return s.group(1)[0].upper() + s.group(1)[1:]
+ var = re.sub(r'_([A-Za-z0-9]+)', rep, var)
+ return var
+
+
+class PythonBinding:
+ def __init__(self, binding_data):
+ self.binding_data = binding_data
+
+ def generate(self):
+ fd = open('python/lasso.py', 'w')
+ self.generate_header(fd)
+ for clss in self.binding_data.structs:
+ self.generate_class(clss, fd)
+
+ fd.close()
+
+ def generate_header(self, fd):
+ print >> fd, '''\
+# this file has been generated automatically; do not edit
+
+import _lasso
+
+_lasso.init()
+'''
+
+ def generate_class(self, clss, fd):
+ klassname = clss.name[5:] # remove Lasso from class name
+ if clss.parent == 'GObject':
+ parentname = 'object'
+ else:
+ parentname = clss.parent[5:]
+
+ print >> fd, '''class %(klassname)s(%(parentname)s):''' % locals()
+ if not clss.members and not clss.methods:
+ print >> fd, ' pass'
+ print >> fd, ''
+ return
+
+ # create properties for members
+ for m in clss.members:
+ mname = format_as_python(m[1])
+ print >> fd, ' def get_%s(self):' % mname
+ print >> fd, ' return _lasso.%s_%s_get(self._cptr)' % (
+ klassname, mname)
+ print >> fd, ' def set_%s(self, value):' % mname
+ print >> fd, ' _lasso.%s_%s_set(self._cptr, value)' % (
+ klassname, mname)
+ print >> fd, ' %s = property(get_%s, set_%s)' % (mname, mname, mname)
+ print >> fd, ''
+
+ # first pass on methods, getting accessors
+ methods = clss.methods[:]
+ for m in clss.methods:
+ if not ('_get_' in m.name and len(m.args) == 1):
+ continue
+ methods.remove(m)
+ try:
+ setter_name = m.name.replace('_get_', '_set_')
+ setter = [x for x in methods if x.name == setter_name][0]
+ methods.remove(setter)
+ except IndexError:
+ setter = None
+ mname = re.match(r'lasso_.*_get_(\w+)', m.name).group(1)
+
+ print >> fd, ' def get_%s(self):' % mname
+ print >> fd, ' return _lasso.%s(self._cptr)' % m.name[6:]
+ if setter:
+ print >> fd, ' def set_%s(self, value):' % mname
+ print >> fd, ' _lasso.%s(self._cptr, value)' % setter.name[6:]
+ print >> fd, ' %s = property(get_%s, set_%s)' % (mname, mname, mname)
+ else:
+ print >> fd, ' %s = property(get_%s)' % (mname, mname)
+ print >> fd, ''
+
+ # second pass on methods, real methods
+ method_prefix = 'lasso_' + format_as_underscored(klassname) + '_'
+ for m in methods:
+ if m.name.endswith('_new') or m.name.endswith('_new_from_dump') or \
+ m.name.endswith('_new_full'):
+ continue
+ if not m.name.startswith(method_prefix):
+ print 'W:', m.name, 'vs', method_prefix
+ continue
+
+ mname = m.name[len(method_prefix):]
+ args = ', '.join([x[1] for x in m.args[1:]])
+ if args:
+ args = ', ' + args
+
+ print >> fd, ' def %s(self%s):' % (format_underscore_as_py(mname), args)
+ if m.return_type == 'void':
+ print >> fd, ' _lasso.%s(self._cptr%s)' % (
+ m.name[6:], args)
+ elif m.return_type in ('gint', 'int'):
+ print >> fd, ' rc = _lasso.%s(self._cptr%s)' % (
+ m.name[6:], args)
+ print >> fd, ' if rc == 0:'
+ print >> fd, ' return'
+ print >> fd, ' elif rc > 0:' # recoverable error
+ print >> fd, ' return rc'
+ print >> fd, ' elif rc < 0:' # unrecoverable error
+ print >> fd, ' raise \'XXX(rc)\'' # XXX: exception hierarchy
+ else:
+ print >> fd, ' return _lasso.%s(self._cptr%s)' % (
+ m.name[6:], args)
+ print >> fd, ''
+
+ print >> fd, ''
+
+
+
diff --git a/bindings/t.py b/bindings/t.py
index 69a2e06c..5a459103 100644
--- a/bindings/t.py
+++ b/bindings/t.py
@@ -3,7 +3,9 @@
import os
import re
-class Binding:
+import lang_python
+
+class BindingData:
def __init__(self):
self.constants = []
self.structs = []
@@ -165,6 +167,9 @@ def parse_header(header_file):
f = Function()
binding.functions.append(f)
return_type, function_name, args = m.groups()
+ if function_name[0] == '*':
+ return_type += '*'
+ function_name = function_name[1:]
f.return_type = return_type
f.name = function_name
f.args = []
@@ -196,11 +201,14 @@ def parse_headers():
parse_header(os.path.join(base, filename))
-binding = Binding()
+binding = BindingData()
parse_headers()
binding.order_class_hierarchy()
binding.attach_methods()
+python_binding = lang_python.PythonBinding(binding)
+python_binding.generate()
+
import pprint
-binding.display_structs()
-binding.display_funcs()
+#binding.display_structs()
+#binding.display_funcs()