""" 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' % {'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()