]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: explicitly support the case of empty input for completions
authorQuentin Young <qlyoung@cumulusnetworks.com>
Sun, 2 Oct 2016 04:47:31 +0000 (04:47 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Sun, 2 Oct 2016 04:47:31 +0000 (04:47 +0000)
When the user tab- or ?-completes when the character prior to
the position of the cursor is a space, completion logic is
passed null. Explicitly handle this case instead of using
partly_match, which has special logic associated with it to
allow abbreviating certain tokens.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/command_match.c
lib/command_match.h

index aa961d35145131b9f94179119ffd914748f707c3..85d627e1bef7c47ce0876e3e88c03df2db563947 100644 (file)
@@ -303,6 +303,7 @@ command_complete (struct graph *graph,
           struct cmd_token *token = gn->data;
           switch (match_token (token, input_token))
             {
+              case trivial_match:
               case partly_match:
                 if (idx == vector_active (vline) - 1)
                   {
@@ -526,6 +527,10 @@ del_arglist (struct list *list)
 static enum match_type
 match_token (struct cmd_token *token, char *input_token)
 {
+  // nothing trivially matches everything
+  if (!input_token)
+    return trivial_match;
+
   switch (token->type) {
     case WORD_TKN:
       return match_word (token, input_token);
@@ -557,9 +562,6 @@ match_ipv4 (const char *str)
   int dots = 0, nums = 0;
   char buf[4];
 
-  if (str == NULL)
-    return partly_match;
-
   for (;;)
     {
       memset (buf, 0, sizeof (buf));
@@ -614,9 +616,6 @@ match_ipv4_prefix (const char *str)
   int dots = 0;
   char buf[4];
 
-  if (str == NULL)
-    return partly_match;
-
   for (;;)
     {
       memset (buf, 0, sizeof (buf));
@@ -696,9 +695,6 @@ match_ipv6 (const char *str)
   struct sockaddr_in6 sin6_dummy;
   int ret;
 
-  if (str == NULL)
-    return partly_match;
-
   if (strspn (str, IPV6_ADDR_STR) != strlen (str))
     return no_match;
 
@@ -718,9 +714,6 @@ match_ipv6_prefix (const char *str)
   char *tofree, *dupe, *prefix, *mask, *endptr;
   int nmask = -1;
 
-  if (str == NULL)
-    return partly_match;
-
   if (strspn (str, IPV6_PREFIX_STR) != strlen (str))
     return no_match;
 
@@ -763,9 +756,6 @@ match_range (struct cmd_token *token, const char *str)
   char *endptr = NULL;
   long long val;
 
-  if (str == NULL)
-    return 1;
-
   val = strtoll (str, &endptr, 10);
   if (*endptr != '\0')
     return 0;
@@ -781,8 +771,8 @@ match_word (struct cmd_token *token, const char *word)
 {
   assert (token->type == WORD_TKN);
 
-  // if the passed token is null or 0 length, partly match
-  if (!word || !strlen(word))
+  // if the passed token is 0 length, partly match
+  if (!strlen(word))
     return partly_match;
 
   // if the passed token is strictly a prefix of the full word, partly match
index 728d9c1d95c32c32f22cc97ed7f5dc4795ee5545..ac4e70c3163a9edf26b5b09e0d96f3643aad5ca0 100644 (file)
@@ -50,9 +50,10 @@ enum matcher_rv
 /* completion match types */
 enum match_type
 {
-  no_match,
-  partly_match,
-  exact_match
+  trivial_match,  // the input is null
+  no_match,       // the input does not match
+  partly_match,   // the input matches but is incomplete
+  exact_match     // the input matches and is complete
 };
 
 /* Defines which matcher_rv values constitute an error. Should be used with