diff --git a/src/backends/glr.c b/src/backends/glr.c index b91f7c45a9f3daa5b5bd2efdeae11b0a5b5b82f1..9828c2b30fc2a53eab1d2de5fd77b6f0893b6065 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 2f0f27e5caa58cd79c7cc0058e61847721eac75f..cdf721000d721d8354d3dc41e7788f31bc26dfe2 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 cf7e2aba92dc25425526d9943ddc444928fb91d8..b06f431975f7dbc7793343d2eb1f58190cfcf345 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 a67fc7f850408ef8d8382217e64514508852355a..bcf48fe46cbfb495b2692704c0f49c530e95f59e 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 fc14125b914cbaf7c174a95dd724d11dd59ed767..15064cfa08c24458fa801997a3ad39a2727ecbeb 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 3d614139f001f889767e386c459241efa08232fe..ae6296ef59878688c12294c730c47adc2c7676c0 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); + }