From 4d94b2929671e9251e95e6d2f88da8797a1d6e1e Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Fri, 16 Dec 2016 17:19:37 +0100 Subject: [PATCH] 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 --- lib/command.h | 2 ++ lib/command_match.c | 14 +++++++------- lib/command_parse.y | 2 +- lib/graph.h | 1 - 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/command.h b/lib/command.h index ba6fd9b7b0..1e1698fc7d 100644 --- a/lib/command.h +++ b/lib/command.h @@ -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 diff --git a/lib/command_match.c b/lib/command_match.c index b6897109af..62905a4f7f 100644 --- a/lib/command_match.c +++ b/lib/command_match.c @@ -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: diff --git a/lib/command_parse.y b/lib/command_parse.y index 81aa8a04e7..43062eb5da 100644 --- a/lib/command_parse.y +++ b/lib/command_parse.y @@ -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 diff --git a/lib/graph.h b/lib/graph.h index ee8e37c932..8d8aa3823b 100644 --- a/lib/graph.h +++ b/lib/graph.h @@ -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 -- 2.39.5