#!/usr/bin/python import string, sys, os.path escapes = {} escapes['\a'] = r'\a' escapes['\b'] = r'\b' escapes['\f'] = r'\f' escapes['\n'] = r'\n' escapes['\r'] = r'\r' #escapes['\t'] = r'\t' # Let's replace tabs with four spaces # so the text looks nicely indented in the C source escapes['\t'] = r' ' escapes['\v'] = r'\v' # escapes['\''] = r'\'' escapes['\"'] = r'\"' escapes['\\'] = r'\\' def escape(c): if c in escapes: return escapes[c] elif c not in string.printable: return "\\x%x" % ord(c) else: return c def stringize(line): newline = '"' for c in line: newline += escape(c) newline += '"' return newline class cfunc: def __init__(self, name, lines): self.name = name self.lines = lines def cdef(self): result = "" result += "static const char * const %s = \n\t" % self.cfunc_name() result += '\n\t'.join(self.lines) result += ';\n' return result def cfunc_name(self): munged_name = string.replace(self.name, '-', '_') return "function_%s" % munged_name funcs = [] for file in sys.argv[1:]: fd = open(file, 'r') newlines = [] for line in fd: newlines.append(stringize(line)) fd.close() name = os.path.basename(file) name, ext = os.path.splitext(name) funcs.append(cfunc(name, newlines)) # Sort our functions by name funcs.sort(key=cfunc.cfunc_name) # Output our header fd = open('builtin_scripts.h', 'w') fd.write('/* This file is generated by internalize_scripts.py */\n\n') fd.write("""struct builtin_script_t { const wchar_t *name; const char *def; };""") fd.write('\n') fd.write('\n') fd.write('extern const struct builtin_script_t internal_function_scripts[%d];\n' % len(funcs)) fd.write('\n') fd.close() # Output the function definitions fd = open('builtin_scripts.cpp', 'w') fd.write('/* This file is generated by internalize_scripts.py */\n\n') fd.write('#include "builtin_scripts.h"\n\n') for func in funcs: fd.write(func.cdef()) fd.write('\n') # Output the refs func_refs = ["{L%s, %s}" % (stringize(func.name), func.cfunc_name()) for func in funcs] fd.write('const struct builtin_script_t internal_function_scripts[%d] =\n' % len(funcs)) fd.write('{\n\t') fd.write(',\n\t'.join(func_refs)) fd.write('\n};\n')