@@ -283,16 +283,11 @@ proc createReadStatement(
283283 result = newStmtList ()
284284 if read == skip:
285285 result .add (quote do :
286- if `stream`.readData (`field`.addr , `read`) != `read`:
287- raise newException (IOError ,
288- " Unable to read " & $ `read` & " byte" & (if `read` > 1 : " s" else : " " ) & " from file " &
289- " at position: " & $ `stream`.getPosition ())
286+ `stream`.readDataBE (`field`.addr , `read`)
290287 )
291288 else :
292289 result .add (quote do :
293- if `stream`.peekData (`field`.addr , `read`) != `read`:
294- raise newException (IOError ,
295- " Unable to peek the requested amount of bytes from file" )
290+ `stream`.peekDataBE (`field`.addr , `read`)
296291 )
297292 if skip != 0 and skip != read:
298293 result .add (quote do :
@@ -328,9 +323,10 @@ proc createWriteStatement(
328323 `stream`.write (`field`)
329324 )
330325 else :
326+ let fieldName = field.toStrLit
331327 result = (quote do :
332328 if `size` != `field`.len:
333- raise newException (AssertionError , " String of given size not matching" )
329+ raise newException (AssertionError , " String " & `fieldName` & " of given size not matching" )
334330 `stream`.write (`field`)
335331 )
336332 else :
@@ -343,34 +339,37 @@ proc createWriteStatement(
343339 result = newStmtList ()
344340 if info.size mod 8 == 0 :
345341 result .add (quote do :
346- `stream`.writeDataLE (`field`.addr , `write`)
342+ `stream`.writeDataBE (`field`.addr , `write`)
347343 )
348344 else :
345+ #[
349346 if tmpVar == nil:
350347 raise newException(AssertionError, "tmpVar cannot be nil when size mod" &
351348 "8 != 0 and info.kind = " & $info.kind)
352- if tmpVar != nil and skip != 0 and skip != size div 8 :
353- let addspace = (size div 8 ) * 8
354- result .add (quote do :
355- `tmpVar` = `tmpVar` shl `addspace`
356- )
357- if shift > 0 :
358- result .add (quote do :
359- `tmpVar` = `tmpVar` or (`field` and `mask`) shl `shift`
360- )
361- else :
362- result .add (quote do :
363- `tmpVar` = `tmpVar` or (`field` and `mask`) shr - `shift`
364- )
349+ ]#
350+ if tmpVar != nil :
351+ if skip != 0 and skip != size div 8 :
352+ let addspace = (size div 8 ) * 8
353+ result .add (quote do :
354+ `tmpVar` = `tmpVar` shl `addspace`
355+ )
356+ if shift > 0 :
357+ result .add (quote do :
358+ `tmpVar` = `tmpVar` or (`field` and `mask`) shl `shift`
359+ )
360+ else :
361+ result .add (quote do :
362+ `tmpVar` = `tmpVar` or (`field` and `mask`) shr - `shift`
363+ )
365364 if skip != 0 :
366365 if tmpVar != nil :
367366 result .add (quote do :
368- `stream`.writeDataLE (`tmpVar`.addr , `skip`)
367+ `stream`.writeDataBE (`tmpVar`.addr , `skip`)
369368 `tmpVar` = 0
370369 )
371370 else :
372371 result .add (quote do :
373- `stream`.writeDataLE (`field`.addr , `skip`)
372+ `stream`.writeDataBE (`field`.addr , `skip`)
374373 )
375374 #[
376375 if offset + size > (offset + size) mod 8:
@@ -547,13 +546,29 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
547546 writer.add (quote do :
548547 var `tmpVar`: `kind` = 0
549548 )
550- writer.add (quote do :
551- var `ii` = 0
552- while `ii` < (`input`[`field`].len):
553- `writeField`
554- `writeNull`
555- inc `ii`
556- )
549+ if def[1 ][0 ].len == 2 :
550+ var
551+ fields = def[1 ][0 ][1 ]
552+ fields.replace (seenFields)
553+ writer.add (quote do :
554+ if `input`[`field`].len < `fields`.int :
555+ raise newException (AssertionError ,
556+ " Unable to write data with length " & $ `input`[`field`].len &
557+ " , expected " & $ `fields`)
558+ var `ii` = 0
559+ while `ii` < (`fields`).int :
560+ `writeField`
561+ `writeNull`
562+ inc `ii`
563+ )
564+ else :
565+ writer.add (quote do :
566+ var `ii` = 0
567+ while `ii` < (`input`[`field`].len):
568+ `writeField`
569+ `writeNull`
570+ inc `ii`
571+ )
557572 if def[1 ][0 ].len == 2 :
558573 var
559574 fields = def[1 ][0 ][1 ]
@@ -721,22 +736,4 @@ when isMainModule:
721736 var data: typeGetter (tert)
722737 data.test = @ [1 'i8 , 2 , 3 , 4 , 5 , 6 , 7 , 0 ]
723738 tert.put (fs2, data)
724- var fs3 = newFileStream (" ccsds.hex" , fmReadWrite)
725- defer : fs3.close ()
726- if not fs3.isNil:
727- var data: typeGetter (ccsds_header)
728- data.version = 0
729- data.packet_type = 0
730- data.secondary_header = 1
731- data.apid = 6
732- ccsds_header.put (fs3, data)
733- var test: int64 = 0x 31_32_33_34_35_36_37_38
734- var test2: int64 = 0
735- echo test
736- echo test.toHex
737- fs3.writeDataBE (test.addr , 8 )
738- fs3.setPosition (2 )
739- fs3.readDataLE (test2.addr , 8 )
740- echo test2
741- echo test2.toHex
742739
0 commit comments