def create_block_file(self): """create a HunkBlockFile from the segments given""" # setup header block self.hdr_blk = HunkHeaderBlock() blks = [self.hdr_blk] sizes = [] for seg in self.segments: size = seg.create(blks) sizes.append(size) # add HUNK_END blks.append(HunkEndBlock()) # finally setup header self.hdr_blk.setup(sizes) # create HunkBlockFile return HunkBlockFile(blks)
second.append(new_list) elif new_list is not None: new_list.append(blk) else: raise HunkParseError("can't split block list") # check size of hunk table if len(hdr_blk.hunk_table) != len(second): raise HunkParseError("can't match hunks to header") # convert block lists into segments for l in second: seg = HunkSegment() seg.parse(l) self.segments.append(seg) # set size in segments n = len(second) for i in xrange(n): self.segments[i].size_longs = hdr_blk.hunk_table[i] self.segments[i].size = self.segments[i].size_longs * 4 # mini test if __name__ == '__main__': import sys for a in sys.argv[1:]: bf = HunkBlockFile() bf.read_path(a, isLoadSeg=True) print(bf.get_block_type_names()) lsf = HunkLoadSegFile() lsf.parse_block_file(bf) print(lsf.get_segments())
second.append(l) elif n > 1: # list needs split # we can only split if no extra block is before next segment block new_list = None for blk in l: if blk.blk_id in loadseg_valid_begin_hunks: new_list = [blk] second.append(new_list) elif new_list is not None: new_list.append(blk) else: raise HunkParseError("can't split block list") # convert block lists into segments for l in second: seg = HunkSegment() seg.parse(l) self.segments.append(seg) # mini test if __name__ == '__main__': import sys for a in sys.argv[1:]: bf = HunkBlockFile() bf.read_path(a) print(bf.get_block_type_names()) lsf = HunkLoadSegFile() lsf.parse_block_file(bf) print(lsf.get_segments())
for seg in self.segments: size = seg.create(blks) sizes.append(size) # add HUNK_END blks.append(HunkEndBlock()) # finally setup header self.hdr_blk.setup(sizes) # create HunkBlockFile return HunkBlockFile(blks) # mini test if __name__ == '__main__': import sys for a in sys.argv[1:]: bf = HunkBlockFile() bf.read_path(a, isLoadSeg=True) print(bf.get_block_type_names()) lsf = HunkLoadSegFile() lsf.parse_block_file(bf) print(lsf.get_segments()) # write back new_bf = lsf.create_block_file() new_bf.write_path("a.out") # compare read and written stream with open(a, "rb") as fh: data = fh.read() with open("a.out", "rb") as fh: new_data = fh.read() if len(data) != len(new_data): print("MISMATCH", len(data), len(new_data))