From: Olivier Matz Date: Fri, 13 Jul 2018 20:40:57 +0000 (+0200) Subject: continue to add api to get children X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=8c1e15f7d7e507c02f41ef9c3dbe310005ce369f;p=protos%2Flibecoli.git continue to add api to get children and fix tests --- diff --git a/lib/ecoli_node_cmd.c b/lib/ecoli_node_cmd.c index bd2f767..1750cab 100644 --- a/lib/ecoli_node_cmd.c +++ b/lib/ecoli_node_cmd.c @@ -411,11 +411,13 @@ ec_node_cmd_complete(const struct ec_node *gen_node, static void ec_node_cmd_free_priv(struct ec_node *gen_node) { struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node; + size_t i; ec_free(node->cmd_str); - ec_node_free(node->cmd); ec_node_free(node->expr); ec_node_free(node->parser); + for (i = 0; i < node->len; i++) + ec_node_free(node->table[i]); ec_free(node->table); } @@ -454,7 +456,7 @@ static int ec_node_cmd_set_config(struct ec_node *gen_node, struct ec_node *cmd = NULL; struct ec_node **table = NULL; char *cmd_str = NULL; - size_t n; + size_t n, i; /* retrieve config locally */ expr = ec_config_dict_get(config, "expr"); @@ -483,7 +485,7 @@ static int ec_node_cmd_set_config(struct ec_node *gen_node, n = 0; TAILQ_FOREACH(child, &children->list, next) { - table[n] = child->node; + table[n] = ec_node_clone(child->node); n++; } @@ -496,6 +498,8 @@ static int ec_node_cmd_set_config(struct ec_node *gen_node, node->cmd = cmd; ec_free(node->cmd_str); node->cmd_str = cmd_str; + for (i = 0; i < node->len; i++) + ec_node_free(node->table[i]); ec_free(node->table); node->table = table; node->len = n; @@ -503,6 +507,10 @@ static int ec_node_cmd_set_config(struct ec_node *gen_node, return 0; fail: + if (table != NULL) { + for (i = 0; i < n; i++) + ec_node_free(table[i]); + } ec_free(table); ec_free(cmd_str); ec_node_free(cmd); @@ -513,7 +521,10 @@ static size_t ec_node_cmd_get_children_count(const struct ec_node *gen_node) { struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node; - return node->len; + + if (node->cmd == NULL) + return 0; + return 1; } static struct ec_node * @@ -521,10 +532,10 @@ ec_node_cmd_get_child(const struct ec_node *gen_node, size_t i) { struct ec_node_cmd *node = (struct ec_node_cmd *)gen_node; - if (i >= node->len) + if (i > 0) return NULL; - return node->table[i]; + return node->cmd; } static struct ec_node_type ec_node_cmd_type = { @@ -549,6 +560,7 @@ struct ec_node *__ec_node_cmd(const char *id, const char *cmd, ...) struct ec_node_cmd *node = NULL; struct ec_node *child; va_list ap; + int ret; va_start(ap, cmd); child = va_arg(ap, struct ec_node *); @@ -591,7 +603,9 @@ struct ec_node *__ec_node_cmd(const char *id, const char *cmd, ...) } children = NULL; - if (ec_node_set_config(gen_node, config) < 0) + ret = ec_node_set_config(gen_node, config); + config = NULL; /* freed */ + if (ret < 0) goto fail; va_end(ap); @@ -603,6 +617,7 @@ fail_free_children: ec_node_free(child); fail: ec_node_free(gen_node); /* will also free added children */ + ec_config_free(children); ec_config_free(config); va_end(ap); @@ -620,9 +635,6 @@ static int ec_node_cmd_testcase(void) ec_node_int("x", 0, 10, 10), ec_node_int("y", 20, 30, 10) ); - ec_node_free(node); - return 0; - if (node == NULL) { EC_LOG(EC_LOG_ERR, "cannot create node\n"); return -1; diff --git a/lib/ecoli_node_expr.c b/lib/ecoli_node_expr.c index c92749e..2320c0c 100644 --- a/lib/ecoli_node_expr.c +++ b/lib/ecoli_node_expr.c @@ -96,8 +96,6 @@ static void ec_node_expr_free_priv(struct ec_node *gen_node) } ec_free(node->open_ops); ec_free(node->close_ops); - - ec_node_free(node->child); } static int ec_node_expr_build(struct ec_node_expr *node) @@ -229,12 +227,35 @@ fail: return -1; } +static size_t +ec_node_expr_get_children_count(const struct ec_node *gen_node) +{ + struct ec_node_expr *node = (struct ec_node_expr *)gen_node; + + if (node->child) + return 1; + return 0; +} + +static struct ec_node * +ec_node_expr_get_child(const struct ec_node *gen_node, size_t i) +{ + struct ec_node_expr *node = (struct ec_node_expr *)gen_node; + + if (i >= 1) + return NULL; + + return node->child; +} + static struct ec_node_type ec_node_expr_type = { .name = "expr", .parse = ec_node_expr_parse, .complete = ec_node_expr_complete, .size = sizeof(struct ec_node_expr), .free_priv = ec_node_expr_free_priv, + .get_children_count = ec_node_expr_get_children_count, + .get_child = ec_node_expr_get_child, }; EC_NODE_TYPE_REGISTER(ec_node_expr_type); diff --git a/lib/ecoli_node_many.c b/lib/ecoli_node_many.c index 6a5f676..728f1c6 100644 --- a/lib/ecoli_node_many.c +++ b/lib/ecoli_node_many.c @@ -154,13 +154,6 @@ ec_node_many_complete(const struct ec_node *gen_node, strvec); } -static void ec_node_many_free_priv(struct ec_node *gen_node) -{ - struct ec_node_many *node = (struct ec_node_many *)gen_node; - - ec_node_free(node->child); -} - static size_t ec_node_many_get_children_count(const struct ec_node *gen_node) { @@ -187,7 +180,6 @@ static struct ec_node_type ec_node_many_type = { .parse = ec_node_many_parse, .complete = ec_node_many_complete, .size = sizeof(struct ec_node_many), - .free_priv = ec_node_many_free_priv, .get_children_count = ec_node_many_get_children_count, .get_child = ec_node_many_get_child, }; diff --git a/lib/ecoli_node_once.c b/lib/ecoli_node_once.c index 5248d13..738b43d 100644 --- a/lib/ecoli_node_once.c +++ b/lib/ecoli_node_once.c @@ -88,13 +88,6 @@ ec_node_once_complete(const struct ec_node *gen_node, return 0; } -static void ec_node_once_free_priv(struct ec_node *gen_node) -{ - struct ec_node_once *node = (struct ec_node_once *)gen_node; - - ec_node_free(node->child); -} - static size_t ec_node_once_get_children_count(const struct ec_node *gen_node) { @@ -121,7 +114,6 @@ static struct ec_node_type ec_node_once_type = { .parse = ec_node_once_parse, .complete = ec_node_once_complete, .size = sizeof(struct ec_node_once), - .free_priv = ec_node_once_free_priv, .get_children_count = ec_node_once_get_children_count, .get_child = ec_node_once_get_child, }; diff --git a/lib/ecoli_node_option.c b/lib/ecoli_node_option.c index befbb2e..b4bb391 100644 --- a/lib/ecoli_node_option.c +++ b/lib/ecoli_node_option.c @@ -54,13 +54,6 @@ ec_node_option_complete(const struct ec_node *gen_node, return ec_node_complete_child(node->child, comp, strvec); } -static void ec_node_option_free_priv(struct ec_node *gen_node) -{ - struct ec_node_option *node = (struct ec_node_option *)gen_node; - - ec_node_free(node->child); -} - static size_t ec_node_option_get_children_count(const struct ec_node *gen_node) { @@ -87,7 +80,6 @@ static struct ec_node_type ec_node_option_type = { .parse = ec_node_option_parse, .complete = ec_node_option_complete, .size = sizeof(struct ec_node_option), - .free_priv = ec_node_option_free_priv, .get_children_count = ec_node_option_get_children_count, .get_child = ec_node_option_get_child, }; diff --git a/lib/ecoli_node_or.c b/lib/ecoli_node_or.c index ad3786e..67047b3 100644 --- a/lib/ecoli_node_or.c +++ b/lib/ecoli_node_or.c @@ -68,10 +68,7 @@ ec_node_or_complete(const struct ec_node *gen_node, static void ec_node_or_free_priv(struct ec_node *gen_node) { struct ec_node_or *node = (struct ec_node_or *)gen_node; - unsigned int i; - for (i = 0; i < node->len; i++) - ec_node_free(node->table[i]); ec_free(node->table); } diff --git a/lib/ecoli_node_re_lex.c b/lib/ecoli_node_re_lex.c index e0acdfe..79a75eb 100644 --- a/lib/ecoli_node_re_lex.c +++ b/lib/ecoli_node_re_lex.c @@ -149,7 +149,6 @@ static void ec_node_re_lex_free_priv(struct ec_node *gen_node) } ec_free(node->table); - ec_node_free(node->child); } static size_t diff --git a/lib/ecoli_node_seq.c b/lib/ecoli_node_seq.c index 34512b6..ed7325f 100644 --- a/lib/ecoli_node_seq.c +++ b/lib/ecoli_node_seq.c @@ -157,10 +157,7 @@ ec_node_seq_complete(const struct ec_node *gen_node, static void ec_node_seq_free_priv(struct ec_node *gen_node) { struct ec_node_seq *node = (struct ec_node_seq *)gen_node; - unsigned int i; - for (i = 0; i < node->len; i++) - ec_node_free(node->table[i]); ec_free(node->table); } @@ -266,7 +263,7 @@ fail: /* LCOV_EXCL_START */ static int ec_node_seq_testcase(void) { - struct ec_node *node; + struct ec_node *node = NULL; int testres = 0; node = EC_NODE_SEQ(EC_NO_ID, diff --git a/lib/ecoli_node_sh_lex.c b/lib/ecoli_node_sh_lex.c index b39ce21..a0b7a05 100644 --- a/lib/ecoli_node_sh_lex.c +++ b/lib/ecoli_node_sh_lex.c @@ -336,13 +336,6 @@ ec_node_sh_lex_complete(const struct ec_node *gen_node, return -1; } -static void ec_node_sh_lex_free_priv(struct ec_node *gen_node) -{ - struct ec_node_sh_lex *node = (struct ec_node_sh_lex *)gen_node; - - ec_node_free(node->child); -} - static size_t ec_node_sh_lex_get_children_count(const struct ec_node *gen_node) { @@ -369,7 +362,6 @@ static struct ec_node_type ec_node_sh_lex_type = { .parse = ec_node_sh_lex_parse, .complete = ec_node_sh_lex_complete, .size = sizeof(struct ec_node_sh_lex), - .free_priv = ec_node_sh_lex_free_priv, .get_children_count = ec_node_sh_lex_get_children_count, .get_child = ec_node_sh_lex_get_child, }; diff --git a/lib/ecoli_node_subset.c b/lib/ecoli_node_subset.c index a830344..1afbde7 100644 --- a/lib/ecoli_node_subset.c +++ b/lib/ecoli_node_subset.c @@ -234,10 +234,7 @@ ec_node_subset_complete(const struct ec_node *gen_node, static void ec_node_subset_free_priv(struct ec_node *gen_node) { struct ec_node_subset *node = (struct ec_node_subset *)gen_node; - unsigned int i; - for (i = 0; i < node->len; i++) - ec_node_free(node->table[i]); ec_free(node->table); }