Ejemplo n.º 1
0
 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)
Ejemplo n.º 2
0
            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())
Ejemplo n.º 3
0
        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())
Ejemplo n.º 4
0
        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))
Ejemplo n.º 5
0
                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())