diff --git a/src/winio.c b/src/winio.c index 71f1e873bbf646ebd745b959362728c1212a1d04..52843eae067b0f41e717c8a9af2891fd72c394df 100644 --- 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';