aboutsummaryrefslogtreecommitdiffhomepage
path: root/internalize_scripts.py
diff options
context:
space:
mode:
authorGravatar Peter Ammon <corydoras@ridiculousfish.com>2012-01-15 00:25:21 -0800
committerGravatar Peter Ammon <corydoras@ridiculousfish.com>2012-01-15 00:25:21 -0800
commit1b3427acd9fb01ff2816304c1dc6db6c945e9661 (patch)
treec24a451a041a96778f45dceb2a81bba86eff8b85 /internalize_scripts.py
parent60d1ac4fec07320eed6bfb1c0f4729d57b06f79e (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-xinternalize_scripts.py73
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()