return 1;
}
+static size_t ec_node_int_get_max_parse_len(const struct ec_node *gen_node)
+{
+ (void)gen_node;
+ return 1;
+}
+
static struct ec_node_type ec_node_int_type = {
.name = "int",
.parse = ec_node_int_parse,
.complete = ec_node_default_complete,
+ .get_max_parse_len = ec_node_int_get_max_parse_len,
.size = sizeof(struct ec_node_int),
};
return completed;
}
+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;
+
+ for (i = 0; i < node->len; i++) {
+ len = ec_node_get_max_parse_len(node->table[i]);
+ if (len > ret)
+ ret = len;
+ }
+
+ return ret;
+}
+
static void ec_node_or_free_priv(struct ec_node *gen_node)
{
struct ec_node_or *node = (struct ec_node_or *)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,
};
return 1;
}
+static size_t ec_node_re_get_max_parse_len(const struct ec_node *gen_node)
+{
+ (void)gen_node;
+ return 1;
+}
+
static void ec_node_re_free_priv(struct ec_node *gen_node)
{
struct ec_node_re *node = (struct ec_node_re *)gen_node;
.name = "re",
.parse = ec_node_re_parse,
.complete = ec_node_default_complete,
+ .get_max_parse_len = ec_node_re_get_max_parse_len,
.size = sizeof(struct ec_node_re),
.free_priv = ec_node_re_free_priv,
};
#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
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;
.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,
};
(void)state;
- if (ec_strvec_len(strvec) == 0)
+ if (ec_strvec_len(strvec) != 1)
return EC_PARSED_NOMATCH;
str = ec_strvec_val(strvec, 0);
ec_free(node->string);
}
+static size_t ec_node_str_get_max_parse_len(const struct ec_node *gen_node)
+{
+ (void)gen_node;
+ return 1;
+}
+
static struct ec_node_type ec_node_str_type = {
.name = "str",
.parse = ec_node_str_parse,
.complete = ec_node_str_complete,
+ .get_max_parse_len = ec_node_str_get_max_parse_len,
.desc = ec_node_str_desc,
.size = sizeof(struct ec_node_str),
.free_priv = ec_node_str_free_priv,