diff options
-rwxr-xr-x | main.py | 75 | ||||
-rw-r--r-- | resources/wasm.xml | 50 |
2 files changed, 88 insertions, 37 deletions
@@ -14,6 +14,50 @@ import datetime import xml.etree.ElementTree from misc import * +def type_resolver(elem, elem_list): + type_str = elem.attrib["type"] + type_name = elem.attrib["name"] + if type_str == "int8": + return "int8_t" + elif type_str == "uint8": + return "uint8_t" + elif type_str == "int16": + return "int16_t" + elif type_str == "uint16": + return "uint16_t" + elif type_str == "int32": + return "int32_t" + elif type_str == "uint32": + return "uint32_t" + elif type_str == "int64": + return "int64_t" + elif type_str == "uint64": + return "uint64_t" + elif type_str == "int128": + return "int128_t" + elif type_str == "uint128": + return "uint128_t" + elif type_str == "float": + return "float" + elif type_str == "double": + return "double" + elif type_str == "bool": + return "unsigned char" + elif type_str == "uchar": + return "unsigned char" + elif type_str == "schar": + return "signed char" + elif type_str == "string": + return "char*" + elif type_str == "FT::conditional": + return "void*" + elif type_str.find("self::") == 0: + for node in elem_list: + if elem.attrib["type"][6:] == node.tag: + print(node.tag) + return node.attrib["name"] + else: return type_str + def SigHandler_SIGINT(signum, frame): print() sys.exit(0) @@ -33,6 +77,7 @@ class Argparser(object): parser.add_argument("--dbg", action="store_true", help="debug", default=False) parser.add_argument("--datetime", action="store_true", help="print date and time in autogen files", default=False) parser.add_argument("--inline", action="store_true", help="put all reads in sequentially", default=False) + parser.add_argument("--verbose", action="store_true", help="verbose", default=False) self.args = parser.parse_args() def dupemake(path, main_name): @@ -48,6 +93,7 @@ class CodeGen(object): self.argparser = argparser self.struct_json = json.load(open(self.argparser.args.structs)) self.dnt = datetime.datetime.now().isoformat() + self.elems = [] def init_hook(self): pass @@ -60,32 +106,37 @@ class CodeGen(object): def read_xml(self): if self.argparser.args.xml: + def_header = open(self.argparser.args.outdir + "/defines.h", "w") + def_header.write(text.header_inttype + "\n") tree = xml.etree.ElementTree.parse(self.argparser.args.xml) root = tree.getroot() - print(root.tag) - print(root.attrib) read_tree = xml.etree.ElementTree.Element("read") def_tree = xml.etree.ElementTree.Element("def") for child in root: print(child.tag + "--" + repr(child.attrib)) if child.tag == "Read": read_tree = child - print(type(child)) if child.tag == "Definition": def_tree = child - print(type(child)) - print(read_tree.tag) - print(def_tree.tag) read_iter = read_tree.iter(tag=None) def_iter = def_tree.iter(tag=None) for child in def_iter: - print(child.attrib) - for childer in child.iter(tag=None): - print("\t" + childer.tag + "--" + repr(childer.attrib)) + self.elems.append(child) + if "isaggregate" in child.attrib: + def_header.write("typedef struct {\n") + for childerer in child: + c_type = type_resolver(childerer, self.elems) + def_header.write("\t" + c_type + " " + childerer.attrib["name"] + ";\n") + def_header.write("}" + child.attrib["name"] + ";\n\n") for child in read_iter: - print(child.attrib) - for childer in child.iter(tag=None): - print("\t" + childer.tag + "--" + repr(childer.attrib)) + self.elems.append(child) + if "isaggregate" in child.attrib: + def_header.write("typedef struct {\n") + for childerer in child: + print(childerer.tag) + c_type = type_resolver(childerer, self.elems) + def_header.write("\t" + c_type + " " + childerer.attrib["name"] + ";\n") + def_header.write("}" + child.attrib["name"] + ";\n\n") def gen_struct_header(self): struct_source = open(get_full_path(self.argparser.args.outdir, "structs.h"), "w") diff --git a/resources/wasm.xml b/resources/wasm.xml index 5c436cf..5b1220c 100644 --- a/resources/wasm.xml +++ b/resources/wasm.xml @@ -1,52 +1,52 @@ <?xml version="1.0" encoding="UTF-8"?> <wasm:Structure xmlns:wasm="http://www.w3.org/2001/XMLSchema"> <Read> - <Magic_Number size="4"></Magic_Number> - <Version size="4"></Version> - <Type_Section count="1" type="" isaggregate="true"> + <Magic_Number name="magic_number" encoding="leb128u" type="uint32" size="4"></Magic_Number> + <Version name="version" type="uint32" encoding="leb128u" size="4"></Version> + <Type_Section name="W_Type_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> - <Type_Section_Entry count="self::Count"/> + <Type_Section_Entry count="self::Count" type="self::Type_Section_Entry" name="entries"/> </Type_Section> - <Import_Section count="1" type="" isaggregate="true"> + <Import_Section name="W_Import_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Import_Section_Entry" count="self::Count"/> </Import_Section> - <Function_Section count="1" type="" isaggregate="true"> + <Function_Section name="W_Function_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Types name="types" encoding="leb128u" type="uint32" count="self::Count"/> </Function_Section> - <Table_Section count="1" type="" isaggregate="true"> + <Table_Section name="W_Table_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Table_Type" count="self::Count"/> </Table_Section> - <Memory_Section count="1" type="" isaggregate="true"> + <Memory_Section name="W_Memory_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Memory_Type" count="self::Count"/> </Memory_Section> - <Global_Section count="1" type="" isaggregate="true"> + <Global_Section name="W_Global_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Globals name="globals" type="this::Global_Entry" count="self::Count"/> </Global_Section> - <Export_Section count="1" type="" isaggregate="true"> + <Export_Section name="W_Export_Section" count="1" type="" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Export_Entry" count="self::Count"/> </Export_Section> - <Start_Section count="1" type="" isaggregate="true"> + <Start_Section name="W_Start_Section" count="1" isaggregate="true"> <Index name="index" encoding="leb128u" type="uint32" count="1"/> </Start_Section> - <Element_Section count="1" type="" isaggregate="true"> + <Element_Section name="W_Element_Section" count="1" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Element_Segment" count="self::Count"/> </Element_Section> - <Code_Section count="1" type="" isaggregate="true"> + <Code_Section name="W_Code_Section" count="1" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Bodies name="bodies" type="self::Function_Body" count="self::Count"/> </Code_Section> - <Data_Section count="1" type="" isaggregate="true"> + <Data_Section name="W_Data_Section" count="1" isaggregate="true"> <Count name="count" encoding="leb128u" type="uint32" count="1"/> <Entries name="entries" type="self::Data_Segment" count="self::Count"/> </Data_Section> - <Custom_Section count="1" type="" isaggregate="true"></Custom_Section> + <Custom_Section name="W_Custom_Section" count="1" isaggregate="true"></Custom_Section> </Read> <Definition> <Init_Expr name="init_expr_t" isaggregate="true"> @@ -64,10 +64,10 @@ </Global_Type> <Table_Type name="table_type_t" isaggregate="true"> <Element_Type name="element_type" encoding="leb128s" type="int8" count="1"></Element_Type> - <Resizable_Limit count="1"></Resizable_Limit> + <Resizable_Limit name="resizable_limit" count="1" type="self::Resizable_Limit"></Resizable_Limit> </Table_Type> <Memory_Type name="memory_type_t" isaggregate="true"> - <Resizable_Limit count="1"></Resizable_Limit> + <Resizable_Limit count="1" type="self::Resizable_Limit" name="resizable_limit"></Resizable_Limit> </Memory_Type> <Type_Section_Entry name="W_Type_Section_Entry" isaggregate="true"> <Form name="form" encoding="leb128s" type="int8" count="1"/> @@ -82,14 +82,14 @@ <Field_Len name="field_len" encoding="leb128u" type="uint32" couny="1"/> <Field_Str name="field_str" type="string" count="1" size="self::Field_Len"/> <Kind name="kind" encoding="leb128u" type="uint8" count="1"/> - <Type name="type" conditional="true" condition="self::Kind"> - <condition0 encoding="leb128u" type="uint32">0</condition0> - <condition1 type="Table_Type">1</condition1> - <condition2 type="Memory_Type">2</condition2> - <condition3 type="Global_Type">3</condition3> + <Type name="type" conditional="true" condition="self::Kind" type="FT::conditional"> + <condition0 name="type" encoding="leb128u" type="uint32">0</condition0> + <condition1 name="type" type="self::Table_Type">1</condition1> + <condition2 name="type" type="self::Memory_Type">2</condition2> + <condition3 name="type" type="self::Global_Type">3</condition3> </Type> </Import_Section_Entry> - <Global_Entry name="global_type_t" isaggregate="true"> + <Global_Entry name="W_Global_Entry" isaggregate="true"> <Global_Type name="type" type="self::Global_Type" count="1"/> <Init name="init" type="self::Init_Expr" count="1"/> </Global_Entry> @@ -112,10 +112,10 @@ <Function_Body name="W_Function_Body" isaggregate="true"> <Body_size name="body_size" encoding="leb128u" type="uint32" count="1"/> <Local_Count name="local_count" encoding="leb128u" type="uint32" count="1"/> - <Local_Entries name="locals" type="Local_Entry" count="self::Local_Count"/> + <Local_Entries name="locals" type="self::Local_Entry" count="self::Local_Count"/> <Code name="code" type="uchar" count="self::Body_size"/> </Function_Body> - <Data_Segment> + <Data_Segment name="W_Data_Segment" isaggregate="true"> <Index name="index" encoding="leb128u" type="uint32" count="1"/> <Offset name="offset" type="self::Init_Expr" count="1"/> <Size name="size" encoding="leb128u" type="uint32" count="1"/> |