cemu-idapython/pywraps/deploy.py

99 lines
2.8 KiB
Python
Raw Normal View History

"""
Deploy code snips into swig interface files
(c) Hex-Rays
"""
import sys
import re
import os
# creates a regular expression
def make_re(tag, mod_name, prefix):
s = '%(p)s<%(tag)s\(%(m)s\)>(.+?)%(p)s</%(tag)s\(%(m)s\)>' % {'m': mod_name, 'tag': tag, 'p': prefix}
return (s, re.compile(s, re.DOTALL))
def convert_path(path_in):
parts = path_in.split('/')
return os.sep.join(parts)
def deploy(mod_name, src_files, dest_file, silent = True):
dest_file = convert_path(dest_file)
src_files = map(convert_path, src_files)
# create regular expressions
templates = (
('pycode', make_re('pycode', mod_name, '#')),
('code', make_re('code', mod_name, '//')),
('inline', make_re('inline', mod_name, '//'))
)
if not os.path.exists(dest_file):
print "File", dest_file, "does not exist and will be skipped"
return
if not os.access(dest_file, os.W_OK):
print "File", dest_file, "is not writable and will be skipped"
return
# read dest file
dest_lines = "".join(file(dest_file, "r").readlines())
# read all source files into one buffer
src_lines = "".join(["".join(file(x, "r").readlines()) for x in src_files])
pcount = 0
for desc, (expr_str, expr) in templates:
# find source pattern
matches = expr.findall(src_lines)
if not matches:
if not silent:
print "Failed to match <%s> source expression against '%s', skipping...!" % (desc, expr_str)
continue
# find pattern in destination
dest = expr.search(dest_lines)
if not dest:
if not silent:
print "Failed to match <%s> destination expression against '%s', skipping..." % (desc, expr_str)
print dest_lines
sys.exit(0)
continue
# accumulate all the strings to be replaced
replaces = []
for src in matches:
replaces.append(src)
dest_lines = dest_lines[:dest.start(1)] + "\n".join(replaces) + dest_lines[dest.end(1):]
pcount += 1
f = file(dest_file, 'w')
if not f:
print "Failed to open destination file:", dest_file
return
f.write(dest_lines)
f.close()
if pcount:
print "Deployed successfully: %s (%d)" % (dest_file, pcount)
else:
print "Nothing was deployed in: %s" % dest_file
def main(argv = None):
if not argv:
argv = sys.argv
if len(argv) != 4:
print "Usage deploy.py modname src_file1,src_file2,... dest_file"
return
mod_name = argv[1]
src_files = argv[2].split(',')
dest_file = argv[3]
deploy(mod_name, src_files, dest_file)
#main(['', 'py_graph', 'py_graph.hpp,py_graph.py', 'graph.i'])
if __name__ == '__main__':
main()