fish-shell/internalize_scripts.py
2012-01-03 10:54:06 -08:00

92 lines
2.1 KiB
Python
Executable file

#!/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 char *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 = ["{%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')