diff options
Diffstat (limited to 'codegen/scanvirtuals.py')
-rwxr-xr-x | codegen/scanvirtuals.py | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/codegen/scanvirtuals.py b/codegen/scanvirtuals.py new file mode 100755 index 0000000..c108737 --- /dev/null +++ b/codegen/scanvirtuals.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +import re +import sys + + +def main(): + rx = re.compile(r'^\s*([\w\s\*]+)\(\s*\*\s*(\w+)\s*\)\s*\(([^()]*)\);', + re.DOTALL|re.MULTILINE) + for f in sys.argv[1:]: + #print ";; From", f + buf = file(f).read() + for m in rx.findall(buf): + return_type = m[0].strip() + if 'typedef' in return_type: + continue + if return_type == 'void': + return_type = 'none' + return_type = return_type.replace(' ', '') + virtual_name = m[1] + if 'reserved' in virtual_name: + continue + params = [] + if not m[2]: + print >> sys.stderr, repr(m) + continue + for param in map(str.strip, m[2].split(',')): + if '*' in param: + tokens = param.split('*') + ptype = tokens[0].strip() + '*'*(len(tokens) - 1) + pname = tokens[-1].strip() + else: + if param == 'void': + continue + ptype, pname = map(str.strip, param.split()) + ptype = ptype.replace('const ', 'const-') + while '[]' in pname: + pname = pname.replace('[]', '') + ptype += '[]' + params.append((ptype, pname)) + if not params: + continue + objname = params[0][0].replace('*', '') + print '(define-virtual', virtual_name + print ' (of-object "%s")' % objname + print ' (return-type "%s")' % return_type + if len(params) > 1: + print ' (parameters' + for param in params[1:]: + print ' \'("%s" "%s")' % param + print ' )' + print ')' + +if __name__ == '__main__': + main() |