@@ -118,6 +118,9 @@ def size(self):
118118 packer_u4le = struct .Struct ('<I' )
119119 packer_u8le = struct .Struct ('<Q' )
120120
121+ # ------------------------------------------------------------------------
122+ # Reading
123+ # ------------------------------------------------------------------------
121124 # ------------------------------------------------------------------------
122125 # Signed
123126 # ------------------------------------------------------------------------
@@ -213,6 +216,95 @@ def read_f4le(self):
213216 def read_f8le (self ):
214217 return KaitaiStream .packer_f8le .unpack (self .read_bytes (8 ))[0 ]
215218
219+ # ------------------------------------------------------------------------
220+ # Writing
221+ # ------------------------------------------------------------------------
222+ # ------------------------------------------------------------------------
223+ # Signed
224+ # ------------------------------------------------------------------------
225+
226+ def write_s1 (self , data ):
227+ return self .write_bytes (KaitaiStream .packer_s1 .pack (data ))
228+
229+ # ........................................................................
230+ # Big-endian
231+ # ........................................................................
232+
233+ def write_s2be (self , data ):
234+ return self .write_bytes (KaitaiStream .packer_s2be .pack (data ))
235+
236+ def write_s4be (self , data ):
237+ return self .write_bytes (KaitaiStream .packer_s4be .pack (data ))
238+
239+ def write_s8be (self , data ):
240+ return self .write_bytes (KaitaiStream .packer_s8be .pack (data ))
241+
242+ # ........................................................................
243+ # Little-endian
244+ # ........................................................................
245+
246+ def write_s2le (self , data ):
247+ return self .write_bytes (KaitaiStream .packer_s2le .pack (data ))
248+
249+ def write_s4le (self , data ):
250+ return self .write_bytes (KaitaiStream .packer_s4le .pack (data ))
251+
252+ def write_s8le (self , data ):
253+ return self .write_bytes (KaitaiStream .packer_s8le .pack (data ))
254+
255+ # ------------------------------------------------------------------------
256+ # Unsigned
257+ # ------------------------------------------------------------------------
258+
259+ def write_u1 (self , data ):
260+ return self .write_bytes (KaitaiStream .packer_u1 .pack (data ))
261+
262+ # ........................................................................
263+ # Big-endian
264+ # ........................................................................
265+
266+ def write_u2be (self , data ):
267+ return self .write_bytes (KaitaiStream .packer_u2be .pack (data ))
268+
269+ def write_u4be (self , data ):
270+ return self .write_bytes (KaitaiStream .packer_u4be .pack (data ))
271+
272+ def write_u8be (self , data ):
273+ return self .write_bytes (KaitaiStream .packer_u8be .pack (data ))
274+
275+ # ........................................................................
276+ # Little-endian
277+ # ........................................................................
278+
279+ def write_u2le (self , data ):
280+ return self .write_bytes (KaitaiStream .packer_u2le .pack (data ))
281+
282+ def write_u4le (self , data ):
283+ return self .write_bytes (KaitaiStream .packer_u4le .pack (data ))
284+
285+ def write_u8le (self , data ):
286+ return self .write_bytes (KaitaiStream .packer_u8le .pack (data ))
287+
288+ # ........................................................................
289+ # Big-endian
290+ # ........................................................................
291+
292+ def write_f4be (self , data ):
293+ return self .write_bytes (KaitaiStream .packer_f4be .pack (data ))
294+
295+ def write_f8be (self , data ):
296+ return self .write_bytes (KaitaiStream .packer_f8be .pack (data ))
297+
298+ # ........................................................................
299+ # Little-endian
300+ # ........................................................................
301+
302+ def write_f4le (self , data ):
303+ return self .write_bytes (KaitaiStream .packer_f4le .pack (data ))
304+
305+ def write_f8le (self , data ):
306+ return self .write_bytes (KaitaiStream .packer_f8le .pack (data ))
307+
216308 # ========================================================================
217309 # Unaligned bit values
218310 # ========================================================================
@@ -293,6 +385,45 @@ def read_bytes(self, n):
293385 )
294386 return r
295387
388+ def write_bytes (self , data ):
389+ if data is None :
390+ return
391+ nb = len (data )
392+ if nb > 0 and self ._io .write (data ) != nb :
393+ raise ValidationFailedError (
394+ "not all of %d bytes written" %
395+ (nb ,), self ._io , __file__
396+ )
397+
398+ def write_terminator (self , term_byte ):
399+ self ._io .write (KaitaiStream .packer_u1 .pack (term_byte ))
400+
401+ def write_padding (self , actual_size , size , pad_byte ):
402+ pad = size - actual_size
403+ if pad > 0 :
404+ if pad_byte is not None :
405+ self ._io .write (KaitaiStream .packer_u1 .pack (pad_byte ) * pad )
406+ else :
407+ raise KaitaiStructError ("no padding filler provided" , __file__ )
408+
409+ def write_bytes_term (self , data , size , term_byte , pad_byte ):
410+ if data is None or not size :
411+ return
412+ nb = len (data )
413+ if nb < size :
414+ if nb > 0 and self ._io .write (data ) != nb :
415+ raise ValidationFailedError (
416+ "not all of %d bytes written" %
417+ (nb ,), self ._io , __file__
418+ )
419+ else :
420+ raise ValidationFailedError (
421+ "Writing %d bytes, but %d bytes (including terminator) were given" %
422+ (size , nb + 1 ), self ._io , __file__
423+ )
424+ self .write_terminator (term_byte )
425+ self .write_padding (nb , size - 1 , pad_byte )
426+
296427 def read_bytes_full (self ):
297428 return self ._io .read ()
298429
@@ -302,7 +433,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
302433 c = self ._io .read (1 )
303434 if c == b'' :
304435 if eos_error :
305- raise Exception (
436+ raise EOFError (
306437 "end of stream reached, but no terminator %d found" %
307438 (term ,)
308439 )
@@ -320,10 +451,7 @@ def read_bytes_term(self, term, include_term, consume_term, eos_error):
320451 def ensure_fixed_contents (self , expected ):
321452 actual = self ._io .read (len (expected ))
322453 if actual != expected :
323- raise Exception (
324- "unexpected fixed contents: got %r, was waiting for %r" %
325- (actual , expected )
326- )
454+ raise ValidationNotEqualError (expected , actual , self ._io , __file__ )
327455 return actual
328456
329457 @staticmethod
@@ -375,9 +503,9 @@ def process_xor_many(data, key):
375503 @staticmethod
376504 def process_rotate_left (data , amount , group_size ):
377505 if group_size != 1 :
378- raise Exception (
506+ raise KaitaiStructError (
379507 "unable to rotate group of %d bytes yet" %
380- (group_size ,)
508+ (group_size ,), __file__
381509 )
382510
383511 mask = group_size * 8 - 1
@@ -462,21 +590,21 @@ def __init__(self, expected, actual, io, src_path):
462590
463591class ValidationLessThanError (ValidationFailedError ):
464592 """Signals validation failure: we required "actual" value to be
465- greater than or equal to "min ", but it turned out that it's not.
593+ greater than or equal to "minimal ", but it turned out that it's not.
466594 """
467- def __init__ (self , min , actual , io , src_path ):
595+ def __init__ (self , minimal , actual , io , src_path ):
468596 super (ValidationLessThanError , self ).__init__ ("not in range, min %s, but got %s" % (repr (min ), repr (actual )), io , src_path )
469- self .min = min
597+ self .minimal = minimal
470598 self .actual = actual
471599
472600
473601class ValidationGreaterThanError (ValidationFailedError ):
474602 """Signals validation failure: we required "actual" value to be
475- less than or equal to "max ", but it turned out that it's not.
603+ less than or equal to "maximal ", but it turned out that it's not.
476604 """
477- def __init__ (self , max , actual , io , src_path ):
605+ def __init__ (self , maximal , actual , io , src_path ):
478606 super (ValidationGreaterThanError , self ).__init__ ("not in range, max %s, but got %s" % (repr (max ), repr (actual )), io , src_path )
479- self .max = max
607+ self .maximal = maximal
480608 self .actual = actual
481609
482610
0 commit comments