diff --git a/src/backends/glr.c b/src/backends/glr.c index 535dc2860c59018324893da1450cfc4ff4fadf8b..a88090a38e891dcc85926849e4fc59ddf7c67be2 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 b82ef71c477128728db39d4ac72ef8d4ab0dc56c..b60c8d586e75d1801938314f61a9c4fe6d008af8 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 4e8209b30f4aa7bd97f5df1c49202643d4efedd4..4bfb4f0f483519a4e1258e26ffb812a7733de9b7 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 c72c59fb86473b7a232cd762cfe4b4362ac0559f..dba530e66762b5e6dfccdc42ea63fbc7ed1e7300 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 22407cca30a58e9a3ec177dce3a6cab7a4ef5be8..1ed77e7a021269d4d764af35c4af32a5aa9f2e6f 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);