VPP-26 Iterate through empty command line in cli history

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>
This commit is contained in:
Chris Luke
2016-04-29 08:53:46 -04:00
committed by Dave Barach
parent 7ef6d5bb68
commit 6de2ff28fe
+24 -10
View 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;