bsloane1650 commented on a change in pull request #225: Implement daf:lookAhead URL: https://github.com/apache/incubator-daffodil/pull/225#discussion_r290338037
########## File path: daffodil-runtime1/src/main/scala/org/apache/daffodil/dpath/DAFFunctions.scala ########## @@ -72,3 +78,63 @@ case object DAFError extends RecipeOp { } } } + +case class DAFLookAhead(recipes: List[CompiledDPath]) + extends FNTwoArgs(recipes) { + + def computeValue(arg1: AnyRef, arg2: AnyRef, dstate: DState): AnyRef = { + val offset = arg1.asInstanceOf[JLong] + val lBitSize = arg2.asInstanceOf[JLong] + + /* + * Since daf:lookAhead is defined to take unsigned arguements, the DPath interperater + * will error out on the cast if a negative arguement is supplied, so we do not need to SDE here. + */ + + Assert.invariant(offset >= 0) + Assert.invariant(lBitSize >= 0) + + val totalLookahead = offset + lBitSize + if (totalLookahead > 512) { Review comment: My main motivation for this limit was to be nice to future implementations where infinite lookahead might be less trivial. An added benifit is that it prevents people from shooting themselves in the foot with a long lookahead on streamed input. Adding the tunable maxDAFLookaheadBits ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services