Skip to content

Commit 46fbff0

Browse files
committed
Fix various bugs that crashed binaryparse
1 parent 2af343d commit 46fbff0

File tree

3 files changed

+26
-35
lines changed

3 files changed

+26
-35
lines changed

binaryparse.nim

Lines changed: 24 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,15 @@ template peekDataLE*(stream: Stream, buffer: pointer, size: int) =
147147
raise newException(IOError,
148148
"Unable to peek the requested amount of bytes from file")
149149

150-
proc replace(node: var NimNode, seenFields: seq[string]) =
150+
proc replace(node: var NimNode, seenFields: seq[string], parent: NimNode = newIdentNode("result")) =
151151
if node.kind == nnkIdent:
152152
if $node.ident in seenFields:
153-
node = newDotExpr(newIdentNode("result"), node)
153+
node = newDotExpr(parent, node)
154154
else:
155155
var i = 0
156156
while i < len(node):
157157
var n = node[i]
158-
n.replace(seenFields)
158+
n.replace(seenFields, parent)
159159
node[i] = n
160160
inc i
161161

@@ -353,13 +353,13 @@ proc createWriteStatement(
353353
result.add(quote do:
354354
`tmpVar` = `tmpVar` shl `addspace`
355355
)
356-
if shift > 0:
356+
if shift >= 0:
357357
result.add(quote do:
358-
`tmpVar` = `tmpVar` or (`field` and `mask`) shl `shift`
358+
`tmpVar` = `tmpVar` or (`field` and `mask`).int64 shl `shift`
359359
)
360360
else:
361361
result.add(quote do:
362-
`tmpVar` = `tmpVar` or (`field` and `mask`) shr -`shift`
362+
`tmpVar` = `tmpVar` or (`field` and `mask`).int64 shr -`shift`
363363
)
364364
if skip != 0:
365365
if tmpVar != nil:
@@ -394,7 +394,6 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
394394
stream = newIdentNode("stream")
395395
input = newIdentNode("input")
396396
tmpVar = genSym(nskVar)
397-
#input = genSym(nskParam)
398397
var
399398
inner = newStmtList()
400399
writer = newStmtList()
@@ -474,7 +473,6 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
474473
)
475474
let
476475
ii = genSym(nskVar)
477-
#tmpVar = genSym(nskVar)
478476
startReadOffset = readOffset
479477
startWriteOffset = writeOffset
480478
var
@@ -542,21 +540,13 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
542540
"String for field of static length not right size"))
543541
else:
544542
newStmtList()
545-
if $kind.ident != "string":
546-
writer.add(quote do:
547-
var `tmpVar`: `kind` = 0
548-
)
549543
if def[1][0].len == 2:
550544
var
551-
fields = def[1][0][1]
552-
fields.replace(seenFields)
545+
fields = def[1][0][1].copyNimTree
546+
fields.replace(seenFields, input)
553547
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`)
558548
var `ii` = 0
559-
while `ii` < (`fields`).int:
549+
while `ii` < (`input`[`field`].len).int:
560550
`writeField`
561551
`writeNull`
562552
inc `ii`
@@ -571,7 +561,7 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
571561
)
572562
if def[1][0].len == 2:
573563
var
574-
fields = def[1][0][1]
564+
fields = def[1][0][1].copyNimTree
575565
fields.replace(seenFields)
576566
inner.add(quote do:
577567
`res`[`field`] = newSeq[`kind`](`fields`)
@@ -662,24 +652,21 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
662652
(quote do: `res`[`field`]), info, readOffset, stream
663653
)
664654
)
665-
echo $sym
666-
echo "(" & $info.size & ", " & $writeOffset & ") -> " & $getBitInfo(info.size, writeOffset)
667655
writer.add(
668656
createWriteStatement(
669657
(quote do: `input`[`field`]), info, writeOffset, stream, tmpVar
670658
)
671659
)
672660
else:
673661
discard
674-
#[
675-
# This can be used for debugging, should possibly be exposed by a flag
676-
inner.add(quote do:
677-
when `field` >= 0:
678-
echo "Done reading field " & $`i` & ": " & $`res`[`field`]
679-
else:
680-
echo "Done reading field " & $`i`
681-
)
682-
]#
662+
when defined(binaryparseLog):
663+
# This can be used for debugging, should possibly be exposed by a flag
664+
inner.add(quote do:
665+
when `field` >= 0:
666+
echo "Done reading field " & $`i` & ": " & $`res`[`field`]
667+
else:
668+
echo "Done reading field " & $`i`
669+
)
683670
inc i
684671
inc field
685672
let
@@ -695,8 +682,8 @@ macro createParser*(name: untyped, paramsAndDef: varargs[untyped]): untyped =
695682
for p in extraParams:
696683
result[0][3].add p
697684

698-
echo result.toStrLit
699-
#echo result.treeRepr
685+
when defined(binaryparseEcho):
686+
echo result.toStrLit
700687

701688
when isMainModule:
702689
createParser(list, size: uint16):
@@ -721,6 +708,10 @@ when isMainModule:
721708
u1: secondary_header
722709
u11: apid
723710

711+
createParser(debug):
712+
u8: _ = 128
713+
u16: size
714+
724715
block parse:
725716
var fs = newFileStream("data.hex", fmRead)
726717
defer: fs.close()

binaryparse.nimble

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
# Package
22

3-
version = "0.1.0"
3+
version = "0.2.0"
44
author = "Peter Munch-Ellingsen"
55
description = "Binary parser (and writer) in pure Nim. Generates efficient parsing procedures that handle many commonly seen patterns seen in binary files and does sub-byte field reading."
66
license = "MIT"
77

88
# Dependencies
99

10-
requires "nim >= 0.17.3"
10+
requires "nim >= 0.18.0"
1111

data.hex

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)