commit d6f43bd156cff0d9b8fa6bbdbe20a01408174ad5
parent ebbe546033c8d0315e52b2b2cc2d3ec769cb914f
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Sun, 5 Jun 2016 21:10:07 +0200
screen: elide the intermediate buffer for every single character
Diffstat:
M | src/winio.c | | | 42 | ++++++++++++++++-------------------------- |
1 file changed, 16 insertions(+), 26 deletions(-)
diff --git a/src/winio.c b/src/winio.c
@@ -1739,8 +1739,6 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
/* The string we return. */
size_t index;
/* Current position in converted. */
- char *buf_mb;
- int buf_mb_len;
/* If dollars is TRUE, make room for the "$" at the end of the
* line. */
@@ -1750,8 +1748,6 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
if (len == 0)
return mallocstrcpy(NULL, "");
- buf_mb = charalloc(mb_cur_max());
-
start_index = actual_x(buf, start_col);
column = strnlenpt(buf, start_index);
@@ -1762,22 +1758,21 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
index = 0;
seen_wide = FALSE;
+ buf += start_index;
- if (buf[start_index] != '\0' && buf[start_index] != '\t' &&
+ if (*buf != '\0' && *buf != '\t' &&
(column < start_col || (dollars && column > 0))) {
- /* We don't display all of buf[start_index] since it starts to
+ /* We don't display the complete first character as it starts to
* the left of the screen. */
- buf_mb_len = parse_mbchar(buf + start_index, buf_mb, NULL);
-
- if (is_cntrl_mbchar(buf + start_index)) {
+ if (is_cntrl_mbchar(buf)) {
if (column < start_col) {
- converted[index++] = control_mbrep(buf_mb);
+ converted[index++] = control_mbrep(buf);
start_col++;
- start_index += buf_mb_len;
+ buf += parse_mbchar(buf, NULL, NULL);
}
}
#ifdef ENABLE_UTF8
- else if (using_utf8() && mbwidth(buf_mb) == 2) {
+ else if (using_utf8() && mbwidth(buf) == 2) {
if (column >= start_col) {
converted[index++] = ' ';
start_col++;
@@ -1786,18 +1781,16 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
converted[index++] = ' ';
start_col++;
- start_index += buf_mb_len;
+ buf += parse_mbchar(buf, NULL, NULL);
}
#endif
}
- while (buf[start_index] != '\0') {
- buf_mb_len = parse_mbchar(buf + start_index, buf_mb, NULL);
-
- if (mbwidth(buf + start_index) > 1)
+ while (*buf != '\0') {
+ if (mbwidth(buf) > 1)
seen_wide = TRUE;
- if (*buf_mb == ' ') {
+ if (*buf == ' ') {
/* Show a space as a visible character, or as a space. */
#ifndef NANO_TINY
if (ISSET(WHITESPACE_DISPLAY)) {
@@ -1809,7 +1802,7 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
#endif
converted[index++] = ' ';
start_col++;
- } else if (*buf_mb == '\t') {
+ } else if (*buf == '\t') {
/* Show a tab as a visible character, or as as a space. */
#ifndef NANO_TINY
if (ISSET(WHITESPACE_DISPLAY)) {
@@ -1827,17 +1820,16 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
start_col++;
}
/* If buf contains a control character, represent it. */
- } else if (is_cntrl_mbchar(buf + start_index)) {
+ } else if (is_cntrl_mbchar(buf)) {
converted[index++] = '^';
- converted[index++] = control_mbrep(buf_mb);
+ converted[index++] = control_mbrep(buf);
start_col += 2;
/* If buf contains a non-control character, interpret it. If buf
* contains an invalid multibyte sequence, display it as such. */
} else {
char *character = charalloc(mb_cur_max());
int charlen, i;
-
- character = mbrep(buf + start_index, character, &charlen);
+ character = mbrep(buf, character, &charlen);
for (i = 0; i < charlen; i++)
converted[index++] = character[i];
@@ -1847,11 +1839,9 @@ char *display_string(const char *buf, size_t start_col, size_t len, bool
free(character);
}
- start_index += buf_mb_len;
+ buf += parse_mbchar(buf, NULL, NULL);
}
- free(buf_mb);
-
/* Null-terminate converted. */
converted[index] = '\0';