@@ -47,6 +47,7 @@ static void f_ceil(typval_T *argvars, typval_T *rettv);
4747#endif
4848static void f_changenr (typval_T * argvars , typval_T * rettv );
4949static void f_char2nr (typval_T * argvars , typval_T * rettv );
50+ static void f_charidx (typval_T * argvars , typval_T * rettv );
5051static void f_col (typval_T * argvars , typval_T * rettv );
5152static void f_confirm (typval_T * argvars , typval_T * rettv );
5253static void f_copy (typval_T * argvars , typval_T * rettv );
@@ -789,6 +790,8 @@ static funcentry_T global_functions[] =
789790 ret_number , f_char2nr },
790791 {"charclass" , 1 , 1 , FEARG_1 , NULL ,
791792 ret_number , f_charclass },
793+ {"charidx" , 2 , 3 , FEARG_1 , NULL ,
794+ ret_number , f_charidx },
792795 {"chdir" , 1 , 1 , FEARG_1 , NULL ,
793796 ret_string , f_chdir },
794797 {"cindent" , 1 , 1 , FEARG_1 , NULL ,
@@ -2420,6 +2423,57 @@ f_char2nr(typval_T *argvars, typval_T *rettv)
24202423 rettv -> vval .v_number = tv_get_string (& argvars [0 ])[0 ];
24212424}
24222425
2426+ /*
2427+ * "charidx()" function
2428+ */
2429+ static void
2430+ f_charidx (typval_T * argvars , typval_T * rettv )
2431+ {
2432+ char_u * str ;
2433+ varnumber_T idx ;
2434+ int countcc = FALSE;
2435+ char_u * p ;
2436+ int len ;
2437+ int (* ptr2len )(char_u * );
2438+
2439+ rettv -> vval .v_number = -1 ;
2440+
2441+ if (argvars [0 ].v_type != VAR_STRING || argvars [1 ].v_type != VAR_NUMBER
2442+ || (argvars [2 ].v_type != VAR_UNKNOWN
2443+ && argvars [2 ].v_type != VAR_NUMBER ))
2444+ {
2445+ emsg (_ (e_invarg ));
2446+ return ;
2447+ }
2448+
2449+ str = tv_get_string_chk (& argvars [0 ]);
2450+ idx = tv_get_number_chk (& argvars [1 ], NULL );
2451+ if (str == NULL || idx < 0 )
2452+ return ;
2453+
2454+ if (argvars [2 ].v_type != VAR_UNKNOWN )
2455+ countcc = (int )tv_get_bool (& argvars [2 ]);
2456+ if (countcc < 0 || countcc > 1 )
2457+ {
2458+ semsg (_ (e_using_number_as_bool_nr ), countcc );
2459+ return ;
2460+ }
2461+
2462+ if (enc_utf8 && countcc )
2463+ ptr2len = utf_ptr2len ;
2464+ else
2465+ ptr2len = mb_ptr2len ;
2466+
2467+ for (p = str , len = 0 ; p <= str + idx ; len ++ )
2468+ {
2469+ if (* p == NUL )
2470+ return ;
2471+ p += ptr2len (p );
2472+ }
2473+
2474+ rettv -> vval .v_number = len > 0 ? len - 1 : 0 ;
2475+ }
2476+
24232477 win_T *
24242478get_optional_window (typval_T * argvars , int idx )
24252479{
0 commit comments