From 30e5cbaaadb72f5a1bc42335c22d0a92606dedbd Mon Sep 17 00:00:00 2001 From: Olivier Matz Date: Thu, 7 Mar 2019 19:30:47 +0100 Subject: [PATCH] node_any: add a C api to match strvec attributes --- include/ecoli_node_any.h | 17 +++++++++++++++-- src/ecoli_node_any.c | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/include/ecoli_node_any.h b/include/ecoli_node_any.h index ee638aa..cb671e3 100644 --- a/include/ecoli_node_any.h +++ b/include/ecoli_node_any.h @@ -3,12 +3,25 @@ */ /** - * This node always matches 1 string in the vector + * This node always matches 1 string in the vector. + * An optional strvec attribute can be checked too. These + * attributes are usually set by a lexer node. */ #ifndef ECOLI_NODE_ANY_ #define ECOLI_NODE_ANY_ -/* no specific API for this node */ +/** + * Create a "any" node. + * + * @param id + * The node identifier. + * @param attr + * The strvec attribute to match, or NULL. + * @return + * The ecoli node. + */ +struct ec_node * +ec_node_any(const char *id, const char *attr); #endif diff --git a/src/ecoli_node_any.c b/src/ecoli_node_any.c index 9166dbb..fbcc460 100644 --- a/src/ecoli_node_any.c +++ b/src/ecoli_node_any.c @@ -99,6 +99,38 @@ static struct ec_node_type ec_node_any_type = { EC_NODE_TYPE_REGISTER(ec_node_any_type); +struct ec_node * +ec_node_any(const char *id, const char *attr) +{ + struct ec_config *config = NULL; + struct ec_node *gen_node = NULL; + int ret; + + gen_node = ec_node_from_type(&ec_node_any_type, id); + if (gen_node == NULL) + return NULL; + + config = ec_config_dict(); + if (config == NULL) + goto fail; + + ret = ec_config_dict_set(config, "attr", ec_config_string(attr)); + if (ret < 0) + goto fail; + + ret = ec_node_set_config(gen_node, config); + config = NULL; + if (ret < 0) + goto fail; + + return gen_node; + +fail: + ec_config_free(config); + ec_node_free(gen_node); + return NULL; +} + /* LCOV_EXCL_START */ static int ec_node_any_testcase(void) { -- 2.39.5