aboutsummaryrefslogtreecommitdiff
path: root/refresh.c
diff options
context:
space:
mode:
Diffstat (limited to 'refresh.c')
-rw-r--r--refresh.c176
1 files changed, 105 insertions, 71 deletions
diff --git a/refresh.c b/refresh.c
index b210e8a47522..fe5187c5f066 100644
--- a/refresh.c
+++ b/refresh.c
@@ -1,4 +1,4 @@
-/* $NetBSD: refresh.c,v 1.45 2016/03/02 19:24:20 christos Exp $ */
+/* $NetBSD: refresh.c,v 1.54 2017/06/30 20:26:52 kre 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.45 2016/03/02 19:24:20 christos Exp $");
+__RCSID("$NetBSD: refresh.c,v 1.54 2017/06/30 20:26:52 kre Exp $");
#endif
#endif /* not lint && not SCCSID */
@@ -50,18 +50,18 @@ __RCSID("$NetBSD: refresh.c,v 1.45 2016/03/02 19:24:20 christos Exp $");
#include "el.h"
-private void re_nextline(EditLine *);
-private void re_addc(EditLine *, wint_t);
-private void re_update_line(EditLine *, Char *, Char *, int);
-private void re_insert (EditLine *, Char *, int, int, Char *, int);
-private void re_delete(EditLine *, Char *, int, int, int);
-private void re_fastputc(EditLine *, wint_t);
-private void re_clear_eol(EditLine *, int, int, int);
-private void re__strncopy(Char *, Char *, size_t);
-private void re__copy_and_pad(Char *, const Char *, size_t);
+static void re_nextline(EditLine *);
+static void re_addc(EditLine *, wint_t);
+static void re_update_line(EditLine *, wchar_t *, wchar_t *, int);
+static void re_insert (EditLine *, wchar_t *, int, int, wchar_t *, int);
+static void re_delete(EditLine *, wchar_t *, int, int, int);
+static void re_fastputc(EditLine *, wint_t);
+static void re_clear_eol(EditLine *, int, int, int);
+static void re__strncopy(wchar_t *, wchar_t *, size_t);
+static void re__copy_and_pad(wchar_t *, const wchar_t *, size_t);
#ifdef DEBUG_REFRESH
-private void re_printstr(EditLine *, const char *, Char *, Char *);
+static void re_printstr(EditLine *, const char *, wchar_t *, wchar_t *);
#define __F el->el_errfile
#define ELRE_ASSERT(a, b, c) do \
if (/*CONSTCOND*/ a) { \
@@ -74,8 +74,8 @@ private void re_printstr(EditLine *, const char *, Char *, Char *);
/* re_printstr():
* Print a string on the debugging pty
*/
-private void
-re_printstr(EditLine *el, const char *str, Char *f, Char *t)
+static void
+re_printstr(EditLine *el, const char *str, wchar_t *f, wchar_t *t)
{
ELRE_DEBUG(1, (__F, "%s:\"", str));
@@ -91,7 +91,7 @@ re_printstr(EditLine *el, const char *str, Char *f, Char *t)
/* re_nextline():
* Move to the next line or scroll
*/
-private void
+static void
re_nextline(EditLine *el)
{
el->el_refresh.r_cursor.h = 0; /* reset it. */
@@ -104,7 +104,7 @@ re_nextline(EditLine *el)
*/
if (el->el_refresh.r_cursor.v + 1 >= el->el_terminal.t_size.v) {
int i, lins = el->el_terminal.t_size.v;
- Char *firstline = el->el_vdisplay[0];
+ wchar_t *firstline = el->el_vdisplay[0];
for(i = 1; i < lins; i++)
el->el_vdisplay[i - 1] = el->el_vdisplay[i];
@@ -123,10 +123,10 @@ re_nextline(EditLine *el)
/* re_addc():
* Draw c, expanding tabs, control chars etc.
*/
-private void
+static void
re_addc(EditLine *el, wint_t c)
{
- switch (ct_chr_class((Char)c)) {
+ switch (ct_chr_class(c)) {
case CHTYPE_TAB: /* expand the tab */
for (;;) {
re_putc(el, ' ', 1);
@@ -145,9 +145,9 @@ re_addc(EditLine *el, wint_t c)
re_putc(el, c, 1);
break;
default: {
- Char visbuf[VISUAL_WIDTH_MAX];
+ wchar_t visbuf[VISUAL_WIDTH_MAX];
ssize_t i, n =
- ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+ ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c);
for (i = 0; n-- > 0; ++i)
re_putc(el, visbuf[i], 1);
break;
@@ -155,35 +155,66 @@ 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
*/
-protected void
+libedit_private void
re_putc(EditLine *el, wint_t c, int shift)
{
- int i, w = Width(c);
+ 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] = (Char)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);
}
}
@@ -195,23 +226,26 @@ re_putc(EditLine *el, wint_t c, int shift)
* virtual image. The routine to re-draw a line can be replaced
* easily in hopes of a smarter one being placed there.
*/
-protected void
+libedit_private void
re_refresh(EditLine *el)
{
int i, rhdiff;
- Char *cp, *st;
+ wchar_t *cp, *st;
coord_t cur;
#ifdef notyet
size_t termsz;
#endif
- ELRE_DEBUG(1, (__F, "el->el_line.buffer = :" FSTR ":\r\n",
+ 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);
@@ -251,7 +285,7 @@ re_refresh(EditLine *el)
for (cp = st; cp < el->el_line.lastchar; cp++) {
if (cp == el->el_line.cursor) {
- int w = Width(*cp);
+ int w = wcwidth(*cp);
/* save for later */
cur.h = el->el_refresh.r_cursor.h;
cur.v = el->el_refresh.r_cursor.v;
@@ -319,10 +353,10 @@ re_refresh(EditLine *el)
for (; i <= el->el_refresh.r_oldcv; i++) {
terminal_move_to_line(el, i);
terminal_move_to_char(el, 0);
- /* This Strlen should be safe even with MB_FILL_CHARs */
- terminal_clear_EOL(el, (int) Strlen(el->el_display[i]));
+ /* This wcslen should be safe even with MB_FILL_CHARs */
+ terminal_clear_EOL(el, (int) wcslen(el->el_display[i]));
#ifdef DEBUG_REFRESH
- terminal_overwrite(el, STR("C\b"), 2);
+ terminal_overwrite(el, L"C\b", 2);
#endif /* DEBUG_REFRESH */
el->el_display[i][0] = '\0';
}
@@ -340,7 +374,7 @@ re_refresh(EditLine *el)
/* re_goto_bottom():
* used to go to last used screen line
*/
-protected void
+libedit_private void
re_goto_bottom(EditLine *el)
{
@@ -355,12 +389,12 @@ re_goto_bottom(EditLine *el)
* insert num characters of s into d (in front of the character)
* at dat, maximum length of d is dlen
*/
-private void
+static void
/*ARGSUSED*/
re_insert(EditLine *el __attribute__((__unused__)),
- Char *d, int dat, int dlen, Char *s, int num)
+ wchar_t *d, int dat, int dlen, wchar_t *s, int num)
{
- Char *a, *b;
+ wchar_t *a, *b;
if (num <= 0)
return;
@@ -406,12 +440,12 @@ re_insert(EditLine *el __attribute__((__unused__)),
/* re_delete():
* delete num characters d at dat, maximum length of d is dlen
*/
-private void
+static void
/*ARGSUSED*/
re_delete(EditLine *el __attribute__((__unused__)),
- Char *d, int dat, int dlen, int num)
+ wchar_t *d, int dat, int dlen, int num)
{
- Char *a, *b;
+ wchar_t *a, *b;
if (num <= 0)
return;
@@ -440,8 +474,8 @@ re_delete(EditLine *el __attribute__((__unused__)),
/* re__strncopy():
* Like strncpy without padding.
*/
-private void
-re__strncopy(Char *a, Char *b, size_t n)
+static void
+re__strncopy(wchar_t *a, wchar_t *b, size_t n)
{
while (n-- && *b)
@@ -455,7 +489,7 @@ re__strncopy(Char *a, Char *b, size_t n)
* in the first or second diff, diff is the difference between the
* number of characters between the new and old line.
*/
-private void
+static void
re_clear_eol(EditLine *el, int fx, int sx, int diff)
{
@@ -499,12 +533,12 @@ new: eddie> Oh, my little buggy says to me, as lurgid as
*/
#define MIN_END_KEEP 4
-private void
-re_update_line(EditLine *el, Char *old, Char *new, int i)
+static void
+re_update_line(EditLine *el, wchar_t *old, wchar_t *new, int i)
{
- Char *o, *n, *p, c;
- Char *ofd, *ols, *oe, *nfd, *nls, *ne;
- Char *osb, *ose, *nsb, *nse;
+ wchar_t *o, *n, *p, c;
+ wchar_t *ofd, *ols, *oe, *nfd, *nls, *ne;
+ wchar_t *osb, *ose, *nsb, *nse;
int fx, sx;
size_t len;
@@ -561,7 +595,7 @@ re_update_line(EditLine *el, Char *old, Char *new, int i)
nls = ++n;
/*
- * find same begining and same end
+ * find same beginning and same end
*/
osb = ols;
nsb = nls;
@@ -969,8 +1003,8 @@ re_update_line(EditLine *el, Char *old, Char *new, int i)
/* re__copy_and_pad():
* Copy string and pad with spaces
*/
-private void
-re__copy_and_pad(Char *dst, const Char *src, size_t width)
+static void
+re__copy_and_pad(wchar_t *dst, const wchar_t *src, size_t width)
{
size_t i;
@@ -990,10 +1024,10 @@ re__copy_and_pad(Char *dst, const Char *src, size_t width)
/* re_refresh_cursor():
* Move to the new cursor position
*/
-protected void
+libedit_private void
re_refresh_cursor(EditLine *el)
{
- Char *cp;
+ wchar_t *cp;
int h, v, th, w;
if (el->el_line.cursor >= el->el_line.lastchar) {
@@ -1021,7 +1055,7 @@ re_refresh_cursor(EditLine *el)
continue;
break;
default:
- w = Width(*cp);
+ w = wcwidth(*cp);
if (w > 1 && h + w > th) { /* won't fit on line */
h = 0;
v++;
@@ -1037,7 +1071,7 @@ re_refresh_cursor(EditLine *el)
}
/* if we have a next character, and it's a doublewidth one, we need to
* check whether we need to linebreak for it to fit */
- if (cp < el->el_line.lastchar && (w = Width(*cp)) > 1)
+ if (cp < el->el_line.lastchar && (w = wcwidth(*cp)) > 1)
if (h + w > th) {
h = 0;
v++;
@@ -1053,15 +1087,15 @@ re_refresh_cursor(EditLine *el)
/* re_fastputc():
* Add a character fast.
*/
-private void
+static void
re_fastputc(EditLine *el, wint_t c)
{
- int w = Width((Char)c);
+ int w = wcwidth(c);
while (w > 1 && el->el_cursor.h + w > el->el_terminal.t_size.h)
re_fastputc(el, ' ');
terminal__putc(el, c);
- el->el_display[el->el_cursor.v][el->el_cursor.h++] = (Char)c;
+ el->el_display[el->el_cursor.v][el->el_cursor.h++] = c;
while (--w > 0)
el->el_display[el->el_cursor.v][el->el_cursor.h++]
= MB_FILL_CHAR;
@@ -1078,12 +1112,12 @@ re_fastputc(EditLine *el, wint_t c)
*/
if (el->el_cursor.v + 1 >= el->el_terminal.t_size.v) {
int i, lins = el->el_terminal.t_size.v;
- Char *firstline = el->el_display[0];
+ wchar_t *firstline = el->el_display[0];
for(i = 1; i < lins; i++)
el->el_display[i - 1] = el->el_display[i];
- re__copy_and_pad(firstline, STR(""), (size_t)0);
+ re__copy_and_pad(firstline, L"", (size_t)0);
el->el_display[i - 1] = firstline;
} else {
el->el_cursor.v++;
@@ -1106,10 +1140,10 @@ re_fastputc(EditLine *el, wint_t c)
* we added just one char, handle it fast.
* Assumes that screen cursor == real cursor
*/
-protected void
+libedit_private void
re_fastaddc(EditLine *el)
{
- Char c;
+ wchar_t c;
int rhdiff;
c = el->el_line.cursor[-1];
@@ -1133,9 +1167,9 @@ re_fastaddc(EditLine *el)
break;
case CHTYPE_ASCIICTL:
case CHTYPE_NONPRINT: {
- Char visbuf[VISUAL_WIDTH_MAX];
+ wchar_t visbuf[VISUAL_WIDTH_MAX];
ssize_t i, n =
- ct_visual_char(visbuf, VISUAL_WIDTH_MAX, (Char)c);
+ ct_visual_char(visbuf, VISUAL_WIDTH_MAX, c);
for (i = 0; n-- > 0; ++i)
re_fastputc(el, visbuf[i]);
break;
@@ -1148,7 +1182,7 @@ re_fastaddc(EditLine *el)
/* re_clear_display():
* clear the screen buffers so that new new prompt starts fresh.
*/
-protected void
+libedit_private void
re_clear_display(EditLine *el)
{
int i;
@@ -1164,7 +1198,7 @@ re_clear_display(EditLine *el)
/* re_clear_lines():
* Make sure all lines are *really* blank
*/
-protected void
+libedit_private void
re_clear_lines(EditLine *el)
{