mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 21:39:38 +00:00
lib: parser: move allowrepeat to cmd_token
struct graph_node isn't quite the right place to control matcher behaviour. Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
0e64d123fd
commit
4d94b29296
@ -196,6 +196,8 @@ struct cmd_token
|
||||
{
|
||||
enum cmd_token_type type; // token type
|
||||
u_char attr; // token attributes
|
||||
bool allowrepeat; // matcher allowed to match token repetively?
|
||||
|
||||
char *text; // token text
|
||||
char *desc; // token description
|
||||
long long min, max; // for ranges
|
||||
|
@ -202,20 +202,20 @@ command_match_r (struct graph_node *start, vector vline, unsigned int n,
|
||||
{
|
||||
assert (n < vector_active (vline));
|
||||
|
||||
// get the minimum match level that can count as a full match
|
||||
struct cmd_token *token = start->data;
|
||||
enum match_type minmatch = min_match_level (token->type);
|
||||
|
||||
/* check history/stack of tokens
|
||||
* this disallows matching the same one more than once if there is a
|
||||
* circle in the graph (used for keyword arguments) */
|
||||
if (n == MAXDEPTH)
|
||||
return NULL;
|
||||
if (!start->allowrepeat)
|
||||
if (!token->allowrepeat)
|
||||
for (size_t s = 0; s < n; s++)
|
||||
if (stack[s] == start)
|
||||
return NULL;
|
||||
|
||||
// get the minimum match level that can count as a full match
|
||||
struct cmd_token *token = start->data;
|
||||
enum match_type minmatch = min_match_level (token->type);
|
||||
|
||||
// get the current operating input token
|
||||
char *input_token = vector_slot (vline, n);
|
||||
|
||||
@ -481,7 +481,8 @@ add_nexthops (struct list *list, struct graph_node *node,
|
||||
{
|
||||
child = vector_slot (node->to, i);
|
||||
size_t j;
|
||||
if (!child->allowrepeat)
|
||||
struct cmd_token *token = child->data;
|
||||
if (!token->allowrepeat)
|
||||
{
|
||||
for (j = 0; j < stackpos; j++)
|
||||
if (child == stack[j])
|
||||
@ -489,7 +490,6 @@ add_nexthops (struct list *list, struct graph_node *node,
|
||||
if (j != stackpos)
|
||||
continue;
|
||||
}
|
||||
struct cmd_token *token = child->data;
|
||||
switch (token->type)
|
||||
{
|
||||
case OPTION_TKN:
|
||||
|
@ -183,7 +183,7 @@ start:
|
||||
if ((ctx->currnode = add_edge_dedup (ctx->currnode, $3)) != $3)
|
||||
graph_delete_node (ctx->graph, $3);
|
||||
|
||||
ctx->currnode->allowrepeat = 1;
|
||||
((struct cmd_token *)ctx->currnode->data)->allowrepeat = 1;
|
||||
|
||||
// adding a node as a child of itself accepts any number
|
||||
// of the same token, which is what we want for variadics
|
||||
|
@ -36,7 +36,6 @@ struct graph_node
|
||||
{
|
||||
vector from; // nodes which have edges to this node
|
||||
vector to; // nodes which this node has edges to
|
||||
bool allowrepeat;
|
||||
|
||||
void *data; // node data
|
||||
void (*del) (void *data); // deletion callback
|
||||
|
Loading…
Reference in New Issue
Block a user