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

Signed-off-by: Pali Rohár <pali.ro...@gmail.com>
---
 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

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to