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);
+ ret = ec_node_complete_child(node->table[n],
+ completed, parsed, strvec);
+ if (ret < 0)
+ return ret;
+ }
- if (child_completed == NULL) // XXX fail instead?
- continue;
+ return 0;
+}
+
+static size_t ec_node_or_get_max_parse_len(const struct ec_node *gen_node)
+{
+ struct ec_node_or *node = (struct ec_node_or *)gen_node;
+ size_t i, ret = 0, len;
- ec_completed_merge(completed, child_completed);
+ for (i = 0; i < node->len; i++) {
+ len = ec_node_get_max_parse_len(node->table[i]);
+ if (len > ret)
+ ret = len;
}
- return completed;
+ return ret;
}
static void ec_node_or_free_priv(struct ec_node *gen_node)
.name = "or",
.parse = ec_node_or_parse,
.complete = ec_node_or_complete,
+ .get_max_parse_len = ec_node_or_get_max_parse_len,
.size = sizeof(struct ec_node_or),
.free_priv = ec_node_or_free_priv,
};