aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rwxr-xr-xmain.py94
-rwxr-xr-xrun.sh2
-rw-r--r--text.py1
3 files changed, 63 insertions, 34 deletions
diff --git a/main.py b/main.py
index 3e77750..1b22f6e 100755
--- a/main.py
+++ b/main.py
@@ -13,6 +13,7 @@ from text import text
import datetime
import xml.etree.ElementTree
from misc import *
+import datetime
# TODO-doesnt support non-byte-sized reads
def type_resolver(elem, elem_list):
@@ -63,6 +64,11 @@ def get_def_node(type_str, elem_list):
if type_str == node.attrib["name"]:
return node
+def pointer_remover(name:str):
+ if name[-1] == '*': return name[0:-1] + '_p'
+ else: return name
+
+
def reader_generator(elem, elem_list):
pass
@@ -74,6 +80,24 @@ def get_full_path(path, name):
if path[-1] == "/": return path + name
else: return path + "/" + name
+def get_elem_count(elem, elems):
+ if "count" in elem.attrib:
+ print(elem.attrib["count"])
+ try:
+ if str(int(elem.attrib["count"])) == elem.attrib["count"]:
+ return int(elem.attrib["count"])
+ except ValueError:
+ return -1
+ else:
+ return 1
+
+def gen_count_reader(source_file, elem, elems):
+ count_simple = get_elem_count(elem, elems)
+ if count_simple > -1:
+ return True,count_simple
+ else:
+ return False,-1
+
class Argparser(object):
def __init__(self):
parser = argparse.ArgumentParser()
@@ -84,7 +108,8 @@ class Argparser(object):
parser.add_argument("--xml", type=str, help="paht to the xml file")
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("--inline", action="store_true", help="inlines reader funcs", default=False)
+ parser.add_argument("--static", action="store_true", help="statics reader funcs", default=False)
parser.add_argument("--verbose", action="store_true", help="verbose", default=False)
self.args = parser.parse_args()
@@ -130,41 +155,42 @@ class CodeGen(object):
def gen_reader_funcs(self):
read_source = open(self.argparser.args.outdir + "/read.c", "w")
+ read_source.write("\n// automatically generated by faultrieber\n")
+ read_source.write("// " + self.dnt + "\n")
read_source.write(text.header_list)
- for elem in self.def_elems:
- read_source.write(text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]))
- read_source.write(text.c_function_dummy_dec.replace("XXX", elem.attrib["name"]))
- if "isaggregate" in elem.attrib:
- for child in elem:
- ref_node_name = type_resolver(child, self.def_elems)
- ref_node = get_def_node(ref_node_name, self.def_elems)
- if ref_node:
- read_source.write(ref_node.attrib["name"] + " " + ref_node.attrib["name"] + "_ins" + "=")
- read_source.write(text.c_read_elem_sig_1.replace("XXX", ref_node.attrib["name"]) + ";\n")
- read_source.write("dummy." + child.attrib["name"] + "=" +ref_node.attrib["name"]+"_ins" + ";\n")
- else:
- read_source.write(ref_node_name + " " + ref_node_name+"_ins" + ";\n")
- read_source.write(text.c_read_gen.replace("XXX", ref_node_name+"_ins").replace("YYY", ref_node_name))
- read_source.write("dummy." + child.attrib["name"] + "=" +ref_node_name+"_ins" + ";\n")
- else:
- read_source.write(type_resolver(elem, self.elems) + " " + elem.attrib["name"] + ";\n")
- read_source.write(text.c_function_return_type)
- read_source.write(text.c_function_close + "\n")
- for elem in self.read_elems:
- read_source.write(text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]))
+ inline = "inline " if self.argparser.args.inline else ""
+ static = "static " if self.argparser.args.static else ""
+ for elem in self.def_elems+ self.read_elems:
+ read_source.write(static + inline + text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]))
read_source.write(text.c_function_dummy_dec.replace("XXX", elem.attrib["name"]))
if "isaggregate" in elem.attrib:
- for child in elem:
- ref_node_name = type_resolver(child, self.def_elems)
- ref_node = get_def_node(ref_node_name, self.def_elems)
- if ref_node:
- read_source.write(ref_node.attrib["name"] + " " + ref_node.attrib["name"] + "_ins" + "=")
- read_source.write(text.c_read_elem_sig_1.replace("XXX", ref_node.attrib["name"]) + ";\n")
- read_source.write("dummy." + child.attrib["name"] + "=" +ref_node.attrib["name"]+"_ins" + ";\n")
- else:
- read_source.write(ref_node_name + " " + ref_node_name+"_ins" + ";\n")
- read_source.write(text.c_read_gen.replace("XXX", ref_node_name+"_ins").replace("YYY", ref_node_name))
- read_source.write("dummy." + child.attrib["name"] + "=" +ref_node_name+"_ins" + ";\n")
+ count = get_elem_count(elem, self.read_elems+self.def_elems)
+ if count == 1:
+ for child in elem:
+ 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)
+ if ref_node:
+ ref_node_name = pointer_remover(ref_node.attrib["name"])
+ for_dummy_declare = ref_node.attrib["name"] + " " + ref_node_name + "_ins" + "="
+ for_read = text.c_read_elem_sig_1.replace("XXX", ref_node_name) + ";\n"
+ if child_count == 1:
+ for_dummy_assign = "dummy." + child.attrib["name"] + "=" +ref_node_name+"_ins" + ";\n"
+ read_source.write(for_dummy_declare+for_read+for_dummy_assign)
+ else:
+ for_dummy_assign = "dummy." + child.attrib["name"] + "[i]" + "=" +ref_node_name+"_ins" + ";\n"
+ read_source.write(text.simple_loop.replace("YYY", for_dummy_declare+for_read+for_dummy_assign))
+ 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))
+ 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)
+ else:
+ for_dummy_assign = "dummy." + child.attrib["name"] + "[i]" + "=" +pointer_remover(ref_node_name)+"_ins" + ";\n"
+ read_source.write(text.simple_loop.replace("YYY", for_dummy_declare+for_read+for_dummy_assign))
+ else:
+ pass
else:
read_source.write(type_resolver(elem, self.elems) + " " + elem.attrib["name"] + ";\n")
read_source.write(text.c_function_return_type)
@@ -173,6 +199,8 @@ 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("\n// automatically generated by faultreiber\n")
+ def_header.write("// " + self.dnt + "\n")
def_header.write(text.header_inttype + "\n")
tree = xml.etree.ElementTree.parse(self.argparser.args.xml)
root = tree.getroot()
diff --git a/run.sh b/run.sh
index 276d2df..9f4aa0d 100755
--- a/run.sh
+++ b/run.sh
@@ -1,3 +1,3 @@
#!/bin/sh
cd $(dirname $0)
-"./faultreiber.py" --targetname autowasm --outdir ./test/ --structs ./test/struct.json --datetime --structsinclude ./resources/structsinclude.h --xml ./resources/wasm.xml
+"./faultreiber.py" --targetname autowasm --outdir ./test/ --structs ./test/struct.json --datetime --structsinclude ./resources/structsinclude.h --xml ./resources/wasm.xml --inline
diff --git a/text.py b/text.py
index d3ca5fc..7ea8a73 100644
--- a/text.py
+++ b/text.py
@@ -27,3 +27,4 @@ class text():
c_read_8 = "read(_fd, &XXX, sizeof(uint64_t));\n"
c_read_gen = "read(_fd, &XXX, sizeof(YYY));\n"
c_assign_struct = "XXX.YYY = ZZZ;\n"
+ simple_loop = "for (int i = 0; i < XXX; ++i) {\nYYY}\n"