[U-Boot] [PATCH 04/14] Fix function readline in main.c

Marek Vasut
2012-01-25T18:05:31Z

> * Ignore ANSI escape codes for moving cursor, which are generated by
> keyboard

I think WD should comment on this one.

>
> Signed-off-by: Pali Roh?r <pali.rohar@gmail.com>
> ---
> Changes since original version:
> - Fixed commit message
>
> common/main.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 51 insertions(+), 0 deletions(-)
>
> diff --git a/common/main.c b/common/main.c
> index e96c95a..e7b5516 100644
> --- a/common/main.c
> +++ b/common/main.c
> @@ -958,6 +958,7 @@ int readline_into_buffer (const char *const prompt,
> char * buffer) int n = 0; /* buffer index
*/
> int plen = 0; /* prompt length */
> int col; /* output column cnt */
> + int esc = 0; /* ansi escape char */
> char c;
>
> /* print prompt */
> @@ -1024,7 +1025,57 @@ int readline_into_buffer (const char *const prompt,
> char * buffer) p=delete_char(p_buf, p, &col, &n, plen);
> continue;
>
> + case '\e': /* ANSI escape char */
> + esc = 1;
> + continue;
> +
> default:
> +
> + /*
> + * Check for ANSI escape chars
> + */
> + if (esc == 0 && c == '\e') {
> + esc = 1;
> + continue;
> + } else if (esc == 1) {
> + if (c == '[') {
> + esc = 2;
> + continue;
> + }
> + if (n < CONFIG_SYS_CBSIZE-2) {
> + ++n;
> + *p++ = '\e';
> + putc('\e');
> + }
> + esc = 0;
> + } else if (esc == 2 || esc == 3) {
> + if (esc == 2 && c == '1') {
> + esc = 3;
> + continue;
> + }
> + /* Ignore ANSI escape sequences */
> + /* generated by keyboard */
> + /* \e [ 1 A-D and \e [ A-D */
> + if (c >= 'A' && c <= 'D') {
> + esc = 0;
> + continue;
> + }
> + if (esc == 2 && n < CONFIG_SYS_CBSIZE-3) {
> + n += 2;
> + *p++ = '\e';
> + *p++ = '[';
> + puts("\e[");
> + } else if (esc == 3 &&
> + n < CONFIG_SYS_CBSIZE-4) {
> + n += 3;
> + *p++ = '\e';
> + *p++ = '[';
> + *p++ = '1';
> + puts("\e[1");
> + }
> + esc = 0;
> + }
> +
> /*
> * Must be a normal character then
> */