diff options
author | 2012-01-15 00:25:21 -0800 | |
---|---|---|
committer | 2012-01-15 00:25:21 -0800 | |
commit | 1b3427acd9fb01ff2816304c1dc6db6c945e9661 (patch) | |
tree | c24a451a041a96778f45dceb2a81bba86eff8b85 /internalize_scripts.py | |
parent | 60d1ac4fec07320eed6bfb1c0f4729d57b06f79e (diff) |
Changes to make completions internalized scripts.
This about doubles the size of fish. These things are huge. We may not want to ship it like this.
Diffstat (limited to 'internalize_scripts.py')
-rwxr-xr-x | internalize_scripts.py | 73 |
1 files changed, 51 insertions, 22 deletions
diff --git a/internalize_scripts.py b/internalize_scripts.py index 9d9770f1..68a2f648 100755 --- a/internalize_scripts.py +++ b/internalize_scripts.py @@ -1,5 +1,6 @@ #!/usr/bin/python + import string, sys, os.path escapes = {} @@ -11,7 +12,7 @@ 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['\t'] = r' ' escapes['\v'] = r'\v' # escapes['\''] = r'\'' escapes['\"'] = r'\"' @@ -19,21 +20,28 @@ escapes['\\'] = r'\\' def escape(c): if c in escapes: - return escapes[c] + return (escapes[c], False) elif c not in string.printable: - return "\\x%x" % ord(c) + return ("\\x%x" % ord(c), True) else: - return c + return (c, False) def stringize(line): newline = '"' + was_escape = False for c in line: - newline += escape(c) + # Avoid an issue where characters after a hexadecimal escape are treated as part of that escape + # by adding two quotes + if was_escape and c in string.hexdigits: + newline += '""' + chars, was_escape = escape(c) + newline += chars newline += '"' return newline class cfunc: - def __init__(self, name, lines): + def __init__(self, type, name, lines): + self.type = type self.name = name self.lines = lines @@ -45,22 +53,36 @@ class cfunc: return result def cfunc_name(self): - munged_name = string.replace(self.name, '-', '_') - return "function_%s" % munged_name + # Translate - and . to underscore + translator = string.maketrans('-.', '__') + munged_name = string.translate(self.name, translator) + return "%s_%s" % (self.type, munged_name) -funcs = [] +TYPES = ['function', 'completion'] +type_to_funcs = dict((t, []) for t in TYPES) for file in sys.argv[1:]: fd = open(file, 'r') newlines = [] for line in fd: newlines.append(stringize(line)) fd.close() + dirname = os.path.dirname(file) + + # Try to figure out the file type (completion or function) + matches = [dir in dirname for dir in TYPES] + if matches.count(True) is not 1: + print "Cannot determine the type of the file at path %s" % file + sys.exit(-1) + type = TYPES[matches.index(True)] + name = os.path.basename(file) name, ext = os.path.splitext(name) - funcs.append(cfunc(name, newlines)) + newfunc = cfunc(type, name, newlines) + type_to_funcs[type].append(newfunc) # Sort our functions by name -funcs.sort(key=cfunc.cfunc_name) +for funcs in type_to_funcs.itervalues(): + funcs.sort(key=cfunc.cfunc_name) # Output our header fd = open('builtin_scripts.h', 'w') @@ -71,22 +93,29 @@ fd.write("""struct builtin_script_t { };""") fd.write('\n') -fd.write('\n') -fd.write('extern const struct builtin_script_t internal_function_scripts[%d];\n' % len(funcs)) -fd.write('\n') + +for type in TYPES: + funcs = type_to_funcs[type] + fd.write('\n') + fd.write('extern const struct builtin_script_t internal_%s_scripts[%d];' % (type, 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') +for type in TYPES: + for func in type_to_funcs[type]: + 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') +for type in TYPES: + funcs = type_to_funcs[type] + func_refs = ["{L%s, %s}" % (stringize(func.name), func.cfunc_name()) for func in funcs] + fd.write('const struct builtin_script_t internal_%s_scripts[%d] =\n' % (type, len(funcs))) + fd.write('{\n\t') + fd.write(',\n\t'.join(func_refs)) + fd.write('\n};\n') +fd.close() |