@@ -223,6 +223,7 @@ static void f_str2float(typval_T *argvars, typval_T *rettv);
223223#endif
224224static void f_str2list (typval_T * argvars , typval_T * rettv );
225225static void f_str2nr (typval_T * argvars , typval_T * rettv );
226+ static void f_strcharlen (typval_T * argvars , typval_T * rettv );
226227static void f_strchars (typval_T * argvars , typval_T * rettv );
227228static void f_strgetchar (typval_T * argvars , typval_T * rettv );
228229static void f_stridx (typval_T * argvars , typval_T * rettv );
@@ -1572,6 +1573,8 @@ static funcentry_T global_functions[] =
15721573 ret_list_number , f_str2list },
15731574 {"str2nr" , 1 , 3 , FEARG_1 , arg3_string_nr_bool ,
15741575 ret_number , f_str2nr },
1576+ {"strcharlen" , 1 , 1 , FEARG_1 , NULL ,
1577+ ret_number , f_strcharlen },
15751578 {"strcharpart" , 2 , 3 , FEARG_1 , NULL ,
15761579 ret_string , f_strcharpart },
15771580 {"strchars" , 1 , 2 , FEARG_1 , NULL ,
@@ -9236,31 +9239,45 @@ f_strlen(typval_T *argvars, typval_T *rettv)
92369239 tv_get_string (& argvars [0 ])));
92379240}
92389241
9242+ static void
9243+ strchar_common (typval_T * argvars , typval_T * rettv , int skipcc )
9244+ {
9245+ char_u * s = tv_get_string (& argvars [0 ]);
9246+ varnumber_T len = 0 ;
9247+ int (* func_mb_ptr2char_adv )(char_u * * pp );
9248+
9249+ func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv ;
9250+ while (* s != NUL )
9251+ {
9252+ func_mb_ptr2char_adv (& s );
9253+ ++ len ;
9254+ }
9255+ rettv -> vval .v_number = len ;
9256+ }
9257+
9258+ /*
9259+ * "strcharlen()" function
9260+ */
9261+ static void
9262+ f_strcharlen (typval_T * argvars , typval_T * rettv )
9263+ {
9264+ strchar_common (argvars , rettv , TRUE);
9265+ }
9266+
92399267/*
92409268 * "strchars()" function
92419269 */
92429270 static void
92439271f_strchars (typval_T * argvars , typval_T * rettv )
92449272{
9245- char_u * s = tv_get_string (& argvars [0 ]);
92469273 varnumber_T skipcc = FALSE;
9247- varnumber_T len = 0 ;
9248- int (* func_mb_ptr2char_adv )(char_u * * pp );
92499274
92509275 if (argvars [1 ].v_type != VAR_UNKNOWN )
92519276 skipcc = tv_get_bool (& argvars [1 ]);
92529277 if (skipcc < 0 || skipcc > 1 )
92539278 semsg (_ (e_using_number_as_bool_nr ), skipcc );
92549279 else
9255- {
9256- func_mb_ptr2char_adv = skipcc ? mb_ptr2char_adv : mb_cptr2char_adv ;
9257- while (* s != NUL )
9258- {
9259- func_mb_ptr2char_adv (& s );
9260- ++ len ;
9261- }
9262- rettv -> vval .v_number = len ;
9263- }
9280+ strchar_common (argvars , rettv , skipcc );
92649281}
92659282
92669283/*
0 commit comments