VPP-26 Iterate through empty command line in cli history 35/935/2
authorChris Luke <chrisy@flirble.org>
Fri, 29 Apr 2016 12:53:46 +0000 (08:53 -0400)
committerDave Barach <openvpp@barachs.net>
Fri, 29 Apr 2016 22:37:08 +0000 (22:37 +0000)
When cursoring through the command history in the CLI, when you reach
the end of the history (ie, back at "where you started") most CLI's
typically show a blank line. This is a visual cue that you are back
where you started.

Change-Id: I5733dbd0dcdc6deac6a0a856cfadbdb987456ec0
Signed-off-by: Chris Luke <chrisy@flirble.org>
vlib/vlib/unix/cli.c

index 7fb2056..0aa7f23 100644 (file)
@@ -1048,18 +1048,32 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm,
 
           cf->excursion += delta;
 
-          if (cf->excursion > (i32) vec_len (cf->command_history) -1)
-            cf->excursion = 0;
+          if (cf->excursion == vec_len (cf->command_history))
+            {
+              /* down-arrowed to last entry - want a blank line */
+              _vec_len (cf->current_command) = 0;
+            }
           else if (cf->excursion < 0)
-            cf->excursion = vec_len (cf->command_history) -1;
+            {
+              /* up-arrowed over the start to the end, want a blank line */
+              cf->excursion = vec_len (cf->command_history);
+              _vec_len (cf->current_command) = 0;
+            }
+          else
+            {
+              if (cf->excursion > (i32) vec_len (cf->command_history) -1)
+                /* down-arrowed past end - wrap to start */
+                cf->excursion = 0;
 
-          prev = cf->command_history [cf->excursion];
-          vec_validate (cf->current_command, vec_len(prev)-1);
+              /* Print the command at the current position */
+              prev = cf->command_history [cf->excursion];
+              vec_validate (cf->current_command, vec_len(prev)-1);
 
-          clib_memcpy (cf->current_command, prev, vec_len(prev));
-          _vec_len (cf->current_command) = vec_len(prev);
-          unix_vlib_cli_output_cooked (cf, uf, cf->current_command,
-                                       vec_len (cf->current_command));
+              clib_memcpy (cf->current_command, prev, vec_len(prev));
+              _vec_len (cf->current_command) = vec_len(prev);
+              unix_vlib_cli_output_cooked (cf, uf, cf->current_command,
+                                           vec_len (cf->current_command));
+            }
           cf->cursor = vec_len(cf->current_command);
 
           break;
@@ -1422,10 +1436,10 @@ static int unix_cli_line_process_one(unix_cli_main_t * cm,
             }
           else
             vec_reset_length (cf->current_command);
+          cf->excursion = vec_len (cf->command_history);
         }
       else /* history disabled */
         vec_reset_length (cf->current_command);
-      cf->excursion = 0;
       cf->search_mode = 0;
       vec_reset_length (cf->search_key);
       cf->cursor = 0;