diff --git a/kaitaistruct.py b/kaitaistruct.py index e3c5df4..24f2dc3 100644 --- a/kaitaistruct.py +++ b/kaitaistruct.py @@ -118,6 +118,9 @@ def size(self): packer_u4le = struct.Struct(' 0 and self._io.write(data) != nb: + raise Exception( + "not all of %d bytes written" % + (nb,) + ) + return nb + + def write_terminator(self, term_byte): + return self._io.write(KaitaiStream.packer_u1.pack(term_byte)) + + def write_padding(self, actual_size, size, pad_byte): + pad = size - actual_size + if pad > 0: + if pad_byte is not None: + return self._io.write(KaitaiStream.packer_u1.pack(pad_byte) * pad) + else: + raise Exception("no padding filler provided") + return 0 + + def write_bytes_term(self, data, size, term_byte, pad_byte): + if data is None or not size: + return + nb = len(data) + if nb < size: + if nb > 0 and self._io.write(data) != nb: + raise Exception( + "not all of %d bytes written" % + (nb,) + ) + else: + raise Exception( + "Writing %d bytes, but %d bytes (including terminator) were given" % + (size, nb + 1) + ) + self.write_terminator(term_byte) + self.write_padding(nb, size - 1, pad_byte) + return size + def read_bytes_full(self): return self._io.read() @@ -302,7 +436,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error): c = self._io.read(1) if c == b'': if eos_error: - raise Exception( + raise EOFError( "end of stream reached, but no terminator %d found" % (term,) )