[U-Boot] [PATCH 05/16] common/main.c: Fix function readline
Pali Rohár
pali.rohar at gmail.com
Sat Dec 17 18:03:07 CET 2011
* Ignore ANSI escape sequences for moving cursor, which are generated by keyboard
Signed-off-by: Pali Rohár <pali.rohar at gmail.com>
---
common/main.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 49 insertions(+), 0 deletions(-)
diff --git a/common/main.c b/common/main.c
index e96c95a..5531130 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,55 @@ 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
More information about the U-Boot
mailing list