list children in a table, not in a list
[protos/libecoli.git] / lib / ecoli_node_or.c
index c0d43e2..03aa5fe 100644 (file)
@@ -112,6 +112,17 @@ static void ec_node_or_free_priv(struct ec_node *gen_node)
        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;
@@ -119,32 +130,34 @@ int ec_node_or_add(struct ec_node *gen_node, struct ec_node *child)
 
        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, ...)
 {