diff options
author | Uli Schlachter <psychon@znc.in> | 2015-03-24 20:21:31 +0100 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2015-03-24 20:21:31 +0100 |
commit | 71b018acc7e2719f8404b628fcff725521716af7 (patch) | |
tree | 8c3c58d12a782a338423b85dde10a9cd2313c5f4 /src | |
parent | 92123f9f80580a3e356c2e9a8fd61a0fc83850c4 (diff) |
Add a first version of the code generator
Signed-off-by: Uli Schlachter <psychon@znc.in>
Diffstat (limited to 'src')
-rwxr-xr-x | src/extensions.py | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/extensions.py b/src/extensions.py new file mode 100755 index 0000000..7ea3637 --- /dev/null +++ b/src/extensions.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python3 +import sys +from xml.etree.cElementTree import parse + +class Module(object): + def __init__(self, filename): + self.errors = {} + self.requests = {} + self.events = {} + + root = parse(filename).getroot() + if root.get("header") == "xproto": + self.xname = "xproto" + self.name = "xproto" + self.is_ext = False + else: + self.xname = root.get("extension-xname") + self.name = root.get("extension-name") + self.is_ext = True + + for elt in list(root): + tag = elt.tag + if tag == "error" or tag == "event": + name = elt.get("name") + number = int(elt.get("number")) + if tag == "error": + self.errors[number] = name + else: + self.events[number] = name + elif tag == "request": + name = elt.get("name") + opcode = int(elt.get("opcode")) + self.requests[opcode] = name + + self.errors_table = self.handle_type("error", self.errors) + self.requests_table = self.handle_type("request", self.requests) + self.events_table = self.handle_type("event", self.events) + + def handle_type(self, kind, entries): + # Do we have any entries at all? + if not entries: + return + + num_entries = 1 + max(num for num in entries) + if not self.is_ext: + num_entries = 256 + names = [ "Unknown (" + str(i) + ")" for i in range(0, num_entries)] + for key in entries: + if key < 0: + print("%s: Ignoring invalid %s %s (%d)" % (self.name, kind, entries[key], key)) + else: + names[key] = entries[key] + return names + +modules = [] +def parseFile(filename): + modules.append(Module(filename)) + +# Parse the xml file +output_file = sys.argv[1] +for input_file in sys.argv[2:]: + parseFile(input_file) + +output = open(output_file, "w") +output.write("#include \"errors.h\"\n") + +def format_strings(name, table): + if table is None: + output.write("\t.num_%s = 0,\n" % name) + output.write("\t.strings_%s = NULL,\n" % name) + else: + output.write("\t.num_%s = %d,\n" % (name, len(table))) + output.write("\t.strings_%s = \"%s\\0\",\n" % (name, "\\0".join(table))) + +for module in modules: + t = "" + if module.is_ext: + t = "static " + output.write("%sconst struct static_extension_info_t extension_%s_info = { // %s\n" % (t, module.name, module.xname)) + format_strings("minor", module.requests_table) + format_strings("events", module.events_table) + format_strings("errors", module.errors_table) + output.write("};\n\n") + +output.close() |