aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/buildcommands.py68
1 files changed, 42 insertions, 26 deletions
diff --git a/scripts/buildcommands.py b/scripts/buildcommands.py
index e73bd1c7..488b4ece 100644
--- a/scripts/buildcommands.py
+++ b/scripts/buildcommands.py
@@ -22,6 +22,42 @@ def error(msg):
sys.stderr.write(msg + "\n")
sys.exit(-1)
+Handlers = []
+
+
+######################################################################
+# C call list generation
+######################################################################
+
+# Create dynamic C functions that call a list of other C functions
+class HandleCallList:
+ def __init__(self):
+ self.call_lists = {'ctr_run_initfuncs': []}
+ self.ctr_dispatch = { '_DECL_CALLLIST': self.decl_calllist }
+ def decl_calllist(self, req):
+ funcname, callname = req.split()[1:]
+ self.call_lists.setdefault(funcname, []).append(callname)
+ def update_data_dictionary(self, data):
+ pass
+ def generate_code(self):
+ code = []
+ for funcname, funcs in self.call_lists.items():
+ func_code = [' extern void %s(void);\n %s();' % (f, f)
+ for f in funcs]
+ if funcname == 'ctr_run_taskfuncs':
+ func_code = [' irq_poll();\n' + fc for fc in func_code]
+ fmt = """
+void
+%s(void)
+{
+ %s
+}
+"""
+ code.append(fmt % (funcname, "\n".join(func_code).strip()))
+ return "".join(code)
+
+Handlers.append(HandleCallList())
+
######################################################################
# Command and output parser generation
@@ -118,23 +154,6 @@ ctr_lookup_static_string(const char *str)
"""
return fmt % ("".join(code).strip(),)
-def build_call_lists(call_lists):
- code = []
- for funcname, funcs in call_lists.items():
- func_code = [' extern void %s(void);\n %s();' % (f, f)
- for f in funcs]
- if funcname == 'ctr_run_taskfuncs':
- func_code = [' irq_poll();\n' + fc for fc in func_code]
- fmt = """
-void
-%s(void)
-{
- %s
-}
-"""
- code.append(fmt % (funcname, "\n".join(func_code).strip()))
- return "".join(code)
-
def build_param_types(all_param_types):
sorted_param_types = sorted([(i, a) for a, i in all_param_types.items()])
params = ['']
@@ -318,8 +337,8 @@ def main():
encoders = []
static_strings = []
constants = {}
- call_lists = {'ctr_run_initfuncs': []}
# Parse request file
+ ctr_dispatch = { k: v for h in Handlers for k, v in h.ctr_dispatch.items() }
f = open(incmdfile, 'rb')
data = f.read()
f.close()
@@ -330,7 +349,9 @@ def main():
continue
cmd = parts[0]
msg = req[len(cmd)+1:]
- if cmd == '_DECL_COMMAND':
+ if cmd in ctr_dispatch:
+ ctr_dispatch[cmd](req)
+ elif cmd == '_DECL_COMMAND':
funcname, flags, msgname = parts[1:4]
if msgname in commands:
error("Multiple definitions for command '%s'" % msgname)
@@ -359,10 +380,6 @@ def main():
if name in constants and constants[name] != value:
error("Conflicting definition for constant '%s'" % name)
constants[name] = value
- elif cmd == '_DECL_CALLLIST':
- funcname, callname = parts[1:]
- cl = call_lists.setdefault(funcname, [])
- cl.append(callname)
else:
error("Unknown build time command '%s'" % cmd)
# Create unique ids for each message type
@@ -377,7 +394,6 @@ def main():
all_param_types = {}
parsercode = build_encoders(encoders, msg_to_id, all_param_types)
static_strings_code = build_static_strings(static_strings)
- call_lists_code = build_call_lists(call_lists)
# Create command definitions
cmd_by_id = dict((msg_to_id[messages_by_name.get(msgname, msgname)], cmd)
for msgname, cmd in commands.items())
@@ -394,8 +410,8 @@ def main():
static_strings, constants, version, toolstr)
# Write output
f = open(outcfile, 'wb')
- f.write(FILEHEADER + call_lists_code + static_strings_code
- + paramcode + parsercode + cmdcode + icode)
+ f.write(FILEHEADER + "".join([h.generate_code() for h in Handlers])
+ + static_strings_code + paramcode + parsercode + cmdcode + icode)
f.close()
# Write data dictionary