diff --git a/src/hammer.c b/src/hammer.c index 2bdc0d1d2e3789febb992b9d241ba2bf4df087fb..4d47ca069f12e3ec874f0a486c91ea8eebc7ae80 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -83,6 +83,7 @@ HParserBackendWithParams * h_copy_backend_with_params__m(HAllocator *mm__, if (r) { r->mm__ = mm__; r->name = be_with_params->name; + r->params_string = be_with_params->params_string; r->backend = be_with_params->backend; if (backends[be_with_params->backend]->copy_params) { s = backends[be_with_params->backend]->copy_params(mm__, @@ -136,6 +137,8 @@ void h_free_backend_with_params(HParserBackendWithParams *be_with_params) { } } + h_free(be_with_params->name); + h_free(be_with_params->params_string); h_free(be_with_params); } } @@ -332,11 +335,14 @@ char * h_get_short_name_with_no_params(HAllocator *mm__, char* get_params_as_string(char *remainder, char *end_paren, char *params_as_string, HAllocator *mm__) { char *after_open_paren = remainder + 1; + size_t params_len = strlen(after_open_paren) - strlen(end_paren); + if(params_len > 0) { params_as_string = h_new(char, params_len + 1); memset(params_as_string, '\0', params_len + 1); strncpy(params_as_string, after_open_paren, params_len); + } return params_as_string; } @@ -360,8 +366,10 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi remainder = strstr(name_with_params, "("); if(remainder != NULL) { + name_len = len - strlen(remainder); - end_paren = strrchr(params_as_string, ')'); + end_paren = strrchr(remainder, ')'); + if(end_paren != NULL && end_paren != remainder +1) { params_as_string = get_params_as_string( remainder, end_paren, params_as_string, mm__); @@ -379,6 +387,7 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi result->backend = be; result->name = name_with_no_params; + result->params_string = params_as_string; /* use the backend supplied method to extract any params from the input */ result->params = NULL; diff --git a/src/hammer.h b/src/hammer.h index 1e866989076d99e77ca9985bf0288e3cfb6f6285..6cb92a83ca0b92fbab51fe74a9195ad6675cd608 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -54,10 +54,9 @@ typedef enum HParserBackend_ { PB_MAX = PB_GLR } HParserBackend; -/*TODO double check which of my additions are needed for this change (as opposed to for the dlopen change)*/ typedef struct HParserBackendWithParams_ { - /* Name of backend (if called via string, need to keep this for loading backends from modules) */ - const char *name; + /* Name of backend (if called via string, will need to keep this for loading backends with dlopen) */ + char *name; /* The backend (if backend is to be loaded from an external module set to invalid (?))*/ HParserBackend backend; /* @@ -67,6 +66,7 @@ typedef struct HParserBackendWithParams_ { * and PB_GLR take an integer cast to void * */ void *params; + char * params_string; /* Allocator to use to free this (and the params if necessary) */ HAllocator *mm__; } HParserBackendWithParams; @@ -359,7 +359,6 @@ HParserBackend h_query_backend_by_name(const char *name); * If the backend is one of the existing backends in the HBackend enum, * HBackend will be populated in the result. * - * TODO: actually do the below, also improve this comment to be more clear and concise. * Otherwise the result will save the name for use in attempts later at * loading the named module. * diff --git a/src/t_names.c b/src/t_names.c index b44ea70dcf90827ff05ac5f26a434b98f6d92893..5b91456eabd67b41fa5a7a547b29ea854110e67e 100644 --- a/src/t_names.c +++ b/src/t_names.c @@ -79,12 +79,6 @@ static void test_tt_get_backend_with_params_by_name(void) { g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_INVALID); g_check_maybe_string_eq(be_w_p->name, "llvm"); - /*tests ahowing that the parsing of names and params as currently written is - * fault tolerant to things like calling a backend which does not take params - * with params, sending extra params, or plain old garbage after the name or - * the valid params. - * If we choose to enforce sanity checks on input, these are the tests we should see - * break and then change to reflect those sanity checks*/ be_w_p = h_get_backend_with_params_by_name("packrat(0)"); g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_PACKRAT); g_check_maybe_string_eq(be_w_p->name, packrat_name); @@ -94,7 +88,7 @@ static void test_tt_get_backend_with_params_by_name(void) { g_check_maybe_string_eq(be_w_p->name, glr_name); g_check_cmp_size((uintptr_t)be_w_p->params, ==, 1); - be_w_p = h_get_backend_with_params_by_name("glr(1 vnvnvn"); + be_w_p = h_get_backend_with_params_by_name("glr(1 vnvnvn)"); g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR); g_check_maybe_string_eq(be_w_p->name, glr_name); g_check_cmp_size((uintptr_t)be_w_p->params, ==, 1); @@ -103,6 +97,10 @@ static void test_tt_get_backend_with_params_by_name(void) { 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(2"); + g_check_inttype("%d", HParserBackend, be_w_p->backend, ==, PB_GLR); + g_check_maybe_string_eq(be_w_p->name, glr_name); + } /* test that we can request a backend with params from character