Ejemplo n.º 1
0
def check_range_validity(range, size):
    begin, end = range
    if end < begin:
        raise InvalidArgumentError("Invalid range[(%#x,%#x)] provided" %
                                   (begin, end))
    elif (begin < 0) or (end >= size):
        raise OutOfBoundsError("Invalid range[(%#x,%#x)] provided" %
                               (begin, end))
Ejemplo n.º 2
0
 def __setitem__(self, key, item):
     if isinstance(key, int) and isinstance(item, (int, int)):
         if item < 0 or item > 0xff:
             raise InvalidArgumentError(
                 "Could not write invalid value[%d] as a single byte" %
                 item)
         if key >= self.size:
             raise OutOfBoundsError(
                 "Attempted to write to offset[%#x] which is out of bounds"
                 % key)
         else:
             self.data[key] = item
     elif isinstance(key, slice) and \
             (isinstance(item, list) or isinstance(item, array.array) or isinstance(item, Block)):
         if key.start > key.stop:
             raise InvalidArgumentError(
                 "Second argument of slice %s must be greater than  the first"
                 % key)
         elif (key.start < 0) or (key.stop - 1 >= self.size):
             raise OutOfBoundsError(
                 "Attempted to write to range (%#x,%#x) which is out of bounds"
                 % (key.start, key.stop - 1))
         elif len(item) != (key.stop - key.start):
             raise InvalidArgumentError(
                 "Attempted to write data of size %d to range of length %d"
                 % (len(item), key.stop - key.start))
         elif (key.stop - key.start) == 0:
             raise InvalidArgumentError("Attempted to write data of size 0")
         else:
             if isinstance(item, list):
                 self.data[key] = array.array('B', item)
             elif isinstance(item, array.array):
                 self.data[key] = item
             elif isinstance(item, Block):
                 self.data[key] = item.data
             else:
                 raise InvalidArgumentError(
                     "Can not write value of type[{}]".format(type(item)))
     else:
         raise TypeError(
             "Arguments \"key\" and \"item\" had invalid types of %s and %s"
             % (type(key).__name__, type(item).__name__))
Ejemplo n.º 3
0
 def write_multi(self, key, item, size):
     if size < 0:
         raise InvalidArgumentError(
             "Attempted to write data of negative length[%d]" % size)
     elif (key < 0) or (key >= self.size) or (key + size > self.size):
         raise OutOfBoundsError(
             "Attempted to write size[%d] bytes to offset[%#x], which is out of bounds in this "
             "block of size[%#x]" % (size, key, self.size))
     elif size == 0:
         return
     else:
         for i in range(key, key + size):
             self.data[i] = item & 0xff
             item >>= 8
Ejemplo n.º 4
0
 def __getitem__(self, key):
     if isinstance(key, slice):
         if key.start > key.stop:
             raise InvalidArgumentError(
                 "Second argument of slice %s must be greater than the first"
                 % key)
         elif (key.start < 0) or (key.stop - 1 >= self.size):
             raise OutOfBoundsError(
                 "Attempted to read from range (%#x,%#x) which is out of bounds"
                 % (key.start, key.stop - 1))
         else:
             out = Block()
             out.from_array(self.data[key])
             return out
     elif isinstance(key, int):
         if key >= self.size:
             raise OutOfBoundsError(
                 "Attempted to read at offset[%#x] which is out of bounds" %
                 key)
         else:
             return self.data[key]
     else:
         raise TypeError("Argument \"key\" had invalid type of %s" %
                         type(key).__name__)
Ejemplo n.º 5
0
 def read_multi(self, key, size):
     if size < 0:
         raise InvalidArgumentError(
             "Attempted to read data of negative length[%d]" % size)
     elif size == 0:
         return 0
     elif (key < 0) or (key >= self.size) or (key + size > self.size):
         raise OutOfBoundsError(
             "Attempted to read size[%d] bytes from offset[%#x], which is out of bounds in this "
             "block of size[%#x]" % (size, key, self.size))
     else:
         out = 0
         bit_offset = 0
         for byte in self.data[key:key + size]:
             out |= byte << bit_offset
             bit_offset += 8
         return out