mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-06-13 07:21:13 -03:00
Added internalize_scripts.py in preparation for ending reliance on "standard" scripts in /usr/local/share
This commit is contained in:
92
internalize_scripts.py
Executable file
92
internalize_scripts.py
Executable file
@@ -0,0 +1,92 @@
|
||||
#!/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 builtin_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 builtin_scripts[%d] =\n' % len(funcs))
|
||||
fd.write('{\n\t')
|
||||
fd.write(',\n\t'.join(func_refs))
|
||||
fd.write('\n};\n')
|
||||
Reference in New Issue
Block a user