From 1c6430c56782f92bf8dd1fb0e673695ce907bda7 Mon Sep 17 00:00:00 2001 From: picomeg <megordon5@gmail.com> Date: Tue, 1 Dec 2020 17:22:39 +0000 Subject: [PATCH] Cleaner and I think improved pulling out of parameters. Needs testing, committing now because of harddrive making a bad sound again. --- src/backends/glr.c | 3 ++- src/backends/lalr.c | 3 ++- src/backends/llk.c | 3 ++- src/hammer.c | 26 +++++++++++++++++++++++--- src/hammer.h | 1 + 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/backends/glr.c b/src/backends/glr.c index 5619b26a..878bbc9a 100644 --- a/src/backends/glr.c +++ b/src/backends/glr.c @@ -305,6 +305,7 @@ char * h_glr_get_short_name(HAllocator *mm__, return name; } +/*TODO: better handling of errors?*/ int h_glr_extract_params(void ** params, char* raw_params) { *params = NULL; @@ -313,7 +314,7 @@ int h_glr_extract_params(void ** params, char* raw_params) { int success = 0; uintptr_t param; - success = sscanf(raw_params + 1, "%d", ¶m_0); + success = sscanf(raw_params, "%d", ¶m_0); if(success) { param = (uintptr_t) param_0; diff --git a/src/backends/lalr.c b/src/backends/lalr.c index cdf72100..a133ec1d 100644 --- a/src/backends/lalr.c +++ b/src/backends/lalr.c @@ -436,6 +436,7 @@ char * h_lalr_get_short_name(HAllocator *mm__, return name; } +/*TODO better error handling*/ int h_lalr_extract_params(void ** params, char* raw_params) { *params = NULL; @@ -444,7 +445,7 @@ int h_lalr_extract_params(void ** params, char* raw_params) { int success = 0; uintptr_t param; - success = sscanf(raw_params + 1, "%d", ¶m_0); + success = sscanf(raw_params, "%d", ¶m_0); if(success) { param = (uintptr_t) param_0; diff --git a/src/backends/llk.c b/src/backends/llk.c index b06f4319..1a210c0f 100644 --- a/src/backends/llk.c +++ b/src/backends/llk.c @@ -670,6 +670,7 @@ char * h_llk_get_short_name(HAllocator *mm__, return name; } +/*TODO better error handling*/ int h_llk_extract_params(void ** params, char * raw_params) { *params = NULL; @@ -678,7 +679,7 @@ int h_llk_extract_params(void ** params, char * raw_params) { int success = 0; uintptr_t param; - success = sscanf(raw_params + 1, "%d", ¶m_0); + success = sscanf(raw_params, "%d", ¶m_0); if(success) { param = (uintptr_t) param_0; diff --git a/src/hammer.c b/src/hammer.c index 64048197..2bdc0d1d 100644 --- a/src/hammer.c +++ b/src/hammer.c @@ -329,12 +329,26 @@ char * h_get_short_name_with_no_params(HAllocator *mm__, return h_get_backend_text_with_no_params(mm__, be, 0); } +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; +} + HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_with_params) { HAllocator *mm__ = &system_allocator; HParserBackendWithParams *result = NULL; HParserBackend be; char *name_with_no_params = NULL; + char *remainder = NULL; char *params_as_string = NULL; + char *end_paren = NULL; size_t name_len, len; if(name_with_params != NULL) { @@ -343,10 +357,16 @@ HParserBackendWithParams * h_get_backend_with_params_by_name(const char *name_wi if (result) { len = strlen(name_with_params); - params_as_string = strstr(name_with_params, "("); + remainder = strstr(name_with_params, "("); + + if(remainder != NULL) { + name_len = len - strlen(remainder); + end_paren = strrchr(params_as_string, ')'); + if(end_paren != NULL && end_paren != remainder +1) { + params_as_string = get_params_as_string( + remainder, end_paren, params_as_string, mm__); + } /* else error */ - if(params_as_string) { - name_len = len - strlen(params_as_string); } else { name_len = len; } diff --git a/src/hammer.h b/src/hammer.h index 0a66510b..1e866989 100644 --- a/src/hammer.h +++ b/src/hammer.h @@ -54,6 +54,7 @@ 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; -- GitLab