Skip to content

Commit 2af343d

Browse files
committed
Fixed some writing issues. All reads and writes of 8-byte align integers are now big-endian.
1 parent 7224898 commit 2af343d

File tree

1 file changed

+46
-49
lines changed

1 file changed

+46
-49
lines changed

binaryparse.nim

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -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 = 0x31_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

Comments
 (0)