diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2016-08-01 17:03:39 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2016-08-01 17:03:39 +0000 |
| commit | 1a8c390d4abc7c3f599813ddee6ca3990de7576c (patch) | |
| tree | e7a7978f6423049e91b5de4183804d13a2b78f38 /lib | |
| parent | 6d53a10e4cf873ff61a3dada644d15be83dd54c0 (diff) | |
lib: Fixed bad node copy, modified token regex
When building argv for matched command, only the
last node was being copied to argv; the rest were
added by reference. Additionally the regex for
certain tokens was too restrictive and disallowed
characters allowed by the old parser; these have
been reinstated.
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/command_graph.c | 21 | ||||
| -rw-r--r-- | lib/command_graph.h | 12 | ||||
| -rw-r--r-- | lib/command_lex.l | 4 | ||||
| -rw-r--r-- | lib/command_match.c | 42 | ||||
| -rw-r--r-- | lib/command_parse.y | 5 |
5 files changed, 37 insertions, 47 deletions
diff --git a/lib/command_graph.c b/lib/command_graph.c index 3e52f42598..e8f72db19e 100644 --- a/lib/command_graph.c +++ b/lib/command_graph.c @@ -88,29 +88,12 @@ new_node(enum graph_node_type type) return node; } -struct graph_node * -copy_node (struct graph_node *node) -{ - struct graph_node *new = new_node(node->type); - new->children = NULL; - new->is_start = node->is_start; - new->end = node->end; - new->text = node->text ? XSTRDUP(MTYPE_CMD_TOKENS, node->text) : NULL; - new->value = node->value; - new->min = node->min; - new->max = node->max; - new->element = node->element ? copy_cmd_element(node->element) : NULL; - new->arg = node->arg ? XSTRDUP(MTYPE_CMD_TOKENS, node->arg) : NULL; - new->refs = 0; - return new; -} - void free_node (struct graph_node *node) { if (!node) return; - vector_free (node->children); - free_cmd_element (node->element); + if (node->children) vector_free (node->children); + if (node->element) free_cmd_element (node->element); free (node->text); free (node->arg); free (node); diff --git a/lib/command_graph.h b/lib/command_graph.h index dc78475ca6..ed0e98a6e5 100644 --- a/lib/command_graph.h +++ b/lib/command_graph.h @@ -78,18 +78,6 @@ struct graph_node * new_node(enum graph_node_type); /** - * Copies a node. - * The children vector is copied, but the pointers the vector - * holds point to the same data as the original vector. - * The element, if it exists, is copied. - * - * @param[in] pointer to node to copy - * @return pointer to copied node - */ -struct graph_node * -copy_node(struct graph_node *); - -/** * Frees the data associated with a graph_node. * @param[out] pointer to graph_node to free */ diff --git a/lib/command_lex.l b/lib/command_lex.l index ce09c5bf28..9f47d96a84 100644 --- a/lib/command_lex.l +++ b/lib/command_lex.l @@ -4,12 +4,12 @@ extern void set_buffer_string(const char *); %} -WORD [a-z][-_a-z0-9]+ +WORD [-+a-z\*][-+_a-zA-Z0-9\*]* IPV4 A\.B\.C\.D IPV4_PREFIX A\.B\.C\.D\/M IPV6 X:X::X:X IPV6_PREFIX X:X::X:X\/M -VARIABLE [A-Z][A-Z_:]+ +VARIABLE [A-Z][-_a-zA-Z:0-9]+ NUMBER [0-9]{1,20} RANGE \({NUMBER}\-{NUMBER}\) diff --git a/lib/command_match.c b/lib/command_match.c index 7b9c5f15d8..f7854cbe6d 100644 --- a/lib/command_match.c +++ b/lib/command_match.c @@ -46,6 +46,24 @@ match_token (struct graph_node *, char *, enum filter_type); /* matching functions */ +static struct graph_node * +copy_node (struct graph_node *node) +{ + struct graph_node *new = new_node(node->type); + new->children = NULL; + new->is_start = node->is_start; + new->end = NULL; + new->text = node->text ? XSTRDUP(MTYPE_CMD_TOKENS, node->text) : NULL; + new->value = node->value; + new->min = node->min; + new->max = node->max; + new->element = node->element ? copy_cmd_element(node->element) : NULL; + new->arg = node->arg ? XSTRDUP(MTYPE_CMD_TOKENS, node->arg) : NULL; + new->refs = 0; + return new; +} + + /* Linked list data deletion callback */ static void free_nodelist (void *node) { @@ -68,8 +86,8 @@ match_command (struct graph_node *start, const char *line, struct list **argv) if (*argv) break; } + // walk the list, find the END_GN, return that if (*argv) { - // copy the nodes we need struct listnode *ln; struct graph_node *gn; char buf[50]; @@ -147,9 +165,6 @@ match_command_r (struct graph_node *start, vector vline, unsigned int n) if (match_token(start, vector_slot(vline, n), FILTER_RELAXED) < minmatch) return NULL; - // arg list for this subgraph - struct list *argv; - // pointers for iterating linklist struct graph_node *gn; struct listnode *ln; @@ -165,11 +180,11 @@ match_command_r (struct graph_node *start, vector vline, unsigned int n) struct graph_node *curr = copy_node(start); curr->arg = XSTRDUP(MTYPE_CMD_TOKENS, vector_slot(vline, n)); // initialize a new argument list - argv = list_new(); + struct list *argv = list_new(); argv->del = &free_nodelist; - // push the currnode - listnode_add(argv, curr); - // push the endnode + // add the current node + listnode_add(argv, copy_node(curr)); + // push the end node listnode_add(argv, copy_node(gn)); // clean up list_delete (next); @@ -215,13 +230,12 @@ match_command_r (struct graph_node *start, vector vline, unsigned int n) } if (bestmatch) { - argv = list_new(); - listnode_add(argv, start); - list_add_list(argv, bestmatch); - list_free (bestmatch); + struct graph_node *curr = copy_node(start); + curr->arg = XSTRDUP(MTYPE_CMD_TOKENS, vector_slot(vline, n)); + list_add_node_prev (bestmatch, bestmatch->head, curr); + // cleanup list_delete (next); - start->arg = XSTRDUP(MTYPE_CMD_TOKENS, vector_slot(vline, n)); - return argv; + return bestmatch; } else return NULL; diff --git a/lib/command_parse.y b/lib/command_parse.y index cf87ca1042..01fc01d302 100644 --- a/lib/command_parse.y +++ b/lib/command_parse.y @@ -310,6 +310,11 @@ option_token: void yyerror(char const *message) { // fail on bad parse fprintf(stderr, "Grammar error: %s\n", message); + fprintf(stderr, "Token on error: "); + if (yylval.string) fprintf(stderr, "%s\n", yylval.string); + else if (yylval.node) fprintf(stderr, "%s\n", yylval.node->text); + else fprintf(stderr, "%d\n", yylval.integer); + } struct graph_node * |
