diff --git a/src/backends/glr.c b/src/backends/glr.c index a88090a38e891dcc85926849e4fc59ddf7c67be2..3abe6f55bf480eadb45b4a00a1d00ab46377cefe 100644 --- a/src/backends/glr.c +++ b/src/backends/glr.c @@ -239,15 +239,83 @@ HParseResult *h_glr_parse(HAllocator* mm__, const HParser* parser, HInputStream* return result; } +char * h_glr_get_description(HAllocator *mm__, + HParserBackend be, void *param) { + const char *format_str = "GLR(%zu) parser backend"; + /* TODO fix the backend */ + const char *generic_descr_format_str = + "GLR(k) parser backend (actually using the param is broken)"; + uintptr_t params_int; + size_t k, len; + char *descr = NULL; + + params_int = (uintptr_t)param; + if (params_int > 0) { + /* A specific k was given */ + k = (size_t)params_int; + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, k); + /* Allocate it and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, format_str, k); + } + } else { + /* + * No specific k; TODO actually have a default and fix the backend + */ + len = snprintf(NULL, 0, generic_descr_format_str); + /* Allocate and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, generic_descr_format_str); + } + } + + return descr; +} +char * h_glr_get_short_name(HAllocator *mm__, + HParserBackend be, void *param) { + const char *format_str = "GLR(%zu)", *generic_name = "GLR(k)"; + uintptr_t params_int; + size_t k, len; + char *name = NULL; + + params_int = (uintptr_t)param; + if (params_int > 0) { + /* A specific k was given */ + k = (size_t)params_int; + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, k); + /* Allocate it and do the real snprintf */ + name = h_new(char, len + 1); + if (name) { + snprintf(name, len + 1, format_str, k); + } + } else { + /* No specific k */ + len = strlen(generic_name); + name = h_new(char, len + 1); + strncpy(name, generic_name, len + 1); + } + + return name; +} HParserBackendVTable h__glr_backend_vtable = { .compile = h_glr_compile, .parse = h_glr_parse, .free = h_glr_free, - .copy_params = h_copy_numeric_param + .copy_params = h_copy_numeric_param, /* No free_param needed, since it's not actually allocated */ + + /* Name/param resolution functions */ + .backend_short_name = "glr", + .backend_description = "GLR(k) parser backend", + .get_description_with_params = h_glr_get_description, + .get_short_name_with_params = h_glr_get_short_name };