diff --git a/src/backends/glr.c b/src/backends/glr.c index 5619b26a4558b7ffbfe5b0ac33689e4625848cc2..878bbc9a0382773b9933213b58451c092588ca12 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 cdf721000d721d8354d3dc41e7788f31bc26dfe2..a133ec1db5d3a2ed65c33958d1cf1449b8d426f3 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 b06f431975f7dbc7793343d2eb1f58190cfcf345..1a210c0f1990c05782e2c4e71bdbdea55d410f78 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 640481976c00107e189acbd75678abf3096feedb..2bdc0d1d2e3789febb992b9d241ba2bf4df087fb 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 0a66510b3feb7ed0aa51f6800ac38a53865a83f4..1e866989076d99e77ca9985bf0288e3cfb6f6285 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;