max parse len
[protos/libecoli.git] / lib / ecoli_node_seq.c
index 2d6363e..9fa2d1a 100644 (file)
@@ -27,6 +27,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <stdint.h>
 #include <string.h>
 #include <assert.h>
 #include <stdarg.h>
 #include <ecoli_completed.h>
 #include <ecoli_node_str.h>
 #include <ecoli_node_option.h>
+#include <ecoli_node_or.h>
+#include <ecoli_node_many.h>
 #include <ecoli_node_seq.h>
 
 struct ec_node_seq {
        struct ec_node gen;
        struct ec_node **table;
-       unsigned int len;
+       size_t len;
 };
 
 static int
@@ -182,6 +185,22 @@ ec_node_seq_complete(const struct ec_node *gen_node,
        return __ec_node_seq_complete(node->table, node->len, state, strvec);
 }
 
+static size_t ec_node_seq_get_max_parse_len(const struct ec_node *gen_node)
+{
+       struct ec_node_seq *node = (struct ec_node_seq *)gen_node;
+       size_t i, len, ret = 0;
+
+       for (i = 0; i < node->len; i++) {
+               len = ec_node_get_max_parse_len(node->table[i]);
+               if (len <= SIZE_MAX - ret)
+                       ret += len;
+               else
+                       ret = SIZE_MAX;
+       }
+
+       return ret;
+}
+
 static void ec_node_seq_free_priv(struct ec_node *gen_node)
 {
        struct ec_node_seq *node = (struct ec_node_seq *)gen_node;
@@ -196,6 +215,7 @@ static struct ec_node_type ec_node_seq_type = {
        .name = "seq",
        .parse = ec_node_seq_parse,
        .complete = ec_node_seq_complete,
+       .get_max_parse_len = ec_node_seq_get_max_parse_len,
        .size = sizeof(struct ec_node_seq),
        .free_priv = ec_node_seq_free_priv,
 };