X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_node_seq.c;h=ff0c5de8e928ef39e75b82412f978088824b9c1c;hb=dec2d7fa17ae1e8b3d1dec8e396d057757baf4f3;hp=be03f313bbd659a1eb3f7af6e26f30ec3c555b08;hpb=7c07e2a8b3b5851de0c238da830291f041185778;p=protos%2Flibecoli.git diff --git a/lib/ecoli_node_seq.c b/lib/ecoli_node_seq.c index be03f31..ff0c5de 100644 --- a/lib/ecoli_node_seq.c +++ b/lib/ecoli_node_seq.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -163,6 +164,8 @@ static void ec_node_seq_free_priv(struct ec_node *gen_node) for (i = 0; i < node->len; i++) ec_node_free(node->table[i]); ec_free(node->table); + node->table = NULL; + node->len = 0; } static const struct ec_config_schema ec_node_seq_subschema[] = { @@ -170,6 +173,9 @@ static const struct ec_config_schema ec_node_seq_subschema[] = { .desc = "A child node which is part of the sequence.", .type = EC_CONFIG_TYPE_NODE, }, + { + .type = EC_CONFIG_TYPE_NONE, + }, }; static const struct ec_config_schema ec_node_seq_schema[] = { @@ -178,7 +184,9 @@ static const struct ec_config_schema ec_node_seq_schema[] = { .desc = "The list of children nodes, to be parsed in sequence.", .type = EC_CONFIG_TYPE_LIST, .subschema = ec_node_seq_subschema, - .subschema_len = EC_COUNT_OF(ec_node_seq_subschema), + }, + { + .type = EC_CONFIG_TYPE_NONE, }, }; @@ -186,43 +194,25 @@ static int ec_node_seq_set_config(struct ec_node *gen_node, const struct ec_config *config) { struct ec_node_seq *node = (struct ec_node_seq *)gen_node; - const struct ec_config *children = NULL, *child; struct ec_node **table = NULL; - size_t n, i; - - children = ec_config_dict_get(config, "children"); - if (children == NULL) { - errno = EINVAL; - goto fail; - } - - n = 0; - TAILQ_FOREACH(child, &children->list, next) - n++; + size_t i, len = 0; - table = ec_malloc(n * sizeof(*table)); + table = ec_node_config_node_list_to_table( + ec_config_dict_get(config, "children"), &len); if (table == NULL) goto fail; - n = 0; - TAILQ_FOREACH(child, &children->list, next) { - table[n] = ec_node_clone(child->node); - n++; - } - for (i = 0; i < node->len; i++) ec_node_free(node->table[i]); ec_free(node->table); node->table = table; - node->len = n; + node->len = len; return 0; fail: - if (table != NULL) { - for (i = 0; i < n; i++) - ec_node_free(table[i]); - } + for (i = 0; i < len; i++) + ec_node_free(table[i]); ec_free(table); return -1; } @@ -234,32 +224,25 @@ ec_node_seq_get_children_count(const struct ec_node *gen_node) return node->len; } -static struct ec_node * -ec_node_seq_get_child(const struct ec_node *gen_node, size_t i) +static int +ec_node_seq_get_child(const struct ec_node *gen_node, size_t i, + struct ec_node **child, unsigned int *refs) { struct ec_node_seq *node = (struct ec_node_seq *)gen_node; if (i >= node->len) - return NULL; - - return node->table[i]; -} - -static unsigned int -ec_node_seq_get_child_refs(const struct ec_node *gen_node, size_t i) -{ - (void)gen_node; - (void)i; + return -1; + *child = node->table[i]; /* each child node is referenced twice: once in the config and * once in the node->table[] */ - return 2; + *refs = 2; + return 0; } static struct ec_node_type ec_node_seq_type = { .name = "seq", .schema = ec_node_seq_schema, - .schema_len = EC_COUNT_OF(ec_node_seq_schema), .set_config = ec_node_seq_set_config, .parse = ec_node_seq_parse, .complete = ec_node_seq_complete, @@ -267,7 +250,6 @@ static struct ec_node_type ec_node_seq_type = { .free_priv = ec_node_seq_free_priv, .get_children_count = ec_node_seq_get_children_count, .get_child = ec_node_seq_get_child, - .get_child_refs = ec_node_seq_get_child_refs, }; EC_NODE_TYPE_REGISTER(ec_node_seq_type); @@ -333,7 +315,7 @@ struct ec_node *__ec_node_seq(const char *id, ...) va_start(ap, id); child = va_arg(ap, struct ec_node *); - gen_node = __ec_node(&ec_node_seq_type, id); + gen_node = ec_node_from_type(&ec_node_seq_type, id); if (gen_node == NULL) goto fail_free_children;