diff options
| author | bloodstalker <thabogre@gmail.com> | 2018-08-11 20:34:45 +0000 | 
|---|---|---|
| committer | bloodstalker <thabogre@gmail.com> | 2018-08-11 20:34:45 +0000 | 
| commit | 74a133b5c267c17d2e1f9548881fdcab8847e206 (patch) | |
| tree | 5f2460a3b385ebdba5055f77f6f501198635ed18 | |
| parent | readme update (diff) | |
| download | faultreiber-74a133b5c267c17d2e1f9548881fdcab8847e206.tar.gz faultreiber-74a133b5c267c17d2e1f9548881fdcab8847e206.zip | |
fixes #1
Diffstat (limited to '')
| -rwxr-xr-x | main.py | 26 | ||||
| -rw-r--r-- | text.py | 20 | 
2 files changed, 44 insertions, 2 deletions
| @@ -295,6 +295,7 @@ class CodeGen(object):                  dummy_string += ", " + elem.attrib["name"] + "*"  + " dummy_" + elem.attrib["name"]                  read_source.write(static + inline + text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]+pointer))                  read_source.write("dummy = malloc(sizeof(" + elem.attrib["name"] + "));\n") +                read_source.write(text.c_void_manager_proto.replace("XXX", "dummy"));                  self.malloc_list.append(C_Obj(elem.attrib["name"], [elem.tag]))                  count = get_elem_count(elem)                  if count == 1: @@ -320,6 +321,7 @@ class CodeGen(object):                                  if ref_node:                                      read_source.write("if (dummy->" + cond_name + "==" + str(cond.text) + "){\n")                                      read_source.write("dummy->" + cond.attrib["name"] + "=malloc(sizeof(" + ref_node.attrib["name"] + "));") +                                    read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + cond.attrib["name"]));                                      self.malloc_list.append(C_Obj(ref_node.attrib["name"], [elem.tag, child.tag]))                                      if child_count == 1:                                          for_read = text.c_read_elem_sig_2.replace("XXX", ref_node_name).replace("YYY", "dummy->" + cond.attrib["name"]) + ";\n" @@ -331,6 +333,7 @@ class CodeGen(object):                                          count_name_str = cond.attrib["count"][6:]                                          read_source.write("if (" + "dummy->" + get_node_name(count_name_str, elem) + ")\n")                                          read_source.write("dummy->" + cond.attrib["name"] + " = " + "malloc(sizeof(void*)*" + "dummy->" + get_node_name(count_name_str, child) + ");\n") +                                        read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + cond.attri["name"]));                                          self.malloc_list.append(C_Obj("sizeof(void*)*dummy->"+get_node_name(count_name_str, child), [elem.attrib["name"], child.attrib["name"], cond.arrtib["name"]]))                                          for_read = text.c_read_elem_sig_2.replace("XXX", ref_node_name).replace("YYY", "dummy->" + cond.attrib["name"] + "[i]") + ";\n"                                          read_source.write(text.simple_loop.replace("YYY", for_read).replace("XXX", "dummy->" + get_node_name(count_name_str, child))) @@ -338,6 +341,7 @@ class CodeGen(object):                                  else:                                      read_source.write("if (dummy->" + cond_name + "==" + str(cond.text) + "){\n")                                      read_source.write("dummy->" + cond.attrib["name"] + "=malloc(sizeof(" + ref_node_name  + "));") +                                    read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + cond.attrib["name"]));                                      for_read = str()                                      if child_count == 1: array_subscript = ""                                      elif child_count > 1: array_subscript = "[i]" @@ -348,6 +352,7 @@ class CodeGen(object):                                          else:                                              if cond.attrib["name"] == "string":                                                  for_read = "dummy->" + cond.attrib["name"] + " = " + "malloc(" + ref_size + "+1);\n" +                                                read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + cond.attrib["name"]));                                                  for_read += "dummy->" + cond.attrib["name"] + "["+ref_size+"]=" + "0;\n"                                                  for_read = text.c_read_gen_2_no.replace("XXX", "dummy" + "->"+ cond.attrib["name"] + array_subscript).replace("YYY", ref_size)                                              else: @@ -367,6 +372,7 @@ class CodeGen(object):                                      else: # child_count = -1                                          count_name_str = cond.attrib["count"][6:]                                          read_source.write("dummy->" + cond.attrib["name"] + " = " + "malloc(sizeof(" + type_resolver(cond, self.def_elems + self.read_elems)  + ")*" + "dummy->" + get_node_name(count_name_str, elem) + ");\n") +                                        read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + cond.attrib["name"]));                                          read_source.write("if (" + "dummy->" + get_node_name(count_name_str, child) + ")\n")                                          read_source.write(text.simple_loop.replace("YYY", for_read).replace("XXX", "dummy->" + get_node_name(count_name_str, elem)))                                      read_source.write("}\n") @@ -383,6 +389,7 @@ class CodeGen(object):                                  count_name_str = child.attrib["count"][6:]                                  read_source.write("if (" + "dummy->" + get_node_name(count_name_str, elem) + ")\n")                                  read_source.write("dummy->" + child.attrib["name"] + " = " + "malloc(sizeof(void*)*" + "dummy->" + get_node_name(count_name_str, elem) + ");\n") +                                read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + child.attrib["name"]));                                  for_read = text.c_read_elem_sig_2.replace("XXX", ref_node_name).replace("YYY", "dummy->" + child.attrib["name"] + "[i]") + ";\n"                                  read_source.write(text.simple_loop.replace("YYY", "dummy->" + child.attrib["name"] + "[i]=" + for_read).replace("XXX", "dummy->" + get_node_name(count_name_str, elem)))                          else: @@ -399,9 +406,11 @@ class CodeGen(object):                                              delimiter = child.attrib["delimiter"]                                              for_read = "int32_t " + child.attrib["name"] + "_del_pos =" + text.c_read_until_delimiter_proto.replace("XXX", delimiter) + ";\n"                                              for_read += "dummy->" + child.attrib["name"] + "=" + "malloc(" + child.attrib["name"] + "_del_pos);\n" +                                            for_read +=text.c_void_manager_proto.replace("XXX", "dummy->" + child.attrib["name"]);                                              for_read += text.c_read_gen_2_no.replace("XXX", "dummy" + "->"+ child.attrib["name"] + array_subscript).replace("YYY", child.attrib["name"]+"_del_pos")                                          else:                                              for_read = "dummy->" + child.attrib["name"] + " = " + "malloc(" + ref_size + "+1);\n" +                                            for_read += text.c_void_manager_proto.replace("XXX", "dummy->" + child.attrib["name"]);                                              for_read += "dummy->" + child.attrib["name"] + "["+ref_size+"]=" + "0;\n"                                              for_read += text.c_read_gen_2_no.replace("XXX", "dummy" + "->"+ child.attrib["name"] + array_subscript).replace("YYY", ref_size)                                      else: @@ -421,6 +430,7 @@ class CodeGen(object):                              else: # child_count = -1                                  count_name_str = child.attrib["count"][6:]                                  read_source.write("dummy->" + child.attrib["name"] + " = " + "malloc(sizeof(" + type_resolver(child, self.def_elems + self.read_elems)  + ")*" + "dummy->" + get_node_name(count_name_str, elem) + ");\n") +                                read_source.write(text.c_void_manager_proto.replace("XXX", "dummy->" + child.attrib["name"]));                                  read_source.write("if (" + "dummy->" + get_node_name(count_name_str, elem) + ")\n")                                  read_source.write(text.simple_loop.replace("YYY", for_read).replace("XXX", "dummy->" + get_node_name(count_name_str, elem)))                  else: @@ -432,6 +442,7 @@ class CodeGen(object):              else:                  read_source.write(static + inline + text.c_read_elem_sig.replace("YYY", elem.attrib["name"]).replace("XXX", elem.attrib["name"]+pointer))                  read_source.write("dummy = malloc(sizeof(" + elem.attrib["name"] + "));\n") +                read_source.write(text.c_void_manager_proto.replace("XXX", "dummy"));                  read_source.write(text.c_read_gen.replace("XXX", "dummy->" + elem.attrib["name"]).replace("YYY", type_resolver(elem, self.def_elems)))              #read_source.write(text.c_function_return_type)              read_source.write("return dummy;\n") @@ -454,6 +465,9 @@ class CodeGen(object):          void_source.write('#include "./structs.h"\n')          void_source.write('#include "./read.h"\n')          void_source.write("#include <stdlib.h>\n") +        void_source.write("void** void_train;\n") +        void_source.write("uint64_t current_void_size = 0U;\n") +        void_source.write("uint64_t current_void_count = 0U;\n")          #void_source.write("void** void_train(void) {\n")          void_source_h.write('#ifndef FT_AGGREGATE_H\n#define FT_AGGREGATE_H\n')          void_source_h.write('#ifdef __cplusplus\nextern "C" {\n#endif\n') @@ -574,8 +588,9 @@ class CodeGen(object):          agg_source_h = open(self.aggregate_source_h, "a")          agg_source_h.write("void release_all(void);\n")          agg_source.write("void release_all(void) {\n") -        for elem in self.read_elems: -            agg_source.write("free(" + elem.attrib["name"] + "_container);\n") +        agg_source.write("for (int i=current_void_count-1;i>=0;--i) {\n") +        agg_source.write("free(void_train[i]);\n}\n") +        agg_source.write("free(void_train);\n")          agg_source.write("}\n")      def gen_return(self): @@ -634,6 +649,8 @@ class CodeGen(object):          struct_source_c = open(get_full_path(self.argparser.args.outdir, "structs.c"), "w")          struct_source.write("#ifndef FT_STRUCTS_H\n#define FT_STRUCTS_H\n")          struct_source_c.write('#include "structs.h"\n') +        struct_source_c.write('#include "stdlib.h"\n') +        struct_source_c.write('#include "stdio.h"\n')          struct_source.write('#include <unistd.h>\n')          struct_source.write(text.pre_header_guard)          struct_source.write(text.autogen_warning) @@ -646,9 +663,14 @@ class CodeGen(object):          struct_source_c.write(text.c_read_leb_u_def + "\n")          struct_source_c.write(text.c_read_leb_s_def + "\n")          struct_source_c.write(text.c_read_until_delimiter + "\n") +        struct_source_c.write(text.c_void_manager + "\n") +        struct_source.write("extern void** void_train;\n") +        struct_source.write("extern uint64_t current_void_size;\n") +        struct_source.write("extern uint64_t current_void_count;\n")          struct_source.write(text.c_read_leb_128_u_sig + "\n")          struct_source.write(text.c_read_leb_128_s_sig + "\n")          struct_source.write(text.c_read_until_delimiter_sig + "\n") +        struct_source.write(text.c_void_manager_sig + "\n")          #struct_source.write(text.c_read_leb_macro_defs + "\n")          if self.argparser.args.structsinclude:              copy(self.argparser.args.structsinclude, self.argparser.args.outdir) @@ -82,10 +82,30 @@ int32_t read_until_delimiter(int _fd, uint8_t delimiter) {      return pos;    }}  }""" + +    c_void_manager = """ +void void_manager(void* ptr) { +  if (current_void_size == 0) { +    void_train = malloc(100*sizeof(void*)); +    current_void_size = 100; +  } +  if (current_void_count == current_void_size) { +    current_void_size*=2; +    void_train = realloc(void_train, current_void_size*sizeof(void*)); +    if (void_train == NULL) { +      printf("void train couldnt allocate more memory.\\n"); +    } +  } +  void_train[current_void_count] = ptr; +  current_void_count++; +}""" +      c_read_leb_128_s_sig = "int64_t read_leb_128_s(int _fd, int max_size);\n"      c_read_leb_128_u_sig = "uint64_t read_leb_128_u(int _fd, int max_size);\n"      c_read_until_delimiter_sig = "int32_t read_until_delimiter(int _fd, uint8_t delimiter);\n"      c_read_until_delimiter_proto = "read_until_delimiter(_fd, XXX)" +    c_void_manager_sig = "void void_manager(void* ptr);" +    c_void_manager_proto = "void_manager(XXX);"      c_read_leb_macro_defs = """  #define READ_VAR_UINT_1(FD) read_leb128_u(FD, 1) | 
