X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=src%2Fecoli_parse.c;h=f224fda55b750729301ff09da83ea0ca163481a6;hb=3482cb4f6eba7f49489e5987bc2721007624d49e;hp=3b2707044f9ca1cea03776d7d174857989d70f68;hpb=eab37de05c8760ca59ea4fbac20ecb4b7453fdc0;p=protos%2Flibecoli.git diff --git a/src/ecoli_parse.c b/src/ecoli_parse.c index 3b27070..f224fda 100644 --- a/src/ecoli_parse.c +++ b/src/ecoli_parse.c @@ -319,7 +319,7 @@ ec_parse_get_last_child(const struct ec_parse *parse) return TAILQ_LAST(&parse->children, ec_parse_list); } -struct ec_parse *ec_parse_get_next(const struct ec_parse *parse) +struct ec_parse *ec_parse_next(const struct ec_parse *parse) { return TAILQ_NEXT(parse, next); } @@ -365,15 +365,18 @@ struct ec_parse *ec_parse_get_parent(const struct ec_parse *parse) return parse->parent; } -struct ec_parse *ec_parse_iter_next(struct ec_parse *parse) +struct ec_parse *__ec_parse_iter_next(const struct ec_parse *root, + struct ec_parse *parse, bool iter_children) { struct ec_parse *child, *parent, *next; - child = TAILQ_FIRST(&parse->children); - if (child != NULL) - return child; + if (iter_children) { + child = TAILQ_FIRST(&parse->children); + if (child != NULL) + return child; + } parent = parse->parent; - while (parent != NULL) { + while (parent != NULL && parse != root) { next = TAILQ_NEXT(parse, next); if (next != NULL) return next; @@ -383,15 +386,21 @@ struct ec_parse *ec_parse_iter_next(struct ec_parse *parse) return NULL; } -struct ec_parse *ec_parse_find_first(struct ec_parse *parse, - const char *id) +struct ec_parse * +ec_parse_find_next(struct ec_parse *root, struct ec_parse *start, + const char *id, bool iter_children) { struct ec_parse *iter; - if (parse == NULL) + if (root == NULL) return NULL; + if (start == NULL) + start = root; + else + start = EC_PARSE_ITER_NEXT(root, start, iter_children); - for (iter = parse; iter != NULL; iter = ec_parse_iter_next(iter)) { + for (iter = start; iter != NULL; + iter = EC_PARSE_ITER_NEXT(root, iter, 1)) { if (iter->node != NULL && iter->node->id != NULL && !strcmp(iter->node->id, id)) @@ -401,6 +410,12 @@ struct ec_parse *ec_parse_find_first(struct ec_parse *parse, return NULL; } +struct ec_parse *ec_parse_find(struct ec_parse *parse, + const char *id) +{ + return ec_parse_find_next(parse, NULL, id, 1); +} + struct ec_keyval * ec_parse_get_attrs(struct ec_parse *parse) { @@ -493,16 +508,16 @@ static int ec_parse_testcase(void) ec_parse_free(p2); p2 = NULL; - pc = ec_parse_find_first(p, "id_x"); + pc = ec_parse_find(p, "id_x"); testres |= EC_TEST_CHECK(pc != NULL, "cannot find id_x"); testres |= EC_TEST_CHECK(pc != NULL && ec_parse_get_parent(pc) != NULL && ec_parse_get_parent(ec_parse_get_parent(pc)) == p, "invalid parent\n"); - pc = ec_parse_find_first(p, "id_y"); + pc = ec_parse_find(p, "id_y"); testres |= EC_TEST_CHECK(pc != NULL, "cannot find id_y"); - pc = ec_parse_find_first(p, "id_dezdezdez"); + pc = ec_parse_find(p, "id_dezdezdez"); testres |= EC_TEST_CHECK(pc == NULL, "should not find bad id");