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

Pali Rohár
2012-01-24T14:28:01Z

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

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
*/
--
1.7.5.4