From f40d2e7240119284f658e028a1d726a20ec246fe Mon Sep 17 00:00:00 2001
From: Andrea Shepard <andrea@persephoneslair.org>
Date: Sun, 7 May 2017 22:54:52 +0000
Subject: [PATCH] Add numeric param mechanism for LL/LALR/GLR backends

---
 src/backends/glr.c  |  5 ++++-
 src/backends/lalr.c |  4 +++-
 src/backends/llk.c  |  5 ++++-
 src/hammer.c        | 15 +++++++++++++++
 src/internal.h      |  4 ++++
 5 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/src/backends/glr.c b/src/backends/glr.c
index 535dc286..a88090a3 100644
--- a/src/backends/glr.c
+++ b/src/backends/glr.c
@@ -244,7 +244,10 @@ HParseResult *h_glr_parse(HAllocator* mm__, const HParser* parser, HInputStream*
 HParserBackendVTable h__glr_backend_vtable = {
   .compile = h_glr_compile,
   .parse = h_glr_parse,
-  .free = h_glr_free
+  .free = h_glr_free,
+
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/backends/lalr.c b/src/backends/lalr.c
index b82ef71c..b60c8d58 100644
--- a/src/backends/lalr.c
+++ b/src/backends/lalr.c
@@ -368,7 +368,9 @@ HParserBackendVTable h__lalr_backend_vtable = {
   .free = h_lalr_free,
   .parse_start = h_lr_parse_start,
   .parse_chunk = h_lr_parse_chunk,
-  .parse_finish = h_lr_parse_finish
+  .parse_finish = h_lr_parse_finish,
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/backends/llk.c b/src/backends/llk.c
index 4e8209b3..4bfb4f0f 100644
--- a/src/backends/llk.c
+++ b/src/backends/llk.c
@@ -614,7 +614,10 @@ HParserBackendVTable h__llk_backend_vtable = {
 
   .parse_start = h_llk_parse_start,
   .parse_chunk = h_llk_parse_chunk,
-  .parse_finish = h_llk_parse_finish
+  .parse_finish = h_llk_parse_finish,
+
+  .copy_params = h_copy_numeric_param
+  /* No free_param needed, since it's not actually allocated */
 };
 
 
diff --git a/src/hammer.c b/src/hammer.c
index c72c59fb..dba530e6 100644
--- a/src/hammer.c
+++ b/src/hammer.c
@@ -105,6 +105,21 @@ HParserBackendWithParams * h_copy_backend_with_params__m(HAllocator *mm__,
   return r;
 }
 
+/*
+ * copy_params for backends where the parameter is actually a number cast to
+ * void *, such as LLk, LALR and GLR.  Use NULL for free_params in this
+ * case.
+ */
+
+int h_copy_numeric_param(HAllocator *mm__, void **out, void *in) {
+  int rv = 0;
+
+  if (out) *out = in; 
+  else rv = -1; /* error return, nowhere to write result */
+
+  return rv; 
+}
+
 /* Free this HParserBackendWithParams, and free the params too */
 
 void h_free_backend_with_params(HParserBackendWithParams *be_with_params) {
diff --git a/src/internal.h b/src/internal.h
index 22407cca..1ed77e7a 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -357,6 +357,10 @@ static inline HParserBackend h_get_default_backend__int(void) {
   return PB_PACKRAT;
 }
 
+/* copy_params for backends where the parameter is not actually a pointer */
+
+int h_copy_numeric_param(HAllocator *mm__, void **out, void *in);
+
 static inline
 HParser *h_new_parser(HAllocator *mm__, const HParserVtable *vt, void *env) {
   HParser *p = h_new(HParser, 1);
-- 
GitLab