diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-01-17 20:52:13 +0100 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2024-01-17 20:52:13 +0100 |
commit | 4ea37f88e8345ca830271636a2e197a1a46114d2 (patch) | |
tree | 36d1f16e8ec41f03766fbff8028fd4625fd5cb9a /src/charset.c | |
parent | 5b0722b86445158f0b502ffc48a5847b0d0187bd (diff) |
patch 9.1.0038: Unnecessary loop in getvcol()v9.1.0038
Problem: Unnecessary loop in getvcol().
Solution: Compare next char position with pos->col directly.
(zeertzjq)
The loop below already handles end of line before checking for posptr,
and the next char is after pos->col whether pos->col is at the start or
in the middle of the char in question, so neither the NUL check nor the
mb_head_off() are needed when comparing the position of the next char
with pos->col directly.
closes: #13878
Signed-off-by: zeertzjq <zeertzjq@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
Diffstat (limited to 'src/charset.c')
-rw-r--r-- | src/charset.c | 30 |
1 files changed, 6 insertions, 24 deletions
diff --git a/src/charset.c b/src/charset.c index 3ea2ecb8e2..eef2e8983c 100644 --- a/src/charset.c +++ b/src/charset.c @@ -1493,7 +1493,6 @@ getvcol( { colnr_T vcol; char_u *ptr; // points to current char - char_u *posptr; // points to char at pos->col char_u *line; // start of the line int incr; int head; @@ -1509,24 +1508,6 @@ getvcol( vcol = 0; line = ptr = ml_get_buf(wp->w_buffer, pos->lnum, FALSE); - if (pos->col == MAXCOL) - posptr = NULL; // continue until the NUL - else - { - colnr_T i; - - // In a few cases the position can be beyond the end of the line. - for (i = 0; i < pos->col; ++i) - if (ptr[i] == NUL) - { - pos->col = i; - break; - } - posptr = ptr + pos->col; - if (has_mbyte) - // always start on the first byte - posptr -= (*mb_head_off)(line, posptr); - } init_chartabsize_arg(&cts, wp, pos->lnum, 0, line, line); cts.cts_max_head_vcol = -1; @@ -1588,11 +1569,12 @@ getvcol( incr = g_chartab[c] & CT_CELL_MASK; } - if (posptr != NULL && ptr >= posptr) // character at pos->col + char_u *next_ptr = ptr + (*mb_ptr2len)(ptr); + if (next_ptr - line > pos->col) // character at pos->col break; vcol += incr; - MB_PTR_ADV(ptr); + ptr = next_ptr; } } else @@ -1620,12 +1602,12 @@ getvcol( wp->w_virtcol_first_char = cts.cts_first_char; #endif - if (posptr != NULL && cts.cts_ptr >= posptr) - // character at pos->col + char_u *next_ptr = cts.cts_ptr + (*mb_ptr2len)(cts.cts_ptr); + if (next_ptr - line > pos->col) // character at pos->col break; cts.cts_vcol += incr; - MB_PTR_ADV(cts.cts_ptr); + cts.cts_ptr = next_ptr; } vcol = cts.cts_vcol; ptr = cts.cts_ptr; |