patch 8.2.2606: strchars() defaults to counting composing characters
Problem: strchars() defaults to counting composing characters.
Solution: Add strcharlen() which ignores composing characters.
diff --git a/src/evalfunc.c b/src/evalfunc.c
index 29bbe8a..34369d7 100644
--- a/src/evalfunc.c
+++ b/src/evalfunc.c
@@ -223,6 +223,7 @@
#endif
static void f_str2list(typval_T *argvars, typval_T *rettv);
static void f_str2nr(typval_T *argvars, typval_T *rettv);
+static void f_strcharlen(typval_T *argvars, typval_T *rettv);
static void f_strchars(typval_T *argvars, typval_T *rettv);
static void f_strgetchar(typval_T *argvars, typval_T *rettv);
static void f_stridx(typval_T *argvars, typval_T *rettv);
@@ -1572,6 +1573,8 @@
ret_list_number, f_str2list},
{"str2nr", 1, 3, FEARG_1, arg3_string_nr_bool,
ret_number, f_str2nr},
+ {"strcharlen", 1, 1, FEARG_1, NULL,
+ ret_number, f_strcharlen},
{"strcharpart", 2, 3, FEARG_1, NULL,
ret_string, f_strcharpart},
{"strchars", 1, 2, FEARG_1, NULL,
@@ -9236,31 +9239,45 @@
tv_get_string(&argvars[0])));
}
+ static void
+strchar_common(typval_T *argvars, typval_T *rettv, int skipcc)
+{
+ char_u *s = tv_get_string(&argvars[0]);
+ varnumber_T len = 0;
+ int (*func_mb_ptr2char_adv)(char_u **pp);
+
+ func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv;
+ while (*s != NUL)
+ {
+ func_mb_ptr2char_adv(&s);
+ ++len;
+ }
+ rettv->vval.v_number = len;
+}
+
+/*
+ * "strcharlen()" function
+ */
+ static void
+f_strcharlen(typval_T *argvars, typval_T *rettv)
+{
+ strchar_common(argvars, rettv, TRUE);
+}
+
/*
* "strchars()" function
*/
static void
f_strchars(typval_T *argvars, typval_T *rettv)
{
- char_u *s = tv_get_string(&argvars[0]);
varnumber_T skipcc = FALSE;
- varnumber_T len = 0;
- int (*func_mb_ptr2char_adv)(char_u **pp);
if (argvars[1].v_type != VAR_UNKNOWN)
skipcc = tv_get_bool(&argvars[1]);
if (skipcc < 0 || skipcc > 1)
semsg(_(e_using_number_as_bool_nr), skipcc);
else
- {
- func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv;
- while (*s != NUL)
- {
- func_mb_ptr2char_adv(&s);
- ++len;
- }
- rettv->vval.v_number = len;
- }
+ strchar_common(argvars, rettv, skipcc);
}
/*