ec_free(node);
}
-size_t ec_node_get_max_parse_len(const struct ec_node *node)
-{
- if (node->type->get_max_parse_len == NULL)
- return SIZE_MAX;
- return node->type->get_max_parse_len(node);
-}
-
struct ec_node *ec_node_clone(struct ec_node *node)
{
if (node != NULL)
{
const char *id, *typename, *desc;
struct ec_node *child;
- size_t maxlen;
size_t i, n;
- maxlen = ec_node_get_max_parse_len(node);
id = ec_node_id(node);
typename = node->type->name;
desc = ec_node_desc(node);
fprintf(out, "node %p type=%s id=%s desc=%s ",
node, typename, id, desc);
- if (maxlen == SIZE_MAX)
- fprintf(out, "maxlen=no\n");
- else
- fprintf(out, "maxlen=%zu\n", maxlen);
n = node->n_children;
for (i = 0; i < n; i++) {
child = node->children[i];
typedef int (*ec_node_complete_t)(const struct ec_node *node,
struct ec_completed *completed_state,
const struct ec_strvec *strvec);
-typedef size_t (*ec_node_get_max_parse_len_t)(const struct ec_node *node);
typedef const char * (*ec_node_desc_t)(const struct ec_node *);
typedef int (*ec_node_init_priv_t)(struct ec_node *);
typedef void (*ec_node_free_priv_t)(struct ec_node *);
ec_node_build_t build; /**< (Re)build the node */
ec_node_parse_t parse;
ec_node_complete_t complete;
- ec_node_get_max_parse_len_t get_max_parse_len;
ec_node_desc_t desc;
size_t size;
ec_node_init_priv_t init_priv;
int ec_node_add_child(struct ec_node *node, struct ec_node *child);
int ec_node_del_child(struct ec_node *node, struct ec_node *child);
-/**
- * Get the max len of strvec that can be parsed by this node
- *
- * If there is no maximum, return SIZE_MAX.
- */
-size_t ec_node_get_max_parse_len(const struct ec_node *node);
-
/* XXX add more accessors */
struct ec_keyval *ec_node_attrs(const struct ec_node *node);
const char *ec_node_id(const struct ec_node *node);
return 1;
}
-static size_t ec_node_int_uint_get_max_parse_len(const struct ec_node *gen_node)
-{
- (void)gen_node;
- return 1;
-}
-
static int
ec_node_uint_init_priv(struct ec_node *gen_node)
{
.name = "int",
.parse = ec_node_int_uint_parse,
.complete = ec_node_default_complete,
- .get_max_parse_len = ec_node_int_uint_get_max_parse_len,
.size = sizeof(struct ec_node_int_uint),
.init_priv = ec_node_uint_init_priv,
};
.name = "uint",
.parse = ec_node_int_uint_parse,
.complete = ec_node_default_complete,
- .get_max_parse_len = ec_node_int_uint_get_max_parse_len,
.size = sizeof(struct ec_node_int_uint),
};
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;
-
- 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,
};
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,
};
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,