aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/nvim/api/vim.c2
-rw-r--r--src/nvim/eval.c4
-rw-r--r--src/nvim/mbyte.c22
-rw-r--r--src/nvim/message.c2
-rw-r--r--src/nvim/screen.c2
5 files changed, 16 insertions, 16 deletions
diff --git a/src/nvim/api/vim.c b/src/nvim/api/vim.c
index 59f4721da2..f07bfb196e 100644
--- a/src/nvim/api/vim.c
+++ b/src/nvim/api/vim.c
@@ -90,7 +90,7 @@ Integer vim_strwidth(String str, Error *err)
}
char *buf = xstrndup(str.data, str.size);
- Integer rv = mb_string2cells((char_u *)buf, -1);
+ Integer rv = (Integer) mb_string2cells((char_u *) buf);
free(buf);
return rv;
}
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index 31070c1118..c209f5c4af 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -13696,9 +13696,7 @@ static void f_strwidth(typval_T *argvars, typval_T *rettv)
{
char_u *s = get_tv_string(&argvars[0]);
- rettv->vval.v_number = (varnumber_T)(
- mb_string2cells(s, -1)
- );
+ rettv->vval.v_number = (varnumber_T) mb_string2cells(s);
}
/*
diff --git a/src/nvim/mbyte.c b/src/nvim/mbyte.c
index 8a669b0bc8..899b94e0fb 100644
--- a/src/nvim/mbyte.c
+++ b/src/nvim/mbyte.c
@@ -1305,17 +1305,19 @@ static int dbcs_char2cells(int c)
return MB_BYTE2LEN((unsigned)c >> 8);
}
-/*
- * Return the number of cells occupied by string "p".
- * Stop at a NUL character. When "len" >= 0 stop at character "p[len]".
- */
-int mb_string2cells(const char_u *p, int len)
+/// Calculate the number of cells occupied by string `str`.
+///
+/// @param str The source string, may not be NULL, must be a NUL-terminated
+/// string.
+/// @return The number of cells occupied by string `str`
+size_t mb_string2cells(const char_u *str)
{
- int i;
- int clen = 0;
+ size_t clen = 0;
+
+ for (const char_u *p = str; *p != NUL; p += (*mb_ptr2len)(p)) {
+ clen += (*mb_ptr2cells)(p);
+ }
- for (i = 0; (len < 0 || i < len) && p[i] != NUL; i += (*mb_ptr2len)(p + i))
- clen += (*mb_ptr2cells)(p + i);
return clen;
}
@@ -2953,7 +2955,7 @@ int utf_head_off(const char_u *base, const char_u *p)
for (q = p;; --q) {
/* Move s to the last byte of this char. */
const char_u *s;
- for (s = q; (s[1] & 0xc0) == 0x80; ++s);
+ for (s = q; (s[1] & 0xc0) == 0x80; ++s) {}
/* Move q to the first byte of this char. */
while (q > base && (*q & 0xc0) == 0x80)
diff --git a/src/nvim/message.c b/src/nvim/message.c
index 41a2345171..96be3bb17d 100644
--- a/src/nvim/message.c
+++ b/src/nvim/message.c
@@ -3352,7 +3352,7 @@ int vim_vsnprintf(char *str, size_t str_m, char *fmt, va_list ap, typval_T *tvs)
if (fmt_spec == 'S') {
if (min_field_width != 0)
min_field_width += STRLEN(str_arg)
- - mb_string2cells((char_u *)str_arg, -1);
+ - mb_string2cells((char_u *) str_arg);
if (precision) {
char_u *p1 = (char_u *)str_arg;
size_t i;
diff --git a/src/nvim/screen.c b/src/nvim/screen.c
index d36ce6ca2b..18b1797c36 100644
--- a/src/nvim/screen.c
+++ b/src/nvim/screen.c
@@ -4834,7 +4834,7 @@ void win_redr_status(win_T *wp)
int clen = 0, i;
/* Count total number of display cells. */
- clen = mb_string2cells(p, -1);
+ clen = (int) mb_string2cells(p);
/* Find first character that will fit.
* Going from start to end is much faster for DBCS. */