return EC_PARSED_NOMATCH;
}
-static struct ec_completed *
+static int
ec_node_or_complete(const struct ec_node *gen_node,
- struct ec_parsed *state,
+ struct ec_completed *completed,
+ struct ec_parsed *parsed,
const struct ec_strvec *strvec)
{
struct ec_node_or *node = (struct ec_node_or *)gen_node;
- struct ec_completed *completed, *child_completed;
+ int ret;
size_t n;
- completed = ec_completed();
- if (completed == NULL)
- return NULL;
-
for (n = 0; n < node->len; n++) {
- child_completed = ec_node_complete_child(node->table[n],
- state, strvec);
-
- if (child_completed == NULL) // XXX fail instead?
- continue;
-
- ec_completed_merge(completed, child_completed);
+ ret = ec_node_complete_child(node->table[n],
+ completed, parsed, strvec);
+ if (ret < 0)
+ return ret;
}
- return completed;
+ return 0;
}
static size_t ec_node_or_get_max_parse_len(const struct ec_node *gen_node)
}
ret |= EC_TEST_CHECK_COMPLETE(node,
"", EC_NODE_ENDLIST,
- "foo", "bar", "bar2", "toto", "titi", EC_NODE_ENDLIST,
- "");
+ "foo", "bar", "bar2", "toto", "titi", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"f", EC_NODE_ENDLIST,
- "oo", EC_NODE_ENDLIST,
- "oo");
+ "foo", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"b", EC_NODE_ENDLIST,
- "ar", "ar2", EC_NODE_ENDLIST,
- "ar");
+ "bar", "bar2", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"bar", EC_NODE_ENDLIST,
- "", "2", EC_NODE_ENDLIST,
- "");
+ "bar", "bar2", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"t", EC_NODE_ENDLIST,
- "oto", "iti", EC_NODE_ENDLIST,
- "");
+ "toto", "titi", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"to", EC_NODE_ENDLIST,
- "to", EC_NODE_ENDLIST,
- "to");
+ "toto", EC_NODE_ENDLIST);
ret |= EC_TEST_CHECK_COMPLETE(node,
"x", EC_NODE_ENDLIST,
- EC_NODE_ENDLIST,
- "");
+ EC_NODE_ENDLIST);
ec_node_free(node);
return ret;