Module Name: src
Committed By: snj
Date: Sun Jul 23 14:41:26 UTC 2017
Modified Files:
src/lib/libedit [netbsd-8]: Makefile editline.3 editrc.5 el.c el.h
prompt.c read.c refresh.c refresh.h terminal.c
Added Files:
src/lib/libedit [netbsd-8]: literal.c literal.h
Log Message:
Pull up following revision(s) (requested by kre in ticket #102):
lib/libedit/Makefile: 1.64-1.65
lib/libedit/editline.3: 1.94-1.96
lib/libedit/editrc.5: 1.33
lib/libedit/el.c: 1.93-1.94
lib/libedit/el.h: 1.42
lib/libedit/literal.c: 1.1-1.3
lib/libedit/literal.h: 1.1-1.2
lib/libedit/prompt.c: 1.27
lib/libedit/read.c: 1.103
lib/libedit/refresh.c: 1.52-1.54
lib/libedit/refresh.h: 1.11
lib/libedit/terminal.c: 1.33
Make the default editrc file be $EDITRC (from env) if set, falling back
to $HOME/.editrc otherwise. Better support for this in sh coming.
--
Include EDITRC in doc.
--
mention the limitation of the literal sequence delimiter.
--
- handle literal escape sequence printing.
- factor out common code in allocation and freeing of the display.
--
- add literal sequence handling.
--
remove unused variable
--
add literal escape sequence support, patterned after the tcsh ones.
--
fix comment
--
Fix an obvious, but almost invisible typo (avoid some core dumps).
--
Allow wide characters (properly encoded as byte strings according to LC_CTYPE)
to be (perhaps part of) the "invisible" characters in a prompt, or the
required prompt character which follows the literal sequence (this character
must be one with a printing column width >= 1). The literal indicator
character (which is just a marker, and not printed anywhere) (the PSlit
parameter in sh(1)) can also be a wide char (passed to libedit as a wchar_t,
encoded as that by sh(1) or other applications that support this.)
Note: this has currently only been tested with everything ascii (C locale).
--
Remove workaround for ancient HTML generation code.
To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.63.8.1 src/lib/libedit/Makefile
cvs rdiff -u -r1.93 -r1.93.4.1 src/lib/libedit/editline.3
cvs rdiff -u -r1.32 -r1.32.8.1 src/lib/libedit/editrc.5 \
src/lib/libedit/terminal.c
cvs rdiff -u -r1.92 -r1.92.8.1 src/lib/libedit/el.c
cvs rdiff -u -r1.41 -r1.41.8.1 src/lib/libedit/el.h
cvs rdiff -u -r0 -r1.3.4.2 src/lib/libedit/literal.c
cvs rdiff -u -r0 -r1.2.4.2 src/lib/libedit/literal.h
cvs rdiff -u -r1.26 -r1.26.8.1 src/lib/libedit/prompt.c
cvs rdiff -u -r1.102 -r1.102.6.1 src/lib/libedit/read.c
cvs rdiff -u -r1.51 -r1.51.8.1 src/lib/libedit/refresh.c
cvs rdiff -u -r1.10 -r1.10.8.1 src/lib/libedit/refresh.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/Makefile
diff -u src/lib/libedit/Makefile:1.63 src/lib/libedit/Makefile:1.63.8.1
--- src/lib/libedit/Makefile:1.63 Tue May 24 17:42:54 2016
+++ src/lib/libedit/Makefile Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.63 2016/05/24 17:42:54 christos Exp $
+# $NetBSD: Makefile,v 1.63.8.1 2017/07/23 14:41:26 snj Exp $
# @(#)Makefile 8.1 (Berkeley) 6/4/93
USE_SHLIBDIR= yes
@@ -15,7 +15,7 @@ CWARNFLAGS.gcc+= -Wconversion
CWARNFLAGS.clang+= -Wno-cast-qual
SRCS = chared.c chartype.c common.c el.c eln.c emacs.c filecomplete.c \
- hist.c history.c historyn.c keymacro.c map.c \
+ hist.c history.c historyn.c keymacro.c literal.c map.c \
parse.c prompt.c read.c readline.c refresh.c search.c sig.c \
terminal.c tokenizer.c tokenizern.c tty.c vi.c
@@ -133,6 +133,7 @@ tc1: libedit.a tc1.o
# XXX
.if defined(HAVE_GCC)
COPTS.editline.c+= -Wno-cast-qual
+COPTS.literal.c+= -Wno-sign-conversion
COPTS.tokenizer.c+= -Wno-cast-qual
COPTS.tokenizern.c+= -Wno-cast-qual
.endif
Index: src/lib/libedit/editline.3
diff -u src/lib/libedit/editline.3:1.93 src/lib/libedit/editline.3:1.93.4.1
--- src/lib/libedit/editline.3:1.93 Mon Apr 10 15:02:40 2017
+++ src/lib/libedit/editline.3 Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-.\" $NetBSD: editline.3,v 1.93 2017/04/10 15:02:40 abhinav Exp $
+.\" $NetBSD: editline.3,v 1.93.4.1 2017/07/23 14:41:26 snj Exp $
.\"
.\" Copyright (c) 1997-2014 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -26,7 +26,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd May 22, 2016
+.Dd June 27, 2017
.Dt EDITLINE 3
.Os
.Sh NAME
@@ -358,6 +358,8 @@ terminal without affecting the state of
A subsequent second start/stop literal character ends this behavior.
This is typically used to embed literal escape sequences that change the
color/style of the terminal in the prompt.
+Note that the literal escape character cannot be the last character in the
+prompt, as the escape sequence is attached to the next character in the prompt.
.Dv 0
unsets it.
.It Dv EL_REFRESH
@@ -667,6 +669,8 @@ If
is
.Dv NULL ,
try
+.Pa $EDITRC
+and if that is not set
.Pa $HOME/.editrc .
Refer to
.Xr editrc 5
@@ -856,7 +860,7 @@ The caller is responsible for free'ing t
.El
.Pp
.Fn history
-returns \*[Gt]= 0 if the operation
+returns >= 0 if the operation
.Fa op
succeeds.
Otherwise, \-1 is returned and
Index: src/lib/libedit/editrc.5
diff -u src/lib/libedit/editrc.5:1.32 src/lib/libedit/editrc.5:1.32.8.1
--- src/lib/libedit/editrc.5:1.32 Sun May 22 23:54:20 2016
+++ src/lib/libedit/editrc.5 Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-.\" $NetBSD: editrc.5,v 1.32 2016/05/22 23:54:20 christos Exp $
+.\" $NetBSD: editrc.5,v 1.32.8.1 2017/07/23 14:41:26 snj Exp $
.\"
.\" Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -293,10 +293,18 @@ then the character is set to
List the values of all the terminal capabilities (see
.Xr termcap 5 ) .
.El
+.Sh ENVIRONMENT
+.Bl -tag -width "~/.editrcXXX"
+.It Ev EDITRC
+Names the default configuration file for the
+.Xr editline 3
+library.
+.El
.Sh FILES
.Bl -tag -width "~/.editrcXXX"
.It Pa ~/.editrc
-User configuration file for the
+Last resort, if no other file is specified,
+user configuration file for the
.Xr editline 3
library.
.El
Index: src/lib/libedit/terminal.c
diff -u src/lib/libedit/terminal.c:1.32 src/lib/libedit/terminal.c:1.32.8.1
--- src/lib/libedit/terminal.c:1.32 Mon May 9 21:46:56 2016
+++ src/lib/libedit/terminal.c Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: terminal.c,v 1.32 2016/05/09 21:46:56 christos Exp $ */
+/* $NetBSD: terminal.c,v 1.32.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)term.c 8.2 (Berkeley) 4/30/95";
#else
-__RCSID("$NetBSD: terminal.c,v 1.32 2016/05/09 21:46:56 christos Exp $");
+__RCSID("$NetBSD: terminal.c,v 1.32.8.1 2017/07/23 14:41:26 snj Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -419,46 +419,58 @@ terminal_rebuffer_display(EditLine *el)
return 0;
}
-
-/* terminal_alloc_display():
- * Allocate a new display.
- */
-static int
-terminal_alloc_display(EditLine *el)
+static wchar_t **
+terminal_alloc_buffer(EditLine *el)
{
- int i;
- wchar_t **b;
+ wint_t **b;
coord_t *c = &el->el_terminal.t_size;
+ int i;
b = el_malloc(sizeof(*b) * (size_t)(c->v + 1));
if (b == NULL)
- goto done;
+ return NULL;
for (i = 0; i < c->v; i++) {
b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
if (b[i] == NULL) {
while (--i >= 0)
el_free(b[i]);
el_free(b);
- goto done;
+ return NULL;
}
}
b[c->v] = NULL;
- el->el_display = b;
+ return b;
+}
- b = el_malloc(sizeof(*b) * (size_t)(c->v + 1));
- if (b == NULL)
+static void
+terminal_free_buffer(wint_t ***bp)
+{
+ wint_t **b;
+ wint_t **bufp;
+
+ if (*bp == NULL)
+ return;
+
+ b = *bp;
+ *bp = NULL;
+
+ for (bufp = b; *bufp != NULL; bufp++)
+ el_free(*bufp);
+ el_free(b);
+}
+
+/* terminal_alloc_display():
+ * Allocate a new display.
+ */
+static int
+terminal_alloc_display(EditLine *el)
+{
+ el->el_display = terminal_alloc_buffer(el);
+ if (el->el_display == NULL)
+ goto done;
+ el->el_vdisplay = terminal_alloc_buffer(el);
+ if (el->el_vdisplay == NULL)
goto done;
- for (i = 0; i < c->v; i++) {
- b[i] = el_malloc(sizeof(**b) * (size_t)(c->h + 1));
- if (b[i] == NULL) {
- while (--i >= 0)
- el_free(b[i]);
- el_free(b);
- goto done;
- }
- }
- b[c->v] = NULL;
- el->el_vdisplay = b;
return 0;
done:
terminal_free_display(el);
@@ -472,23 +484,8 @@ done:
static void
terminal_free_display(EditLine *el)
{
- wchar_t **b;
- wchar_t **bufp;
-
- b = el->el_display;
- el->el_display = NULL;
- if (b != NULL) {
- for (bufp = b; *bufp != NULL; bufp++)
- el_free(*bufp);
- el_free(b);
- }
- b = el->el_vdisplay;
- el->el_vdisplay = NULL;
- if (b != NULL) {
- for (bufp = b; *bufp != NULL; bufp++)
- el_free(*bufp);
- el_free(b);
- }
+ terminal_free_buffer(&el->el_display);
+ terminal_free_buffer(&el->el_vdisplay);
}
@@ -1254,6 +1251,8 @@ terminal__putc(EditLine *el, wint_t c)
ssize_t i;
if (c == (wint_t)MB_FILL_CHAR)
return 0;
+ if (c & EL_LITERAL)
+ return fputs(literal_get(el, c), el->el_outfile);
i = ct_encode_char(buf, (size_t)MB_LEN_MAX, c);
if (i <= 0)
return (int)i;
Index: src/lib/libedit/el.c
diff -u src/lib/libedit/el.c:1.92 src/lib/libedit/el.c:1.92.8.1
--- src/lib/libedit/el.c:1.92 Sun May 22 19:44:26 2016
+++ src/lib/libedit/el.c Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $ */
+/* $NetBSD: el.c,v 1.92.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)el.c 8.2 (Berkeley) 1/3/94";
#else
-__RCSID("$NetBSD: el.c,v 1.92 2016/05/22 19:44:26 christos Exp $");
+__RCSID("$NetBSD: el.c,v 1.92.8.1 2017/07/23 14:41:26 snj Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -115,6 +115,7 @@ el_init_fd(const char *prog, FILE *fin,
(void) hist_init(el);
(void) prompt_init(el);
(void) sig_init(el);
+ (void) literal_init(el);
if (read_init(el) == -1) {
el_end(el);
return NULL;
@@ -146,6 +147,7 @@ el_end(EditLine *el)
hist_end(el);
prompt_end(el);
sig_end(el);
+ literal_end(el);
el_free(el->el_prog);
el_free(el->el_visual.cbuff);
@@ -524,18 +526,22 @@ el_source(EditLine *el, const char *fnam
fp = NULL;
if (fname == NULL) {
#ifdef HAVE_ISSETUGID
- static const char elpath[] = "/.editrc";
- size_t plen = sizeof(elpath);
-
if (issetugid())
return -1;
- if ((ptr = getenv("HOME")) == NULL)
- return -1;
- plen += strlen(ptr);
- if ((path = el_malloc(plen * sizeof(*path))) == NULL)
- return -1;
- (void)snprintf(path, plen, "%s%s", ptr, elpath);
- fname = path;
+
+ if ((fname = getenv("EDITRC")) == NULL) {
+ static const char elpath[] = "/.editrc";
+ size_t plen = sizeof(elpath);
+
+ if ((ptr = getenv("HOME")) == NULL)
+ return -1;
+ plen += strlen(ptr);
+ if ((path = el_malloc(plen * sizeof(*path))) == NULL)
+ return -1;
+ (void)snprintf(path, plen, "%s%s", ptr,
+ elpath + (*ptr == '\0'));
+ fname = path;
+ }
#else
/*
* If issetugid() is missing, always return an error, in order
@@ -545,6 +551,9 @@ el_source(EditLine *el, const char *fnam
return -1;
#endif
}
+ if (fname[0] == '\0')
+ return -1;
+
if (fp == NULL)
fp = fopen(fname, "r");
if (fp == NULL) {
Index: src/lib/libedit/el.h
diff -u src/lib/libedit/el.h:1.41 src/lib/libedit/el.h:1.41.8.1
--- src/lib/libedit/el.h:1.41 Tue May 24 15:00:45 2016
+++ src/lib/libedit/el.h Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: el.h,v 1.41 2016/05/24 15:00:45 christos Exp $ */
+/* $NetBSD: el.h,v 1.41.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -94,6 +94,7 @@ typedef struct el_state_t {
#include "tty.h"
#include "prompt.h"
+#include "literal.h"
#include "keymacro.h"
#include "terminal.h"
#include "refresh.h"
@@ -115,8 +116,8 @@ struct editline {
int el_errfd; /* Error file descriptor */
int el_flags; /* Various flags. */
coord_t el_cursor; /* Cursor location */
- wchar_t **el_display; /* Real screen image = what is there */
- wchar_t **el_vdisplay; /* Virtual screen image = what we see */
+ wint_t **el_display; /* Real screen image = what is there */
+ wint_t **el_vdisplay; /* Virtual screen image = what we see */
void *el_data; /* Client data */
el_line_t el_line; /* The current line information */
el_state_t el_state; /* Current editor state */
@@ -125,6 +126,7 @@ struct editline {
el_refresh_t el_refresh; /* Refresh stuff */
el_prompt_t el_prompt; /* Prompt stuff */
el_prompt_t el_rprompt; /* Prompt stuff */
+ el_literal_t el_literal; /* prompt literal bits */
el_chared_t el_chared; /* Characted editor stuff */
el_map_t el_map; /* Key mapping stuff */
el_keymacro_t el_keymacro; /* Key binding stuff */
Index: src/lib/libedit/prompt.c
diff -u src/lib/libedit/prompt.c:1.26 src/lib/libedit/prompt.c:1.26.8.1
--- src/lib/libedit/prompt.c:1.26 Mon May 9 21:46:56 2016
+++ src/lib/libedit/prompt.c Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $ */
+/* $NetBSD: prompt.c,v 1.26.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)prompt.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: prompt.c,v 1.26 2016/05/09 21:46:56 christos Exp $");
+__RCSID("$NetBSD: prompt.c,v 1.26.8.1 2017/07/23 14:41:26 snj Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -84,7 +84,6 @@ prompt_print(EditLine *el, int op)
{
el_prompt_t *elp;
wchar_t *p;
- int ignore = 0;
if (op == EL_PROMPT)
elp = &el->el_prompt;
@@ -99,13 +98,17 @@ prompt_print(EditLine *el, int op)
for (; *p; p++) {
if (elp->p_ignore == *p) {
- ignore = !ignore;
+ wchar_t *litstart = ++p;
+ while (*p && *p != elp->p_ignore)
+ p++;
+ if (!*p || !p[1]) {
+ // XXX: We lose the last literal
+ break;
+ }
+ re_putliteral(el, litstart, p++);
continue;
}
- if (ignore)
- terminal__putc(el, *p);
- else
- re_putc(el, *p, 1);
+ re_putc(el, *p, 1);
}
elp->p_pos.v = el->el_refresh.r_cursor.v;
Index: src/lib/libedit/read.c
diff -u src/lib/libedit/read.c:1.102 src/lib/libedit/read.c:1.102.6.1
--- src/lib/libedit/read.c:1.102 Sun Dec 11 15:47:06 2016
+++ src/lib/libedit/read.c Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: read.c,v 1.102 2016/12/11 15:47:06 christos Exp $ */
+/* $NetBSD: read.c,v 1.102.6.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)read.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: read.c,v 1.102 2016/12/11 15:47:06 christos Exp $");
+__RCSID("$NetBSD: read.c,v 1.102.6.1 2017/07/23 14:41:26 snj Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -229,10 +229,9 @@ read_getcmd(EditLine *el, el_action_t *c
{
static const wchar_t meta = (wchar_t)0x80;
el_action_t cmd;
- int num;
do {
- if ((num = el_wgetc(el, ch)) != 1)
+ if (el_wgetc(el, ch) != 1)
return -1;
#ifdef KANJI
Index: src/lib/libedit/refresh.c
diff -u src/lib/libedit/refresh.c:1.51 src/lib/libedit/refresh.c:1.51.8.1
--- src/lib/libedit/refresh.c:1.51 Mon May 9 21:46:56 2016
+++ src/lib/libedit/refresh.c Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $ */
+/* $NetBSD: refresh.c,v 1.51.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)refresh.c 8.1 (Berkeley) 6/4/93";
#else
-__RCSID("$NetBSD: refresh.c,v 1.51 2016/05/09 21:46:56 christos Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.51.8.1 2017/07/23 14:41:26 snj Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -155,6 +155,35 @@ re_addc(EditLine *el, wint_t c)
}
}
+/* re_putliteral():
+ * Place the literal string given
+ */
+libedit_private void
+re_putliteral(EditLine *el, const wchar_t *begin, const wchar_t *end)
+{
+ coord_t *cur = &el->el_refresh.r_cursor;
+ wint_t c;
+ int sizeh = el->el_terminal.t_size.h;
+ int i, w;
+
+ c = literal_add(el, begin, end, &w);
+ if (c == 0 || w <= 0)
+ return;
+ el->el_vdisplay[cur->v][cur->h] = c;
+
+ i = w;
+ if (i > sizeh - cur->h) /* avoid overflow */
+ i = sizeh - cur->h;
+ while (--i > 0)
+ el->el_vdisplay[cur->v][cur->h + i] = MB_FILL_CHAR;
+
+ cur->h += w;
+ if (cur->h >= sizeh) {
+ /* assure end of line */
+ el->el_vdisplay[cur->v][sizeh] = '\0';
+ re_nextline(el);
+ }
+}
/* re_putc():
* Draw the character given
@@ -162,30 +191,30 @@ re_addc(EditLine *el, wint_t c)
libedit_private void
re_putc(EditLine *el, wint_t c, int shift)
{
+ coord_t *cur = &el->el_refresh.r_cursor;
int i, w = wcwidth(c);
+ int sizeh = el->el_terminal.t_size.h;
+
ELRE_DEBUG(1, (__F, "printing %5x '%lc'\r\n", c, c));
if (w == -1)
w = 0;
- while (shift && (el->el_refresh.r_cursor.h + w > el->el_terminal.t_size.h))
+ while (shift && (cur->h + w > sizeh))
re_putc(el, ' ', 1);
- el->el_vdisplay[el->el_refresh.r_cursor.v]
- [el->el_refresh.r_cursor.h] = c;
+ el->el_vdisplay[cur->v][cur->h] = c;
/* assumes !shift is only used for single-column chars */
i = w;
while (--i > 0)
- el->el_vdisplay[el->el_refresh.r_cursor.v]
- [el->el_refresh.r_cursor.h + i] = MB_FILL_CHAR;
+ el->el_vdisplay[cur->v][cur->h + i] = MB_FILL_CHAR;
if (!shift)
return;
- el->el_refresh.r_cursor.h += w; /* advance to next place */
- if (el->el_refresh.r_cursor.h >= el->el_terminal.t_size.h) {
+ cur->h += w; /* advance to next place */
+ if (cur->h >= sizeh) {
/* assure end of line */
- el->el_vdisplay[el->el_refresh.r_cursor.v][el->el_terminal.t_size.h]
- = '\0';
+ el->el_vdisplay[cur->v][sizeh] = '\0';
re_nextline(el);
}
}
@@ -210,10 +239,13 @@ re_refresh(EditLine *el)
ELRE_DEBUG(1, (__F, "el->el_line.buffer = :%ls:\r\n",
el->el_line.buffer));
+ literal_clear(el);
/* reset the Drawing cursor */
el->el_refresh.r_cursor.h = 0;
el->el_refresh.r_cursor.v = 0;
+ terminal_move_to_char(el, 0);
+
/* temporarily draw rprompt to calculate its size */
prompt_print(el, EL_RPROMPT);
Index: src/lib/libedit/refresh.h
diff -u src/lib/libedit/refresh.h:1.10 src/lib/libedit/refresh.h:1.10.8.1
--- src/lib/libedit/refresh.h:1.10 Mon May 9 21:46:56 2016
+++ src/lib/libedit/refresh.h Sun Jul 23 14:41:26 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.h,v 1.10 2016/05/09 21:46:56 christos Exp $ */
+/* $NetBSD: refresh.h,v 1.10.8.1 2017/07/23 14:41:26 snj Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -47,6 +47,8 @@ typedef struct {
} el_refresh_t;
libedit_private void re_putc(EditLine *, wint_t, int);
+libedit_private void re_putliteral(EditLine *, const wchar_t *,
+ const wchar_t *);
libedit_private void re_clear_lines(EditLine *);
libedit_private void re_clear_display(EditLine *);
libedit_private void re_refresh(EditLine *);
Added files:
Index: src/lib/libedit/literal.c
diff -u /dev/null src/lib/libedit/literal.c:1.3.4.2
--- /dev/null Sun Jul 23 14:41:26 2017
+++ src/lib/libedit/literal.c Sun Jul 23 14:41:26 2017
@@ -0,0 +1,136 @@
+/* $NetBSD: literal.c,v 1.3.4.2 2017/07/23 14:41:26 snj Exp $ */
+
+/*-
+ * Copyright (c) 2017 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include "config.h"
+#if !defined(lint) && !defined(SCCSID)
+__RCSID("$NetBSD: literal.c,v 1.3.4.2 2017/07/23 14:41:26 snj Exp $");
+#endif /* not lint && not SCCSID */
+
+/*
+ * literal.c: Literal sequences handling.
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "el.h"
+
+libedit_private void
+literal_init(EditLine *el)
+{
+ el_literal_t *l = &el->el_literal;
+
+ memset(l, 0, sizeof(*l));
+}
+
+libedit_private void
+literal_end(EditLine *el)
+{
+ literal_clear(el);
+}
+
+libedit_private void
+literal_clear(EditLine *el)
+{
+ el_literal_t *l = &el->el_literal;
+ size_t i;
+
+ if (l->l_len == 0)
+ return;
+
+ for (i = 0; i < l->l_idx; i++)
+ el_free(l->l_buf[i]);
+ el_free(l->l_buf);
+ l->l_buf = NULL;
+ l->l_len = 0;
+ l->l_idx = 0;
+}
+
+libedit_private wint_t
+literal_add(EditLine *el, const wchar_t *buf, const wchar_t *end, int *wp)
+{
+ el_literal_t *l = &el->el_literal;
+ size_t i, len;
+ ssize_t w, n;
+ char *b;
+
+ w = wcwidth(end[1]); /* column width of the visible char */
+ *wp = (int)w;
+
+ if (w <= 0) /* we require something to be printed */
+ return 0;
+
+ len = (size_t)(end - buf);
+ for (w = 0, i = 0; i < len; i++)
+ w += ct_enc_width(buf[i]);
+ w += ct_enc_width(end[1]);
+
+ b = el_malloc((size_t)(w + 1));
+ if (b == NULL)
+ return 0;
+
+ for (n = 0, i = 0; i < len; i++)
+ n += ct_encode_char(b + n, w - n, buf[i]);
+ n += ct_encode_char(b + n, w - n, end[1]);
+ b[n] = '\0';
+
+ /*
+ * Then save this literal string in the list of such strings,
+ * and return a "magic character" to put into the terminal buffer.
+ * When that magic char is 'printed' the saved string (which includes
+ * the char that belongs in that position) gets sent instead.
+ */
+ if (l->l_idx == l->l_len) {
+ char **bp;
+
+ l->l_len += 4;
+ bp = el_realloc(l->l_buf, sizeof(*l->l_buf) * l->l_len);
+ if (bp == NULL) {
+ free(b);
+ l->l_len -= 4;
+ return 0;
+ }
+ l->l_buf = bp;
+ }
+ l->l_buf[l->l_idx++] = b;
+ return EL_LITERAL | (wint_t)(l->l_idx - 1);
+}
+
+libedit_private const char *
+literal_get(EditLine *el, wint_t idx)
+{
+ el_literal_t *l = &el->el_literal;
+
+ assert(idx & EL_LITERAL);
+ idx &= ~EL_LITERAL;
+ assert(l->l_idx > (size_t)idx);
+ return l->l_buf[idx];
+}
Index: src/lib/libedit/literal.h
diff -u /dev/null src/lib/libedit/literal.h:1.2.4.2
--- /dev/null Sun Jul 23 14:41:26 2017
+++ src/lib/libedit/literal.h Sun Jul 23 14:41:26 2017
@@ -0,0 +1,53 @@
+/* $NetBSD: literal.h,v 1.2.4.2 2017/07/23 14:41:26 snj Exp $ */
+
+/*-
+ * Copyright (c) 2017 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Christos Zoulas.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * el.literal.h: Literal character
+ */
+#ifndef _h_el_literal
+#define _h_el_literal
+
+#define EL_LITERAL ((wint_t)0x80000000)
+
+typedef struct el_literal_t {
+ char **l_buf; /* array of buffers */
+ size_t l_idx; /* max in use */
+ size_t l_len; /* max allocated */
+} el_literal_t;
+
+libedit_private void literal_init(EditLine *);
+libedit_private void literal_end(EditLine *);
+libedit_private void literal_clear(EditLine *);
+libedit_private wint_t literal_add(EditLine *, const wchar_t *,
+ const wchar_t *, int *);
+libedit_private const char *literal_get(EditLine *, wint_t);
+
+#endif /* _h_el_literal */