[Concept,04/36] cli: Split initial-text output from cli_cread_init()

Message ID 20260120231814.2033069-5-sjg@u-boot.org
State New
Headers
Series video: Add multiple-context support to vidconsole (part F) |

Commit Message

Simon Glass Jan. 20, 2026, 11:17 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Move the initial-text output from cli_cread_init() into a new function
cli_cread_add_initial(). This allows callers to set up additional state
(like the putch callback) before the initial text is output.

Update cread_line() and scene_txtin_open() to call the new function.

Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com>
Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 boot/scene_txtin.c    |  1 +
 common/cli_readline.c | 12 ++++++++----
 include/cli.h         | 10 ++++++++++
 3 files changed, 19 insertions(+), 4 deletions(-)
  

Patch

diff --git a/boot/scene_txtin.c b/boot/scene_txtin.c
index 4f9230f931d..b5413dc145f 100644
--- a/boot/scene_txtin.c
+++ b/boot/scene_txtin.c
@@ -131,6 +131,7 @@  int scene_txtin_open(struct scene *scn, struct scene_obj *obj,
 	cli_cread_init(&scn->cls, abuf_data(&tin->buf), tin->line_chars);
 	scn->cls.insert = true;
 	scn->cls.putch = scene_txtin_putch;
+	cli_cread_add_initial(&scn->cls);
 	ret = vidconsole_entry_save(cons, &scn->entry_save);
 	if (ret)
 		return log_msg_ret("sav", ret);
diff --git a/common/cli_readline.c b/common/cli_readline.c
index 4eb34d7cf7c..0173072109b 100644
--- a/common/cli_readline.c
+++ b/common/cli_readline.c
@@ -470,16 +470,19 @@  int cread_line_process_ch(struct cli_line_state *cls, char ichar)
 
 void cli_cread_init(struct cli_line_state *cls, char *buf, uint buf_size)
 {
-	int init_len = strlen(buf);
-
 	memset(cls, '\0', sizeof(struct cli_line_state));
 	cls->insert = true;
 	cls->buf = buf;
 	cls->len = buf_size;
+}
+
+void cli_cread_add_initial(struct cli_line_state *cls)
+{
+	int init_len = strlen(cls->buf);
 
 	if (init_len)
-		cread_add_str(cls, buf, init_len, 0, &cls->num, &cls->eol_num,
-			      buf, buf_size);
+		cread_add_str(cls, cls->buf, init_len, 0, &cls->num,
+			      &cls->eol_num, cls->buf, cls->len);
 }
 
 static int cread_line(const char *const prompt, char *buf, unsigned int *len,
@@ -492,6 +495,7 @@  static int cread_line(const char *const prompt, char *buf, unsigned int *len,
 
 	cli_ch_init(cch);
 	cli_cread_init(cls, buf, *len);
+	cli_cread_add_initial(cls);
 	cls->prompt = prompt;
 	cls->history = true;
 	cls->cmd_complete = true;
diff --git a/include/cli.h b/include/cli.h
index 88f96c03cb3..ec0f5d31046 100644
--- a/include/cli.h
+++ b/include/cli.h
@@ -279,6 +279,16 @@  int cread_line_process_ch(struct cli_line_state *cls, char ichar);
  */
 void cli_cread_init(struct cli_line_state *cls, char *buf, uint buf_size);
 
+/**
+ * cli_cread_add_initial() - Output initial buffer contents
+ *
+ * Called after cli_cread_init() to output the initial text in the buffer and
+ * set up the line state accordingly
+ *
+ * @cls: CLI line state
+ */
+void cli_cread_add_initial(struct cli_line_state *cls);
+
 /** cread_print_hist_list() - Print the command-line history list */
 void cread_print_hist_list(void);