X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Fecoli_node_option.c;h=4610a465851287501170347f1a6e35be661b3aef;hb=c87286ff9f1d70e3722640d6f0b5846fdc493d38;hp=39c1004955093eee65eed19125e37f39dd86aefc;hpb=575fd5b430d5f1557d9a6bdb19c037efaf023759;p=protos%2Flibecoli.git diff --git a/lib/ecoli_node_option.c b/lib/ecoli_node_option.c index 39c1004..4610a46 100644 --- a/lib/ecoli_node_option.c +++ b/lib/ecoli_node_option.c @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include #include #include @@ -44,47 +46,32 @@ struct ec_node_option { struct ec_node *child; }; -static struct ec_parsed *ec_node_option_parse(const struct ec_node *gen_node, - const struct ec_strvec *strvec) +static int +ec_node_option_parse(const struct ec_node *gen_node, + struct ec_parsed *state, + const struct ec_strvec *strvec) { struct ec_node_option *node = (struct ec_node_option *)gen_node; - struct ec_parsed *parsed = NULL, *child_parsed; - struct ec_strvec *match_strvec; - - parsed = ec_parsed_new(); - if (parsed == NULL) - goto fail; - - child_parsed = ec_node_parse_strvec(node->child, strvec); - if (child_parsed == NULL) - goto fail; - - if (ec_parsed_matches(child_parsed)) { - ec_parsed_add_child(parsed, child_parsed); - match_strvec = ec_strvec_dup(child_parsed->strvec); - } else { - ec_parsed_free(child_parsed); - match_strvec = ec_strvec_new(); - } - - if (match_strvec == NULL) - goto fail; + int ret; - ec_parsed_set_match(parsed, gen_node, match_strvec); + ret = ec_node_parse_child(node->child, state, strvec); + if (ret == EC_PARSED_NOMATCH) + return 0; + else if (ret < 0) + return ret; - return parsed; - - fail: - ec_parsed_free(parsed); - return NULL; + return ret; } -static struct ec_completed *ec_node_option_complete(const struct ec_node *gen_node, - const struct ec_strvec *strvec) +static int +ec_node_option_complete(const struct ec_node *gen_node, + struct ec_completed *completed, + struct ec_parsed *parsed, + const struct ec_strvec *strvec) { struct ec_node_option *node = (struct ec_node_option *)gen_node; - return ec_node_complete_strvec(node->child, strvec); + return ec_node_complete_child(node->child, completed, parsed, strvec); } static void ec_node_option_free_priv(struct ec_node *gen_node) @@ -112,7 +99,7 @@ struct ec_node *ec_node_option(const char *id, struct ec_node *child) if (child == NULL) return NULL; - gen_node = __ec_node_new(&ec_node_option_type, id); + gen_node = __ec_node(&ec_node_option_type, id); if (gen_node == NULL) { ec_node_free(child); return NULL; @@ -127,6 +114,7 @@ struct ec_node *ec_node_option(const char *id, struct ec_node *child) return &node->gen; } +/* LCOV_EXCL_START */ static int ec_node_option_testcase(void) { struct ec_node *node; @@ -165,6 +153,7 @@ static int ec_node_option_testcase(void) return ret; } +/* LCOV_EXCL_STOP */ static struct ec_test ec_node_option_test = { .name = "node_option",