From 78b3656d69ec9264d344bd5c5fa60626ab019de6 Mon Sep 17 00:00:00 2001 From: picomeg <megordon5@gmail.com> Date: Mon, 5 Oct 2020 16:24:32 +0100 Subject: [PATCH] Fixed a bunch of mistakes and incomplete code hastily committed when the hard drive sounded bad. TODO includes free and copy updated and a bunch of refactoring / redesign of the solution --- src/backends/glr.c | 6 ++++-- src/backends/lalr.c | 6 ++++-- src/backends/llk.c | 6 ++++-- src/hammer.c | 30 ++++++++++++++++-------------- src/hammer.h | 4 ++-- src/t_names.c | 34 +++++++++++++++++++++++++++++++++- 6 files changed, 63 insertions(+), 23 deletions(-) diff --git a/src/backends/glr.c b/src/backends/glr.c index b91f7c45..9828c2b3 100644 --- a/src/backends/glr.c +++ b/src/backends/glr.c @@ -307,15 +307,17 @@ char * h_glr_get_short_name(HAllocator *mm__, int h_glr_extract_params(void ** params, char* raw_params) { - params = NULL; + *params = NULL; int param_0 = -1; int success = 0; + uintptr_t param; success = sscanf(raw_params + 1, "%d", ¶m_0); if(success) { - *params = (void *)(unsigned long long) param_0; + param = (uintptr_t) param_0; + *params = (void *)param; } return success; diff --git a/src/backends/lalr.c b/src/backends/lalr.c index 2f0f27e5..cdf72100 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -438,15 +438,17 @@ char * h_lalr_get_short_name(HAllocator *mm__, int h_lalr_extract_params(void ** params, char* raw_params) { - params = NULL; + *params = NULL; int param_0 = -1; int success = 0; + uintptr_t param; success = sscanf(raw_params + 1, "%d", ¶m_0); if(success) { - *params = (void *)(unsigned long long) param_0; + param = (uintptr_t) param_0; + *params = (void *)param; } return success; diff --git a/src/backends/llk.c b/src/backends/llk.c index cf7e2aba..b06f4319 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -672,15 +672,17 @@ char * h_llk_get_short_name(HAllocator *mm__, int h_llk_extract_params(void ** params, char * raw_params) { - params = NULL; + *params = NULL; int param_0 = -1; int success = 0; + uintptr_t param; success = sscanf(raw_params + 1, "%d", ¶m_0); if(success) { - *params = (void *)(unsigned long long) param_0; + param = (uintptr_t) param_0; + *params = (void *)param; } return success; diff --git a/src/hammer.c b/src/hammer.c index a67fc7f8..bcf48fe4 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -340,24 +340,26 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi size_t name_len, params_len; size_t len = strlen(name_with_params); - params_as_string = strstr(name_with_params, "("); + result = h_new(HParserBackendWithParams, 1); - if(params_as_string) { - params_len = strlen(params_as_string); - name_len = len - params_len; - } else { - name_len = len; - } + if (result) { - name_with_no_params = h_new(char, name_len+1); - memset(name_with_no_params, 0, name_len+1); - strncpy(name_with_no_params, name_with_params, name_len); - HParserBackend backend = h_query_backend_by_name(name_with_no_params); + params_as_string = strstr(name_with_params, "("); - result = h_new(HParserBackendWithParams, 1); + if(params_as_string) { + params_len = strlen(params_as_string); + name_len = len - params_len; + } else { + name_len = len; + } + + name_with_no_params = h_new(char, name_len+1); + memset(name_with_no_params, '\0', name_len+1); + strncpy(name_with_no_params, name_with_params, name_len); + + HParserBackend backend = h_query_backend_by_name(name_with_no_params); - if (result) { result->backend = backend; @@ -366,7 +368,7 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi if(params_as_string) { //store the raw string containing the param(s) char * raw_params_string = h_new(char, params_len+1); - memset(name_with_no_params, 0, params_len+1); + memset(raw_params_string, '\0', params_len+1); strncpy(raw_params_string, params_as_string, params_len); result->raw_params = raw_params_string; diff --git a/src/hammer.h b/src/hammer.h index fc14125b..15064cfa 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -56,7 +56,7 @@ typedef enum HParserBackend_ { typedef struct HParserBackendWithParams_ { /* Name of backend (for loading backends from modules */ - char *name; + const char *name; /* The backend (if backend is to be loaded from an external module set to invalid (?))*/ HParserBackend backend; /* @@ -67,7 +67,7 @@ typedef struct HParserBackendWithParams_ { */ void *params; /*raw substring the params were extracted from*/ - char *raw_params; + const char *raw_params; /* Allocator to use to free this (and the params if necessary) */ HAllocator *mm__; } HParserBackendWithParams; diff --git a/src/t_names.c b/src/t_names.c index 3d614139..ae6296ef 100644 --- a/src/t_names.c +++ b/src/t_names.c @@ -41,7 +41,39 @@ static void test_tt_backend_short_name(void) { g_check_maybe_string_eq(name, glr_name); } +/*TODO create proper test(s) with test name matching what is being tested. + * As is this is just what I am using to drive development + * and check I am not making silly mistakes */ +static void test_tt_query_backend_by_name(void) { + HParserBackend be; + + be = h_query_backend_by_name(packrat_name); + g_check_inttype("%d", HParserBackend, be, ==, PB_PACKRAT); + be = h_query_backend_by_name(regular_name); + g_check_inttype("%d", HParserBackend, be, ==, PB_REGULAR); + + + HParserBackendWithParams * be_w_p = NULL; + + be_w_p = h_get_backend_with_params_by_name(glr_name); + g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR); + g_check_maybe_string_eq(be_w_p->name, glr_name); + + be_w_p = h_get_backend_with_params_by_name("glr(1)"); + printf("%d be enum val \n", be_w_p->backend); + g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR); + printf("%s be name \n", be_w_p->name); + g_check_maybe_string_eq(be_w_p->name, glr_name); + printf("%s raw params string \n", be_w_p->raw_params); + g_check_maybe_string_eq(be_w_p->raw_params, "(1)"); + printf("%p as void pointer \n", be_w_p->params); + g_check_cmp_size((uintptr_t)be_w_p->params, ==, 1); + printf("%zu param as uintptr_t \n", (uintptr_t)be_w_p->params); + +} + void register_names_tests(void) { g_test_add_func("/core/names/tt_backend_short_name", test_tt_backend_short_name); g_test_add_func("/core/names/tt_backend_description", test_tt_backend_description); -} + g_test_add_func("/core/names/tt_query_backend_by_name", test_tt_query_backend_by_name); + } -- GitLab