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);
}
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");
n = 0;
TAILQ_FOREACH(child, &children->list, next) {
- table[n] = child->node;
+ table[n] = ec_node_clone(child->node);
n++;
}
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;
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);
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 *
{
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 = {
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 *);
}
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);
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);
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;
}
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)
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);
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)
{
.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,
};
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)
{
.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,
};
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)
{
.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,
};
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);
}
}
ec_free(node->table);
- ec_node_free(node->child);
}
static size_t
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);
}
/* 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,
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)
{
.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,
};
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);
}