mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 11:11:36 +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
|
enum cmd_token_type type; // token type
|
||||||
u_char attr; // token attributes
|
u_char attr; // token attributes
|
||||||
|
bool allowrepeat; // matcher allowed to match token repetively?
|
||||||
|
|
||||||
char *text; // token text
|
char *text; // token text
|
||||||
char *desc; // token description
|
char *desc; // token description
|
||||||
long long min, max; // for ranges
|
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));
|
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
|
/* check history/stack of tokens
|
||||||
* this disallows matching the same one more than once if there is a
|
* this disallows matching the same one more than once if there is a
|
||||||
* circle in the graph (used for keyword arguments) */
|
* circle in the graph (used for keyword arguments) */
|
||||||
if (n == MAXDEPTH)
|
if (n == MAXDEPTH)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!start->allowrepeat)
|
if (!token->allowrepeat)
|
||||||
for (size_t s = 0; s < n; s++)
|
for (size_t s = 0; s < n; s++)
|
||||||
if (stack[s] == start)
|
if (stack[s] == start)
|
||||||
return NULL;
|
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
|
// get the current operating input token
|
||||||
char *input_token = vector_slot (vline, n);
|
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);
|
child = vector_slot (node->to, i);
|
||||||
size_t j;
|
size_t j;
|
||||||
if (!child->allowrepeat)
|
struct cmd_token *token = child->data;
|
||||||
|
if (!token->allowrepeat)
|
||||||
{
|
{
|
||||||
for (j = 0; j < stackpos; j++)
|
for (j = 0; j < stackpos; j++)
|
||||||
if (child == stack[j])
|
if (child == stack[j])
|
||||||
@ -489,7 +490,6 @@ add_nexthops (struct list *list, struct graph_node *node,
|
|||||||
if (j != stackpos)
|
if (j != stackpos)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
struct cmd_token *token = child->data;
|
|
||||||
switch (token->type)
|
switch (token->type)
|
||||||
{
|
{
|
||||||
case OPTION_TKN:
|
case OPTION_TKN:
|
||||||
|
@ -183,7 +183,7 @@ start:
|
|||||||
if ((ctx->currnode = add_edge_dedup (ctx->currnode, $3)) != $3)
|
if ((ctx->currnode = add_edge_dedup (ctx->currnode, $3)) != $3)
|
||||||
graph_delete_node (ctx->graph, $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
|
// adding a node as a child of itself accepts any number
|
||||||
// of the same token, which is what we want for variadics
|
// 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 from; // nodes which have edges to this node
|
||||||
vector to; // nodes which this node has edges to
|
vector to; // nodes which this node has edges to
|
||||||
bool allowrepeat;
|
|
||||||
|
|
||||||
void *data; // node data
|
void *data; // node data
|
||||||
void (*del) (void *data); // deletion callback
|
void (*del) (void *data); // deletion callback
|
||||||
|
Loading…
Reference in New Issue
Block a user