[PATCH 1/2] cli: allow verbatim character entry with CTRL-v

Heinrich Schuchardt xypron.glpk at gmx.de
Sun Jan 12 17:33:38 CET 2020


Up to now the U-Boot console does not allow to add a control character to
the line buffer. In Bash and Vim we can use CTRL-v for this purpose.

Add support for CTRL-v for verbatim entry of characters.

To keep things simple, while editing control characters are displayed as
simple characters, e.g. ESC (0x1b) is displayed as [ and not as ^[.

Signed-off-by: Heinrich Schuchardt <xypron.glpk at gmx.de>
---
 common/cli_readline.c | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/common/cli_readline.c b/common/cli_readline.c
index 6ef7a3e564..402f15a361 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -58,8 +58,6 @@ static char *delete_char (char *buffer, char *p, int *colp, int *np, int plen)
  * Author: Janghoon Lyu <nandy at mizi.com>
  */

-#define putnstr(str, n)	printf("%.*s", (int)n, str)
-
 #define CTL_CH(c)		((c) - 'a' + 1)
 #define CTL_BACKSPACE		('\b')
 #define DEL			((char)255)
@@ -83,6 +81,34 @@ 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)

+/**
+ * putchar() - output single character
+ *
+ * Outputs single character. Control characters are converted,
+ * e.g. CTR-c is displayed as C.
+ */
+static void putchar(char c)
+{
+	if (c < ' ')
+		c += '@';
+	putc(c);
+}
+
+/**
+ * putnstr() - output string buffer
+ *
+ * Outputs n characters for buffer str. Control characters are converted, e.g.
+ * CTRL-c is displayed as C.
+ *
+ * @str:	string buffer
+ * @n:		number of characters to print
+ */
+static void putnstr(const char *str, size_t n)
+{
+	for (; n; --n)
+		putchar(*str++);
+}
+
 static void hist_init(void)
 {
 	int i;
@@ -385,7 +411,7 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
 			return -1;
 		case CTL_CH('f'):
 			if (num < eol_num) {
-				getcmd_putch(buf[num]);
+				putchar(buf[num]);
 				num++;
 			}
 			break;
@@ -419,6 +445,12 @@ static int cread_line(const char *const prompt, char *buf, unsigned int *len,
 		case CTL_CH('o'):
 			insert = !insert;
 			break;
+		case CTL_CH('v'):
+			/* Add next character verbatim */
+			ichar = getcmd_getch();
+			cread_add_char(ichar, insert, &num, &eol_num, buf,
+				       *len);
+			break;
 		case CTL_CH('x'):
 		case CTL_CH('u'):
 			BEGINNING_OF_LINE();
--
2.24.1



More information about the U-Boot mailing list