{
struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
+ if (node->child == NULL)
+ return -ENOENT;
return ec_node_parse_child(node->child, state, strvec);
}
{
struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
+ if (node->child == NULL)
+ return -ENOENT;
return ec_node_complete_child(node->child, completed, strvec);
}
ec_node_free(node->child);
}
-static int ec_node_expr_build(struct ec_node *gen_node)
+static int ec_node_expr_build(struct ec_node_expr *node)
{
- struct ec_node_expr *node = (struct ec_node_expr *)gen_node;
struct ec_node *term = NULL, *expr = NULL, *next = NULL,
*pre_op = NULL, *post_op = NULL,
*post = NULL, *weak = NULL;
unsigned int i;
int ret;
+ ec_node_free(node->child);
+ node->child = NULL;
+
if (node->val_node == NULL)
return -EINVAL;
if (node->bin_ops_len == 0 && node->pre_ops_len == 0 &&
weak = NULL;
node->child = expr;
- //ec_node_dump(stdout, node->child); //XXX
return 0;
static struct ec_node_type ec_node_expr_type = {
.name = "expr",
- .build = ec_node_expr_build,
.parse = ec_node_expr_parse,
.complete = ec_node_expr_complete,
.size = sizeof(struct ec_node_expr),
ret = -EINVAL;
if (val_node == NULL)
goto fail;
- ret = -EPERM;
- if (gen_node->flags & EC_NODE_F_BUILT)
- goto fail;
- ret = -EEXIST;
- if (node->val_node != NULL)
- goto fail;
+ ec_node_free(node->val_node);
node->val_node = val_node;
- gen_node->flags &= ~EC_NODE_F_BUILT;
+ ec_node_expr_build(node);
return 0;
ret = -EINVAL;
if (node == NULL || op == NULL)
goto fail;
- ret = -EPERM;
- if (gen_node->flags & EC_NODE_F_BUILT)
- goto fail;
ret = -ENOMEM;
bin_ops = ec_realloc(node->bin_ops,
node->bin_ops = bin_ops;
bin_ops[node->bin_ops_len] = op;
node->bin_ops_len++;
- gen_node->flags &= ~EC_NODE_F_BUILT;
+ ec_node_expr_build(node);
return 0;
ret = -EINVAL;
if (node == NULL || op == NULL)
goto fail;
- ret = -EPERM;
- if (gen_node->flags & EC_NODE_F_BUILT)
- goto fail;
ret = -ENOMEM;
pre_ops = ec_realloc(node->pre_ops,
node->pre_ops = pre_ops;
pre_ops[node->pre_ops_len] = op;
node->pre_ops_len++;
- gen_node->flags &= ~EC_NODE_F_BUILT;
+ ec_node_expr_build(node);
return 0;
ret = -EINVAL;
if (node == NULL || op == NULL)
goto fail;
- ret = -EPERM;
- if (gen_node->flags & EC_NODE_F_BUILT)
- goto fail;
ret = -ENOMEM;
post_ops = ec_realloc(node->post_ops,
node->post_ops = post_ops;
post_ops[node->post_ops_len] = op;
node->post_ops_len++;
- gen_node->flags &= ~EC_NODE_F_BUILT;
+ ec_node_expr_build(node);
return 0;
ret = -EINVAL;
if (node == NULL || open == NULL || close == NULL)
goto fail;
- ret = -EPERM;
- if (gen_node->flags & EC_NODE_F_BUILT)
- goto fail;;
ret = -ENOMEM;
open_ops = ec_realloc(node->open_ops,
open_ops[node->paren_len] = open;
close_ops[node->paren_len] = close;
node->paren_len++;
- gen_node->flags &= ~EC_NODE_F_BUILT;
+ ec_node_expr_build(node);
return 0;