ec_free(node->table);
}
+static struct ec_node_type ec_node_or_type = {
+ .name = "or",
+ .parse = ec_node_or_parse,
+ .complete = ec_node_or_complete,
+ .get_max_parse_len = ec_node_or_get_max_parse_len,
+ .size = sizeof(struct ec_node_or),
+ .free_priv = ec_node_or_free_priv,
+};
+
+EC_NODE_TYPE_REGISTER(ec_node_or_type);
+
int ec_node_or_add(struct ec_node *gen_node, struct ec_node *child)
{
struct ec_node_or *node = (struct ec_node_or *)gen_node;
assert(node != NULL);
- if (child == NULL)
- return -EINVAL;
+ assert(node != NULL);
+
+ if (child == NULL) {
+ errno = EINVAL;
+ goto fail;
+ }
+
+ if (ec_node_check_type(gen_node, &ec_node_or_type) < 0)
+ goto fail;
table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
if (table == NULL)
- return -1;
+ goto fail;
node->table = table;
+
+ if (ec_node_add_child(gen_node, child) < 0)
+ goto fail;
+
table[node->len] = child;
node->len++;
- TAILQ_INSERT_TAIL(&gen_node->children, child, next);
-
return 0;
-}
-
-static struct ec_node_type ec_node_or_type = {
- .name = "or",
- .parse = ec_node_or_parse,
- .complete = ec_node_or_complete,
- .get_max_parse_len = ec_node_or_get_max_parse_len,
- .size = sizeof(struct ec_node_or),
- .free_priv = ec_node_or_free_priv,
-};
-EC_NODE_TYPE_REGISTER(ec_node_or_type);
+fail:
+ ec_node_free(child);
+ return -1;
+}
struct ec_node *__ec_node_or(const char *id, ...)
{