lib: Fix broken disambiguation on leader tokens

Fix incorrect assumption that the set of first tokens
of all commands are perfectly unambiguous

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
Quentin Young 2016-08-10 15:04:21 +00:00
parent b84f1d850a
commit eaf46b79b6

View File

@ -91,17 +91,18 @@ match_command (struct graph_node *start,
{ {
matcher_rv = MATCHER_NO_MATCH; matcher_rv = MATCHER_NO_MATCH;
// call recursive matcher on each starting child // prepend a dummy token to match that pesky start node
for (unsigned int i = 0; i < vector_active (start->children); i++) vector vvline = vector_init (vline->alloced + 1);
vector_set_index (vvline, 0, (void *) "dummy");
memcpy (vvline->index + 1, vline->index, sizeof (void *) * vline->alloced);
vvline->active = vline->active + 1;
if ((*argv = match_command_r (start, vvline, 0))) // successful match
{ {
*argv = match_command_r (vector_slot (start->children, i), vline, 0); list_delete_node (*argv, listhead (*argv));
if (*argv) // successful match struct graph_node *end = listgetdata (listtail (*argv));
{ *el = end->element;
struct graph_node *end = listgetdata (listtail (*argv)); assert (*el);
*el = end->element;
assert (*el);
break;
}
} }
return matcher_rv; return matcher_rv;
@ -344,6 +345,9 @@ min_match_level (enum node_type type)
{ {
switch (type) switch (type)
{ {
// anything matches a start node, for the sake of recursion
case START_GN:
return no_match;
// allowing words to partly match enables command abbreviation // allowing words to partly match enables command abbreviation
case WORD_GN: case WORD_GN:
return partly_match; return partly_match;