Update of
/cvsroot/playerstage/code/player/client_libs/libplayerc/bindings/python
In directory
sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv26255/client_libs/libplayerc/bindings/python
Modified Files:
Makefile.am
Added Files:
playerc_swig_parse.py
Removed Files:
parse.py
Log Message:
renamed parse.py and made it an installed script. It is useful for creating
plugable client libs to go with the plugable interfaces
--- parse.py DELETED ---
--- NEW FILE: playerc_swig_parse.py ---
#!/usr/bin/env python
import re
import string
import sys
class Rule:
def __init__(self):
self.patterns = []
self.replacements = []
self.head = ''
self.foot = ''
return
class Replace:
pass
def compile_comment():
"""Compile comment rule."""
rule = Rule()
rule.type = 'comment'
rule.patterns += [re.compile('/\*.*?\*/', re.DOTALL)]
rule.patterns += [re.compile('//.*')]
return [rule]
def compile(prefix):
"""Compute the grammar."""
rules = []
# Create rule for typedefs
#rule = Rule()
#rule.type = 'typedef'
#rule.patterns += [re.compile('\s*\}\s*%s_t\s*;' % prefix)]
#rules += [rule]
# Create rule for constructor
rule = Rule()
rule.type = 'constructor'
rule.patterns += [re.compile('%s_t\s*\*\s*%s_create\s*\(.*?;' % (prefix,
prefix), re.DOTALL)]
rule.head = '\n%%extend %s\n{\n' % prefix
rule.foot = '\n}\n'
rep = Replace()
rep.src = re.compile('\s*%s_create\s*' % (prefix))
rep.dst = '%s' % prefix
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\w*\s*\)' % prefix)
rep.dst = '()'
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\w*\s*,\s*' % prefix)
rep.dst = '('
rule.replacements += [rep]
rules += [rule]
# Create rule for destructor
rule = Rule()
rule.type = 'destructor'
rule.patterns += [re.compile('\w*\s*%s_destroy\s*\(.*?;' % (prefix),
re.DOTALL)]
rule.head = '\n%%extend %s\n{\n' % prefix
rule.foot = '\n}\n'
rep = Replace()
rep.src = re.compile('\w*\s*%s_destroy\s*' % (prefix))
rep.dst = '~%s' % prefix
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\w*\s*\)' % prefix)
rep.dst = '()'
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\w*\s*,\s*' % prefix)
rep.dst = '('
rule.replacements += [rep]
rules += [rule]
# Create rule for regular functions
rule = Rule()
rule.type = 'method'
rule.patterns += [re.compile('\w*\s*%s_\w*\s*\(.*?;' % prefix, re.DOTALL)]
#rule.patterns += [re.compile('\w*\s*%s_[a-zA-Z0-9]*\s*\(.*?;' % prefix,
re.DOTALL)]
rule.patterns += [re.compile('\w*\s*\w*\s*%s_\w*\s*\(.*?;' % prefix,
re.DOTALL)]
#rule.patterns += [re.compile('\w*\s*\w*\s*%s_[a-zA-Z0-9]*\s*\(.*?;' %
prefix, re.DOTALL)]
rule.patterns += [re.compile('\w*\s*\*%s_\w*\s*\(.*?;' % prefix, re.DOTALL)]
#rule.patterns += [re.compile('\w*\s*\*%s_[a-zA-Z0-9]*\s*\(.*?;' % prefix,
re.DOTALL)]
rule.head = '\n%%extend %s\n{\n' % prefix
rule.foot = '\n}\n'
rep = Replace()
rep.src = re.compile('%s_*' % prefix)
rep.dst = ''
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\s*\w*\s*\)' % prefix)
rep.dst = '()'
rule.replacements += [rep]
rep = Replace()
rep.src = re.compile('\(*\s*%s_t\s*\*\s*\w*\s*,\s*' % prefix)
rep.dst = '('
rule.replacements += [rep]
rules += [rule]
return rules
def extract_prefixes(instream):
"""Extract class prefixes."""
# Remove block comments from the file
commentRule = re.compile('/\*.*?\*/', re.DOTALL)
tempstream = commentRule.sub ('', instream)
commentRule = re.compile('//.*')
tempstream = commentRule.sub ('', tempstream)
src = re.compile('playerc_\w*_create')
constructors = src.findall(tempstream)
prefixes = []
for c in constructors:
prefixes += [c[:-7]]
return prefixes
def parse_file(instream, rules):
"""Apply replacement rules."""
outstream = ''
current_struct = None
while instream:
line = instream
m = None
for rule in rules:
# See if this line matches the rule
for pattern in rule.patterns:
m = pattern.match(line)
if m:
break
if not m:
continue
func = line[m.start():m.end()]
# Parse comment blocks
if rule.type == 'comment':
#print instream[m.start():m.end()]
instream = instream[m.end():]
outstream += func
break
# Parse function name and args
(name, sig) = string.split(func, '(', 1)
sig = '(' + sig
tokens = string.split(name)
(rval, name) = (string.join(tokens[:-1]), tokens[-1])
if name[0] == '*':
name = name[1:]
rval = rval + ' *'
#print '%s | %s | %s' % (rval, name, sig)
# Apply replacement rules to return type
if rule.type == 'constructor':
rval = ''
# Apply replacement rules to name
for rep in rule.replacements:
mm = rep.src.search(name)
if not mm:
continue
name = name[:mm.start()] + rep.dst + name[mm.end():]
# Apply replacement rules to signature
for rep in rule.replacements:
mm = rep.src.match(sig)
if not mm:
continue
sig = sig[:mm.start()] + rep.dst + sig[mm.end():]
#print rval, name, sig
outstream += rule.head
outstream += '%s %s %s' % (rval, name, sig)
outstream += rule.foot
instream = instream[m.end():]
break
# If no rule matches
if not m:
outstream += instream[:1]
instream = instream[1:]
return outstream
if __name__ == '__main__':
infilename = sys.argv[1]
outfilename = sys.argv[2]
# Read in the entire file
file = open(infilename, 'r')
instream = file.read()
# Extract "class prefixes" from the header
prefixes = extract_prefixes(instream)
#prefixes = ['playerc_log']
# Compute the grammar
rules = []
rules += compile_comment()
for prefix in prefixes:
print 'prefix: %s' % prefix
rules += compile(prefix)
# Parse the file and appy replacement rules
outstream = parse_file(instream, rules)
# Do some final replacements
for prefix in prefixes:
outstream = string.replace(outstream, '%s_t' % prefix, '%s' % prefix)
guff = ''
for prefix in prefixes:
guff += '%%header\n %%{\ntypedef %s_t %s;\n' % (prefix, prefix)
guff += '#define new_%s %s_create\n' % (prefix, prefix)
guff += '#define del_%s %s_destroy\n%%}\n' % (prefix, prefix)
outstream = guff + outstream
file = open(outfilename, 'w+')
file.write(outstream)
Index: Makefile.am
===================================================================
RCS file:
/cvsroot/playerstage/code/player/client_libs/libplayerc/bindings/python/Makefile.am,v
retrieving revision 1.20
retrieving revision 1.21
diff -C2 -d -r1.20 -r1.21
*** Makefile.am 14 Jun 2006 17:41:27 -0000 1.20
--- Makefile.am 12 Feb 2008 01:12:39 -0000 1.21
***************
*** 10,15 ****
endif
# files that go in distribution
! EXTRA_DIST = playerc.i setup.py parse.py libplayerc_py.html
playercpy_example.py
# Generate a OO interface file for libplayerc. This is tweaked to
--- 10,17 ----
endif
+ dist_bin_SCRIPTS = playerc_swig_parse.py
+
# files that go in distribution
! EXTRA_DIST = playerc.i setup.py libplayerc_py.html playercpy_example.py
# Generate a OO interface file for libplayerc. This is tweaked to
***************
*** 20,24 ****
if test ! -s $(top_builddir)/libplayercore/player.h; then cp
$(top_srcdir)/libplayercore/player.h $(top_builddir)/libplayercore/; fi
if test ! -s playerc.i; then cp $(srcdir)/playerc.i .; fi
! python $(srcdir)/parse.py ../../playerc.h playerc_oo.i
# Dump src and build paths into a Python file so that we can get them in
--- 22,26 ----
if test ! -s $(top_builddir)/libplayercore/player.h; then cp
$(top_srcdir)/libplayercore/player.h $(top_builddir)/libplayercore/; fi
if test ! -s playerc.i; then cp $(srcdir)/playerc.i .; fi
! python $(srcdir)/playerc_swig_parse.py ../../playerc.h playerc_oo.i
# Dump src and build paths into a Python file so that we can get them in
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit