[PATCH 05/36] cli: Implement delete-word in cread_line()

Simon Glass sjg at chromium.org
Tue Sep 19 20:08:35 CEST 2023


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 at chromium.org>
---

 common/cli_readline.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/common/cli_readline.c b/common/cli_readline.c
index 458e927e492..687e239bfa7 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -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();
-- 
2.42.0.459.ge4e396fd5e-goog



More information about the U-Boot mailing list