list children in a table, not in a list
[protos/libecoli.git] / lib / ecoli_node_subset.c
index 9dc6020..f0d2384 100644 (file)
@@ -268,15 +268,30 @@ static void ec_node_subset_free_priv(struct ec_node *gen_node)
        ec_free(node->table);
 }
 
+static struct ec_node_type ec_node_subset_type = {
+       .name = "subset",
+       .parse = ec_node_subset_parse,
+       .complete = ec_node_subset_complete,
+       .size = sizeof(struct ec_node_subset),
+       .free_priv = ec_node_subset_free_priv,
+};
+
+EC_NODE_TYPE_REGISTER(ec_node_subset_type);
+
 int ec_node_subset_add(struct ec_node *gen_node, struct ec_node *child)
 {
        struct ec_node_subset *node = (struct ec_node_subset *)gen_node;
        struct ec_node **table;
 
-       assert(node != NULL);
+       assert(node != NULL); // XXX specific assert for it, like in libyang
+
+       if (child == NULL) {
+               errno = EINVAL;
+               goto fail;
+       }
 
-       if (child == NULL)
-               return -EINVAL;
+       if (ec_node_check_type(gen_node, &ec_node_subset_type) < 0)
+               goto fail;
 
        table = ec_realloc(node->table, (node->len + 1) * sizeof(*node->table));
        if (table == NULL) {
@@ -285,23 +300,19 @@ int ec_node_subset_add(struct ec_node *gen_node, struct ec_node *child)
        }
 
        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_subset_type = {
-       .name = "subset",
-       .parse = ec_node_subset_parse,
-       .complete = ec_node_subset_complete,
-       .size = sizeof(struct ec_node_subset),
-       .free_priv = ec_node_subset_free_priv,
-};
-
-EC_NODE_TYPE_REGISTER(ec_node_subset_type);
+fail:
+       ec_node_free(child);
+       return -1;
+}
 
 struct ec_node *__ec_node_subset(const char *id, ...)
 {