X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_node_once.c;h=5248d13bf9c989b38c3646c99e749acafd16952c;hb=f4ec52ffc80b673a0f7e848c568359abf4f3bc47;hp=51538f108d4137b92149380904201c93b01335d8;hpb=0a2b19af9303c4a0ec05bea7afe1803a429517bf;p=protos%2Flibecoli.git diff --git a/lib/ecoli_node_once.c b/lib/ecoli_node_once.c index 51538f1..5248d13 100644 --- a/lib/ecoli_node_once.c +++ b/lib/ecoli_node_once.c @@ -14,8 +14,8 @@ #include #include #include -#include -#include +#include +#include #include #include #include @@ -29,18 +29,18 @@ struct ec_node_once { }; static unsigned int -count_node(struct ec_parsed *parsed, const struct ec_node *node) +count_node(struct ec_parse *parse, const struct ec_node *node) { - struct ec_parsed *child; + struct ec_parse *child; unsigned int count = 0; - if (parsed == NULL) + if (parse == NULL) return 0; - if (ec_parsed_get_node(parsed) == node) + if (ec_parse_get_node(parse) == node) count++; - EC_PARSED_FOREACH_CHILD(child, parsed) + EC_PARSE_FOREACH_CHILD(child, parse) count += count_node(child, node); return count; @@ -48,7 +48,7 @@ count_node(struct ec_parsed *parsed, const struct ec_node *node) static int ec_node_once_parse(const struct ec_node *gen_node, - struct ec_parsed *state, + struct ec_parse *state, const struct ec_strvec *strvec) { struct ec_node_once *node = (struct ec_node_once *)gen_node; @@ -57,31 +57,31 @@ ec_node_once_parse(const struct ec_node *gen_node, /* count the number of occurences of the node: if already parsed, * do not match */ - count = count_node(ec_parsed_get_root(state), node->child); + count = count_node(ec_parse_get_root(state), node->child); if (count > 0) - return EC_PARSED_NOMATCH; + return EC_PARSE_NOMATCH; return ec_node_parse_child(node->child, state, strvec); } static int ec_node_once_complete(const struct ec_node *gen_node, - struct ec_completed *completed, + struct ec_comp *comp, const struct ec_strvec *strvec) { struct ec_node_once *node = (struct ec_node_once *)gen_node; - struct ec_parsed *parsed = ec_completed_get_state(completed); + struct ec_parse *parse = ec_comp_get_state(comp); unsigned int count; int ret; /* count the number of occurences of the node: if already parsed, * do not match */ - count = count_node(ec_parsed_get_root(parsed), node->child); + count = count_node(ec_parse_get_root(parse), node->child); if (count > 0) return 0; - ret = ec_node_complete_child(node->child, completed, strvec); + ret = ec_node_complete_child(node->child, comp, strvec); if (ret < 0) return ret; @@ -95,12 +95,35 @@ static void ec_node_once_free_priv(struct ec_node *gen_node) ec_node_free(node->child); } +static size_t +ec_node_once_get_children_count(const struct ec_node *gen_node) +{ + struct ec_node_once *node = (struct ec_node_once *)gen_node; + + if (node->child) + return 1; + return 0; +} + +static struct ec_node * +ec_node_once_get_child(const struct ec_node *gen_node, size_t i) +{ + struct ec_node_once *node = (struct ec_node_once *)gen_node; + + if (i >= 1) + return NULL; + + return node->child; +} + static struct ec_node_type ec_node_once_type = { .name = "once", .parse = ec_node_once_parse, .complete = ec_node_once_complete, .size = sizeof(struct ec_node_once), .free_priv = ec_node_once_free_priv, + .get_children_count = ec_node_once_get_children_count, + .get_child = ec_node_once_get_child, }; EC_NODE_TYPE_REGISTER(ec_node_once_type); @@ -117,9 +140,6 @@ int ec_node_once_set(struct ec_node *gen_node, struct ec_node *child) if (ec_node_check_type(gen_node, &ec_node_once_type) < 0) goto fail; - if (ec_node_add_child(gen_node, child) < 0) - goto fail; - node->child = child; return 0;