@@ -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
701688when 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 ()
0 commit comments