Module Name:    src
Committed By:   christos
Date:           Tue Jan 11 18:30:15 UTC 2022

Modified Files:
        src/lib/libedit: chared.c eln.c histedit.h readline.c
        src/lib/libedit/readline: readline.h

Log Message:
PR/56618: Walter Lozano: Improve libedit compatibility with readline by
implementing:

    rl_copy_text, rl_erase_empty_line, rl_message, rl_on_new_line,
    rl_replace_line, rl_restore_prompt, rl_save_prompt


To generate a diff of this commit:
cvs rdiff -u -r1.59 -r1.60 src/lib/libedit/chared.c
cvs rdiff -u -r1.36 -r1.37 src/lib/libedit/eln.c
cvs rdiff -u -r1.58 -r1.59 src/lib/libedit/histedit.h
cvs rdiff -u -r1.168 -r1.169 src/lib/libedit/readline.c
cvs rdiff -u -r1.47 -r1.48 src/lib/libedit/readline/readline.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libedit/chared.c
diff -u src/lib/libedit/chared.c:1.59 src/lib/libedit/chared.c:1.60
--- src/lib/libedit/chared.c:1.59	Tue Jul 23 06:18:52 2019
+++ src/lib/libedit/chared.c	Tue Jan 11 13:30:15 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: chared.c,v 1.59 2019/07/23 10:18:52 christos Exp $	*/
+/*	$NetBSD: chared.c,v 1.60 2022/01/11 18:30:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
 #if 0
 static char sccsid[] = "@(#)chared.c	8.1 (Berkeley) 6/4/93";
 #else
-__RCSID("$NetBSD: chared.c,v 1.59 2019/07/23 10:18:52 christos Exp $");
+__RCSID("$NetBSD: chared.c,v 1.60 2022/01/11 18:30:15 christos Exp $");
 #endif
 #endif /* not lint && not SCCSID */
 
@@ -624,6 +624,35 @@ el_deletestr(EditLine *el, int n)
 		el->el_line.cursor = el->el_line.buffer;
 }
 
+/* el_wreplacestr():
+ *	Replace the contents of the line with the provided string
+ */
+int
+el_wreplacestr(EditLine *el, const wchar_t *s)
+{
+	size_t len;
+	wchar_t * p;
+
+	if (s == NULL || (len = wcslen(s)) == 0)
+		return -1;
+
+	if (el->el_line.buffer + len >= el->el_line.limit) {
+		if (!ch_enlargebufs(el, len))
+			return -1;
+	}
+
+	p = el->el_line.buffer;
+	for (size_t i = 0; i < len; i++)
+		*p++ = *s++;
+
+	el->el_line.buffer[len] = '\0';
+	el->el_line.lastchar = el->el_line.buffer + len;
+	if (el->el_line.cursor > el->el_line.lastchar)
+		el->el_line.cursor = el->el_line.lastchar;
+
+	return 0;
+}
+
 /* el_cursor():
  *	Move the cursor to the left or the right of the current position
  */

Index: src/lib/libedit/eln.c
diff -u src/lib/libedit/eln.c:1.36 src/lib/libedit/eln.c:1.37
--- src/lib/libedit/eln.c:1.36	Sun Aug 15 06:08:41 2021
+++ src/lib/libedit/eln.c	Tue Jan 11 13:30:15 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: eln.c,v 1.36 2021/08/15 10:08:41 christos Exp $	*/
+/*	$NetBSD: eln.c,v 1.37 2022/01/11 18:30:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: eln.c,v 1.36 2021/08/15 10:08:41 christos Exp $");
+__RCSID("$NetBSD: eln.c,v 1.37 2022/01/11 18:30:15 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <errno.h>
@@ -386,3 +386,9 @@ el_insertstr(EditLine *el, const char *s
 {
 	return el_winsertstr(el, ct_decode_string(str, &el->el_lgcyconv));
 }
+
+int
+el_replacestr(EditLine *el, const char *str)
+{
+	return el_wreplacestr(el, ct_decode_string(str, &el->el_lgcyconv));
+}

Index: src/lib/libedit/histedit.h
diff -u src/lib/libedit/histedit.h:1.58 src/lib/libedit/histedit.h:1.59
--- src/lib/libedit/histedit.h:1.58	Sun Aug 15 06:08:41 2021
+++ src/lib/libedit/histedit.h	Tue Jan 11 13:30:15 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: histedit.h,v 1.58 2021/08/15 10:08:41 christos Exp $	*/
+/*	$NetBSD: histedit.h,v 1.59 2022/01/11 18:30:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1992, 1993
@@ -179,6 +179,7 @@ void		 el_resize(EditLine *);
 const LineInfo	*el_line(EditLine *);
 int		 el_insertstr(EditLine *, const char *);
 void		 el_deletestr(EditLine *, int);
+int		 el_replacestr(EditLine *el, const char *str);
 
 
 /*
@@ -278,6 +279,7 @@ int		 el_cursor(EditLine *, int);
 const LineInfoW	*el_wline(EditLine *);
 int		 el_winsertstr(EditLine *, const wchar_t *);
 #define          el_wdeletestr  el_deletestr
+int		 el_wreplacestr(EditLine *, const wchar_t *);
 
 /*
  * ==== History ====

Index: src/lib/libedit/readline.c
diff -u src/lib/libedit/readline.c:1.168 src/lib/libedit/readline.c:1.169
--- src/lib/libedit/readline.c:1.168	Fri Sep 10 14:51:36 2021
+++ src/lib/libedit/readline.c	Tue Jan 11 13:30:15 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.c,v 1.168 2021/09/10 18:51:36 rillig Exp $	*/
+/*	$NetBSD: readline.c,v 1.169 2022/01/11 18:30:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include "config.h"
 #if !defined(lint) && !defined(SCCSID)
-__RCSID("$NetBSD: readline.c,v 1.168 2021/09/10 18:51:36 rillig Exp $");
+__RCSID("$NetBSD: readline.c,v 1.169 2022/01/11 18:30:15 christos Exp $");
 #endif /* not lint && not SCCSID */
 
 #include <sys/types.h>
