diff options
author | bloodstalker <thabogre@gmail.com> | 2018-07-15 09:21:55 +0000 |
---|---|---|
committer | bloodstalker <thabogre@gmail.com> | 2018-07-15 09:21:55 +0000 |
commit | bbad61c4d98d11bb8b895be08a2f4994ed0d78f3 (patch) | |
tree | 286d7fdf21896b923a29f8d0c2ca95ddeb0301bc | |
parent | update (diff) | |
download | faultreiber-bbad61c4d98d11bb8b895be08a2f4994ed0d78f3.tar.gz faultreiber-bbad61c4d98d11bb8b895be08a2f4994ed0d78f3.zip |
update
-rwxr-xr-x | main.py | 55 | ||||
-rw-r--r-- | resources/wasm.xml | 2 | ||||
-rw-r--r-- | text.py | 1 |
3 files changed, 55 insertions, 3 deletions
@@ -90,6 +90,16 @@ def get_elem_count(elem, elems): else: return 1 +def get_elem_size(elem, elems): + if "size" in elem.attrib: + try: + if str(int(elem.attrib["size"])) == elem.attrib["size"]: + return int(elem.attrib["size"]) + except ValueError: + return -1 + else: + return 0 + class Argparser(object): def __init__(self): parser = argparse.ArgumentParser() @@ -163,6 +173,14 @@ class CodeGen(object): child_count = get_elem_count(child, self.def_elems + self.read_elems) ref_node_name = type_resolver(child, self.def_elems) ref_node = get_def_node(ref_node_name, self.def_elems) + size = get_elem_size(child, self.def_elems + self.read_elems) + read_size_replacement = str() + if size > 0: + read_size_replacement = str(size) + if size == -1: + ref_size = child.attrib["size"][6:] + for child2 in elem: + if child2.tag == ref_size : read_size_replacement = "dummy." + child2.attrib["name"] if ref_node: ref_node_name = pointer_remover(ref_node.attrib["name"]) for_dummy_declare = ref_node.attrib["name"] + " " + ref_node_name + "_ins" + "=" @@ -183,7 +201,11 @@ class CodeGen(object): read_source.write(text.simple_loop.replace("YYY", for_dummy_declare+for_read+for_dummy_assign).replace("XXX", replacement)) else: for_dummy_declare = ref_node_name + " " + pointer_remover(ref_node_name)+"_ins" + ";\n" - for_read = text.c_read_gen.replace("XXX", pointer_remover(ref_node_name)+"_ins").replace("YYY", pointer_remover(ref_node_name)) + for_read = str() + if "size" in child.attrib: + for_read = text.c_read_gen_2.replace("XXX", pointer_remover(ref_node_name)+"_ins").replace("YYY", read_size_replacement) + else: + for_read = text.c_read_gen.replace("XXX", pointer_remover(ref_node_name)+"_ins").replace("YYY", pointer_remover(ref_node_name)) if child_count == 1: for_dummy_assign = "dummy." + child.attrib["name"] + "=" +pointer_remover(ref_node_name)+"_ins" + ";\n" read_source.write(for_dummy_declare+for_read+for_dummy_assign) @@ -245,6 +267,34 @@ class CodeGen(object): def_header.write("\t" + c_type + " " + childerer.attrib["name"] + ";\n") def_header.write("}" + child.attrib["name"] + ";\n\n") + def gen_struct_header_xml(self): + struct_source = open(get_full_path(self.argparser.args.outdir, "structs.h"), "w") + struct_source_c = open(get_full_path(self.argparser.args.outdir, "structs.c"), "w") + struct_source_c.write('#include "structs.h"') + struct_source.write(text.pre_header_guard) + struct_source.write(text.autogen_warning) + if self.argparser.args.datetime: struct_source.write("// " + self.dnt + "\n") + struct_source.write(text.header_guard_begin.replace("XXX", "structs".upper())) + struct_source.write(text.header_inttype) + if self.argparser.args.structsinclude: + copy(self.argparser.args.structsinclude, self.argparser.args.outdir) + pos = self.argparser.args.structsinclude.rfind("/") + sub = self.argparser.args.structsinclude[pos+1:] + struct_source.write('#include "' + sub + '"\n') + for child in self.def_elems + self.read_elems: + struct_source.write("typedef struct {\n") + for childer in child: + ref_type = type_resolver(childer, self.def_elems + self.read_elems) + def_node = get_def_node(ref_type, self.def_elems + self.read_elems) + if def_node: + struct_source.write(ref_type + " " + childer.attrib["name"] + ";\n") + else: + struct_source.write(ref_type + " " + childer.attrib["name"] + ";\n") + struct_source.write("}" + child.attrib["name"] + ";\n\n") + struct_source.write(text.pragma_endif) + struct_source.write(text.last_comment) + + def gen_struct_header(self): struct_source = open(get_full_path(self.argparser.args.outdir, "structs.h"), "w") struct_source_c = open(get_full_path(self.argparser.args.outdir, "structs.c"), "w") @@ -273,9 +323,10 @@ class CodeGen(object): def run(self): self.init() self.init_hook() - self.gen_struct_header() + #self.gen_struct_header() self.read_xml() self.gen_reader_funcs() + self.gen_struct_header_xml() #self.dump_def_elems() #print("") #self.dump_read_elems() diff --git a/resources/wasm.xml b/resources/wasm.xml index 58ff35c..2ab77ec 100644 --- a/resources/wasm.xml +++ b/resources/wasm.xml @@ -51,7 +51,7 @@ <Definition> <Init_Expr name="init_expr_t" isaggregate="true"> <Size name="size" encoding="leb128u" type="varuint32" count="1"></Size> - <Code name="code" type="string" count="self::Size"></Code> + <Code name="code" type="string" count="1" size="self::Size"></Code> </Init_Expr> <Resizable_Limit name="resizable_limit_t" isaggregate="true"> <Flags name="flags" encoding="leb128u" type="uint8" count="1"></Flags> @@ -26,5 +26,6 @@ class text(): c_read_4 = "read(_fd, &XXX, sizeof(uint32_t));\n" c_read_8 = "read(_fd, &XXX, sizeof(uint64_t));\n" c_read_gen = "read(_fd, &XXX, sizeof(YYY));\n" + c_read_gen_2 = "read(_fd, &XXX, YYY);\n" c_assign_struct = "XXX.YYY = ZZZ;\n" simple_loop = "for (int i = 0; i < XXX; ++i) {\nYYY}\n" |