]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
cli: Implement delete-word in cread_line()
authorSimon Glass <sjg@chromium.org>
Mon, 2 Oct 2023 01:13:09 +0000 (19:13 -0600)
committerTom Rini <trini@konsulko.com>
Wed, 11 Oct 2023 19:43:54 +0000 (15:43 -0400)
The Ctrl-W option is implemented in the cread_line_simple() but not in
the full version. This seems odd, so add an implementation.

Signed-off-by: Simon Glass <sjg@chromium.org>
common/cli_readline.c

index 458e927e4922c5c09d8f63ea23f1a99c5b753052..687e239bfa77ec856e200fed5214e198c86f3508 100644 (file)
@@ -89,6 +89,14 @@ static char hist_lines[HIST_MAX][HIST_SIZE + 1];     /* Save room for NULL */
 
 #define add_idx_minus_one() ((hist_add_idx == 0) ? hist_max : hist_add_idx-1)
 
+static void getcmd_putchars(int count, int ch)
+{
+       int i;
+
+       for (i = 0; i < count; i++)
+               getcmd_putch(ch);
+}
+
 static void hist_init(void)
 {
        int i;
@@ -337,6 +345,29 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
                case CTL_CH('o'):
                        insert = !insert;
                        break;
+               case CTL_CH('w'):
+                       if (num) {
+                               uint base;
+
+                               for (base = num - 1;
+                                    base >= 0 && buf[base] == ' ';)
+                                       base--;
+                               for (; base > 0 && buf[base - 1] != ' ';)
+                                       base--;
+
+                               /* now delete chars from base to num */
+                               wlen = num - base;
+                               eol_num -= wlen;
+                               memmove(&buf[base], &buf[num],
+                                       eol_num - base + 1);
+                               num = base;
+                               getcmd_putchars(wlen, CTL_BACKSPACE);
+                               puts(buf + base);
+                               getcmd_putchars(wlen, ' ');
+                               getcmd_putchars(wlen + eol_num - num,
+                                               CTL_BACKSPACE);
+                       }
+                       break;
                case CTL_CH('x'):
                case CTL_CH('u'):
                        BEGINNING_OF_LINE();