From d4f933b2d3fe0664041353f9b8c7a1a978fe3a9d Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Fri, 4 Sep 2015 12:55:37 +0200
Subject: [PATCH] move last_chunk flag into HInputStream

---
 src/backends/llk.c | 16 +++++++++-------
 src/hammer.c       |  6 ++++--
 src/internal.h     |  1 +
 3 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/src/backends/llk.c b/src/backends/llk.c
index 2b8d35b1..9acf67ec 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -298,7 +298,7 @@ static HLLkState *llk_parse_start_(HAllocator* mm__, const HParser* parser)
 
 // returns partial result or NULL
 static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
-                                       HInputStream* stream, bool last_chunk)
+                                       HInputStream* stream)
 {
   HParsedToken *tok = NULL;   // will hold result token
   HCFChoice *x = NULL;        // current symbol (from top of stack)
@@ -373,7 +373,7 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
       case HCF_END:
         if(!stream->overrun)
           goto no_parse;
-        if(!last_chunk)
+        if(!stream->last_chunk)
           goto need_input;
         h_arena_free(arena, tok);
         tok = NULL;
@@ -431,7 +431,7 @@ static HCountedArray *llk_parse_chunk_(HLLkState *s, const HParser* parser,
   return NULL;
 
  need_input:
-  if(last_chunk)
+  if(stream->last_chunk)
     goto no_parse;
   h_arena_free(arena, tok); // no result, yet
   h_slist_push(stack, x);   // try this symbol again next time
@@ -456,7 +456,8 @@ HParseResult *h_llk_parse(HAllocator* mm__, const HParser* parser, HInputStream*
 {
   HLLkState *s = llk_parse_start_(mm__, parser);
 
-  s->seq = llk_parse_chunk_(s, parser, stream, true /* last chunk */);
+  assert(stream->last_chunk);
+  s->seq = llk_parse_chunk_(s, parser, stream);
 
   return llk_parse_finish_(mm__, s);
 }
@@ -470,7 +471,7 @@ void h_llk_parse_chunk(HSuspendedParser *s, HInputStream *input)
 {
   HLLkState *state = s->backend_state;
 
-  state->seq = llk_parse_chunk_(state, s->parser, input, false);
+  state->seq = llk_parse_chunk_(state, s->parser, input);
 }
 
 HParseResult *h_llk_parse_finish(HSuspendedParser *s)
@@ -482,11 +483,12 @@ HParseResult *h_llk_parse_finish(HSuspendedParser *s)
     .overrun = 0,
     .endianness = s->endianness,
     .length = 0,
-    .input = NULL
+    .input = NULL,
+    .last_chunk = true
   };
 
   // signal end of input (no-op parse already done)
-  state->seq = llk_parse_chunk_(state, s->parser, &empty, true);
+  state->seq = llk_parse_chunk_(state, s->parser, &empty);
 
   return llk_parse_finish_(s->mm__, s->backend_state);
 }
diff --git a/src/hammer.c b/src/hammer.c
index 991008d2..34224227 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -56,7 +56,8 @@ HParseResult* h_parse__m(HAllocator* mm__, const HParser* parser, const uint8_t*
     .overrun = 0,
     .endianness = DEFAULT_ENDIANNESS,
     .length = length,
-    .input = input
+    .input = input,
+    .last_chunk = true
   };
   
   return backends[parser->backend]->parse(mm__, parser, &input_stream);
@@ -132,7 +133,8 @@ bool h_parse_chunk(HSuspendedParser* s, const uint8_t* input, size_t length) {
     .overrun = 0,
     .endianness = s->endianness,
     .length = length,
-    .input = input
+    .input = input,
+    .last_chunk = false
   };
 
   // process chunk
diff --git a/src/internal.h b/src/internal.h
index 8c047747..b81b50c9 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -79,6 +79,7 @@ typedef struct HInputStream_ {
 	       // towards that should be ignored.
   char endianness;
   bool overrun;
+  bool last_chunk;
 } HInputStream;
 
 typedef struct HSlistNode_ {
-- 
GitLab