From 29cee318f95eed523ce9383f14e86fb10129d1e2 Mon Sep 17 00:00:00 2001
From: "Sven M. Hallberg" <pesco@khjk.org>
Date: Mon, 20 May 2013 14:58:20 +0200
Subject: [PATCH] move the h_act_* functions to src/actions.c

---
 src/Makefile             |  1 +
 src/cfgrammar.c          | 10 ----------
 src/hammer.h             |  8 ++++++++
 src/parsers/ignoreseq.c  | 12 ------------
 src/parsers/many.c       | 29 -----------------------------
 src/parsers/whitespace.c |  9 ---------
 6 files changed, 9 insertions(+), 60 deletions(-)

diff --git a/src/Makefile b/src/Makefile
index 870aad5c..13cbf84b 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -41,6 +41,7 @@ HAMMER_PARTS := \
 	system_allocator.o \
 	benchmark.o \
 	cfgrammar.o \
+	actions.o \
 	$(PARSERS:%=parsers/%.o) \
 	$(BACKENDS:%=backends/%.o)
 
diff --git a/src/cfgrammar.c b/src/cfgrammar.c
index 67361c83..d3ee9c64 100644
--- a/src/cfgrammar.c
+++ b/src/cfgrammar.c
@@ -37,16 +37,6 @@ static void collect_nts(HCFGrammar *grammar, HCFChoice *symbol);
 static void collect_geneps(HCFGrammar *grammar);
 
 
-// XXX to be consolidated with glue.c when merged upstream
-const HParsedToken *h_act_first(const HParseResult *p)
-{
-  assert(p->ast);
-  assert(p->ast->token_type == TT_SEQUENCE);
-  assert(p->ast->seq->used > 0);
-
-  return p->ast->seq->elements[0];
-}
-
 /* Convert 'parser' into CFG representation by desugaring and compiling the set
  * of nonterminals.
  * A NULL return means we are unable to represent the parser as a CFG.
diff --git a/src/hammer.h b/src/hammer.h
index 45f0dda9..b872ee6a 100644
--- a/src/hammer.h
+++ b/src/hammer.h
@@ -596,6 +596,14 @@ const uint8_t* h_bit_writer_get_buffer(HBitWriter* w, size_t *len);
  */
 void h_bit_writer_free(HBitWriter* w);
 
+// General-purpose actions for use with h_action
+// XXX to be consolidated with glue.h when merged upstream
+const HParsedToken *h_act_first(const HParseResult *p);
+const HParsedToken *h_act_second(const HParseResult *p);
+const HParsedToken *h_act_last(const HParseResult *p);
+const HParsedToken *h_act_flatten(const HParseResult *p);
+const HParsedToken *h_act_ignore(const HParseResult *p);
+
 // {{{ Benchmark functions
 HAMMER_FN_DECL(HBenchmarkResults *, h_benchmark, HParser* parser, HParserTestcase* testcases);
 void h_benchmark_report(FILE* stream, HBenchmarkResults* results);
diff --git a/src/parsers/ignoreseq.c b/src/parsers/ignoreseq.c
index e4bf4323..6a61f3ea 100644
--- a/src/parsers/ignoreseq.c
+++ b/src/parsers/ignoreseq.c
@@ -31,18 +31,6 @@ static HParseResult* parse_ignoreseq(void* env, HParseState *state) {
   return res;
 }
 
-extern const HParsedToken *h_act_first(const HParseResult *p);
-extern const HParsedToken *h_act_last(const HParseResult *p);
-
-// XXX to be consolidated with glue.c when merged upstream
-const HParsedToken *h_act_second(const HParseResult *p) {
-  assert(p->ast);
-  assert(p->ast->token_type == TT_SEQUENCE);
-  assert(p->ast->seq->used > 0);
-
-  return p->ast->seq->elements[1];
-}
-
 static HCFChoice* desugar_ignoreseq(HAllocator *mm__, void *env) {
   HIgnoreSeq *seq = (HIgnoreSeq*)env;
   HCFSequence *hseq = h_new(HCFSequence, 1);
diff --git a/src/parsers/many.c b/src/parsers/many.c
index d26eec93..6f6e8591 100644
--- a/src/parsers/many.c
+++ b/src/parsers/many.c
@@ -56,35 +56,6 @@ static bool many_isValidCF(void *env) {
 	  repeat->sep->vtable->isValidCF(repeat->sep->env));
 }
 
-static void act_flatten_(HCountedArray *seq, const HParsedToken *tok) {
-  if(tok == NULL) {
-    return;
-  } else if(tok->token_type == TT_SEQUENCE) {
-    size_t i;
-    for(i=0; i<tok->seq->used; i++)
-      act_flatten_(seq, tok->seq->elements[i]);
-  } else {
-    h_carray_append(seq, (HParsedToken *)tok);
-  }
-}
-
-const HParsedToken *h_act_flatten(const HParseResult *p) {
-  HCountedArray *seq = h_carray_new(p->arena);
-
-  act_flatten_(seq, p->ast);
-
-  HParsedToken *res = a_new_(p->arena, HParsedToken, 1);
-  res->token_type = TT_SEQUENCE;
-  res->seq = seq;
-  res->index = p->ast->index;
-  res->bit_offset = p->ast->bit_offset;
-  return res;
-}
-
-const HParsedToken *h_act_ignore(const HParseResult *p) {
-  return NULL;
-}
-
 static HCFChoice* desugar_many(HAllocator *mm__, void *env) {
   HRepeat *repeat = (HRepeat*)env;
   if(repeat->count > 1) {
diff --git a/src/parsers/whitespace.c b/src/parsers/whitespace.c
index f9fa59f6..73c558ef 100644
--- a/src/parsers/whitespace.c
+++ b/src/parsers/whitespace.c
@@ -17,15 +17,6 @@ static HParseResult* parse_whitespace(void* env, HParseState *state) {
 
 static const char SPACE_CHRS[6] = {' ', '\f', '\n', '\r', '\t', '\v'};
 
-// XXX to be consolidated with glue.c when merged upstream
-const HParsedToken *h_act_last(const HParseResult *p) {
-  assert(p->ast);
-  assert(p->ast->token_type == TT_SEQUENCE);
-  assert(p->ast->seq->used > 0);
-
-  return p->ast->seq->elements[p->ast->seq->used-1];
-}
-
 static HCFChoice* desugar_whitespace(HAllocator *mm__, void *env) {
   HCFChoice *ws = h_new(HCFChoice, 1);
   ws->type = HCF_CHOICE;
-- 
GitLab