diff --git a/src/backends/params.c b/src/backends/params.c new file mode 100644 index 0000000000000000000000000000000000000000..e20794f3005ee68e858716962f9c97b05c938025 --- /dev/null +++ b/src/backends/params.c @@ -0,0 +1,100 @@ +#include "params.h" + + + +size_t h_get_param_k(void *param) { + uintptr_t params_int; + + params_int = (uintptr_t)param; + return (size_t)params_int; + +} + + + +char * h_format_description_with_param_k(HAllocator *mm__, const char *backend_name, size_t k){ + const char *format_str = "%s(%zu) parser backend"; + + const char *generic_descr_format_str = + "%s(k) parser backend (default k is %zu)"; + size_t len; + char *descr = NULL; + + + if (k > 0) { + /* A specific k was given */ + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, backend_name, k); + /* Allocate it and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, format_str, backend_name, k); + } + } else { + /* + * No specific k, would use DEFAULT_KMAX. We say what DEFAULT_KMAX + * was compiled in in the description. + */ + len = snprintf(NULL, 0, generic_descr_format_str, backend_name, DEFAULT_KMAX); + /* Allocate and do the real snprintf */ + descr = h_new(char, len + 1); + if (descr) { + snprintf(descr, len + 1, generic_descr_format_str, backend_name, DEFAULT_KMAX); + } + } + + return descr; +} + +char * h_format_name_with_param_k(HAllocator *mm__, const char *backend_name, size_t k){ + const char *format_str = "%s(%zu)", *generic_name = "%s(k)"; + size_t len; + char *name = NULL; + + if (k > 0) { + /* A specific k was given */ + /* Measure how big a buffer we need */ + len = snprintf(NULL, 0, format_str, backend_name, k); + /* Allocate it and do the real snprintf */ + name = h_new(char, len + 1); + if (name) { + snprintf(name, len + 1, format_str, backend_name, k); + } + } else { + /* No specific k */ + len = snprintf(NULL, 0, generic_name, backend_name, k); + name = h_new(char, len + 1); + if (name) { + snprintf(name, len + 1, generic_name, backend_name); + } + } + + return name; +} + +/*TODO better error handling*/ +int h_extract_param_k(HParserBackendWithParams * be_with_params, backend_with_params_t * be_with_params_t) { + + be_with_params->params = NULL; + + int param_0 = -1; + int success = 0; + uintptr_t param; + + size_t expected_params_len = 1; + backend_params_t params_t = be_with_params_t->params; + size_t actual_params_len = params_t.len; + + if(actual_params_len >= expected_params_len) { + backend_param_with_name_t param_t = params_t.params[0]; + success = sscanf((char*)param_t.param.param, "%d", ¶m_0); + } + + if(success) { + param = (uintptr_t) param_0; + be_with_params->params = (void *)param; + } + + return success; + +} diff --git a/src/backends/params.h b/src/backends/params.h new file mode 100644 index 0000000000000000000000000000000000000000..f4f56200ce2942171ba045f0262aafd23e61b4ca --- /dev/null +++ b/src/backends/params.h @@ -0,0 +1,19 @@ +#ifndef HAMMER_BACKENDS_PARAMS__H +#define HAMMER_BACKENDS_PARAMS__H + +#include "../hammer.h" +#include "../internal.h" + +static const size_t DEFAULT_KMAX = 1; + + + +size_t h_get_param_k(void *param); + +char * h_format_description_with_param_k(HAllocator *mm__, const char *backend_name, size_t k); + +char * h_format_name_with_param_k(HAllocator *mm__, const char *backend_name, size_t k); + +int h_extract_param_k(HParserBackendWithParams * be_with_params, backend_with_params_t * be_with_params_t); + +#endif /* !defined(HAMMER_BACKENDS_PARAMS__H) */