@@ -43,6 +43,7 @@ __RCSID("$NetBSD: readline.c,v 1.168 202
 #include <limits.h>
 #include <pwd.h>
 #include <setjmp.h>
+#include <stdarg.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -136,11 +137,13 @@ int _rl_completion_prefix_display_length
 int _rl_echoing_p;
 int history_max_entries;
 char *rl_display_prompt;
+int rl_erase_empty_line;
 
 /*
  * The current prompt string.
  */
 char *rl_prompt = NULL;
+char *rl_prompt_saved = NULL;
 /*
  * This is set to character indicating type of completion being done by
  * rl_complete_internal(); this is available for application completion
@@ -278,6 +281,21 @@ rl_set_prompt(const char *prompt)
 	return 0;
 }
 
+void
+rl_save_prompt(void)
+{
+	rl_prompt_saved = strdup(rl_prompt);
+}
+
+void
+rl_restore_prompt(void)
+{
+	if (!rl_prompt_saved)
+		return;
+	rl_prompt = rl_prompt_saved;
+	rl_prompt_saved = NULL;
+}
+
 /*
  * initialize rl compat stuff
  */
@@ -2281,6 +2299,41 @@ _rl_update_pos(void)
 	rl_line_buffer[rl_end] = '\0';
 }
 
+char *
+rl_copy_text(int from, int to)
+{
+	const LineInfo *li = el_line(e);
+	size_t len;
+	char * out;
+
+	if (from > to)
+		return NULL;
+
+	if (li->buffer + from > li->lastchar)
+		from = (int)(li->lastchar - li->buffer);
+
+	if (li->buffer + to > li->lastchar)
+		to = (int)(li->lastchar - li->buffer);
+
+	len = (size_t)(to - from);
+	out = el_malloc((size_t)len + 1);
+	(void)strlcpy(out, li->buffer + from , len);
+
+	return out;
+}
+
+void
+rl_replace_line(const char * text, int clear_undo __attribute__((__unused__)))
+{
+	if (!text || *text == 0)
+		return;
+
+	if (h == NULL || e == NULL)
+		rl_initialize();
+
+	el_replacestr(e, text);
+}
+
 void
 rl_get_screen_size(int *rows, int *cols)
 {
@@ -2290,6 +2343,21 @@ rl_get_screen_size(int *rows, int *cols)
 		el_get(e, EL_GETTC, "co", cols);
 }
 
+#define MAX_MESSAGE 160
+void
+rl_message(const char *format, ...)
+{
+	char msg[MAX_MESSAGE];
+	va_list args;
+
+	va_start(args, format);
+	vsnprintf(msg, sizeof(msg), format, args);
+	va_end(args);
+
+	rl_set_prompt(msg);
+	rl_redisplay();
+}
+
 void
 rl_set_screen_size(int rows, int cols)
 {

Index: src/lib/libedit/readline/readline.h
diff -u src/lib/libedit/readline/readline.h:1.47 src/lib/libedit/readline/readline.h:1.48
--- src/lib/libedit/readline/readline.h:1.47	Sat Aug 21 08:34:59 2021
+++ src/lib/libedit/readline/readline.h	Tue Jan 11 13:30:15 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: readline.h,v 1.47 2021/08/21 12:34:59 christos Exp $	*/
+/*	$NetBSD: readline.h,v 1.48 2022/01/11 18:30:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -153,6 +153,7 @@ extern int		_rl_completion_prefix_displa
 extern int		_rl_echoing_p;
 extern int		history_max_entries;
 extern char		*rl_display_prompt;
+extern int		rl_erase_empty_line;
 
 /* supported functions */
 char		*readline(const char *);
@@ -180,7 +181,7 @@ int		 history_search_prefix(const char *
 int		 history_search_pos(const char *, int, int);
 int		 read_history(const char *);
 int		 write_history(const char *);
-int		 history_truncate_file (const char *, int);
+int		 history_truncate_file(const char *, int);
 int		 history_expand(char *, char **);
 char	       **history_tokenize(const char *);
 const char	*get_history_event(const char *, int *, int);
@@ -215,7 +216,7 @@ int		 rl_add_defun(const char *, rl_comm
 HISTORY_STATE	*history_get_history_state(void);
 void		 rl_get_screen_size(int *, int *);
 void		 rl_set_screen_size(int, int);
-char		*rl_filename_completion_function (const char *, int);
+char		*rl_filename_completion_function(const char *, int);
 int		 _rl_abort_internal(void);
 int		 _rl_qsort_string_compare(char **, char **);
 char	       **rl_completion_matches(const char *, rl_compentry_func_t *);
@@ -226,6 +227,11 @@ void		 rl_reset_after_signal(void);
 void		 rl_echo_signal_char(int);
 int		 rl_crlf(void);
 int		 rl_ding(void);
+char 		*rl_copy_text(int, int);
+void		 rl_replace_line(const char *, int);
+void 		 rl_message(const char *format, ...);
+void		 rl_save_prompt(void);
+void		 rl_restore_prompt(void);
 
 /*
  * The following are not implemented

Reply via email to