summaryrefslogtreecommitdiffstats
path: root/src/charset.c
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-01-17 20:52:13 +0100
committerChristian Brabandt <cb@256bit.org>2024-01-17 20:52:13 +0100
commit4ea37f88e8345ca830271636a2e197a1a46114d2 (patch)
tree36d1f16e8ec41f03766fbff8028fd4625fd5cb9a /src/charset.c
parent5b0722b86445158f0b502ffc48a5847b0d0187bd (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.c30
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;