@@ -2314,8 +2314,45 @@ f_count(typval_T *argvars, typval_T *rettv)
23142314{
23152315 long n = 0 ;
23162316 int ic = FALSE;
2317+ int error = FALSE;
23172318
2318- if (argvars [0 ].v_type == VAR_LIST )
2319+ if (argvars [2 ].v_type != VAR_UNKNOWN )
2320+ ic = (int )get_tv_number_chk (& argvars [2 ], & error );
2321+
2322+ if (argvars [0 ].v_type == VAR_STRING )
2323+ {
2324+ char_u * expr = get_tv_string_chk (& argvars [1 ]);
2325+ char_u * p = argvars [0 ].vval .v_string ;
2326+ char_u * next ;
2327+
2328+ if (!error && expr != NULL && p != NULL )
2329+ {
2330+ if (ic )
2331+ {
2332+ size_t len = STRLEN (expr );
2333+
2334+ while (* p != NUL )
2335+ {
2336+ if (MB_STRNICMP (p , expr , len ) == 0 )
2337+ {
2338+ ++ n ;
2339+ p += len ;
2340+ }
2341+ else
2342+ MB_PTR_ADV (p );
2343+ }
2344+ }
2345+ else
2346+ while ((next = (char_u * )strstr ((char * )p , (char * )expr ))
2347+ != NULL )
2348+ {
2349+ ++ n ;
2350+ p = next + STRLEN (expr );
2351+ }
2352+ }
2353+
2354+ }
2355+ else if (argvars [0 ].v_type == VAR_LIST )
23192356 {
23202357 listitem_T * li ;
23212358 list_T * l ;
@@ -2326,9 +2363,6 @@ f_count(typval_T *argvars, typval_T *rettv)
23262363 li = l -> lv_first ;
23272364 if (argvars [2 ].v_type != VAR_UNKNOWN )
23282365 {
2329- int error = FALSE;
2330-
2331- ic = (int )get_tv_number_chk (& argvars [2 ], & error );
23322366 if (argvars [3 ].v_type != VAR_UNKNOWN )
23332367 {
23342368 idx = (long )get_tv_number_chk (& argvars [3 ], & error );
@@ -2356,11 +2390,8 @@ f_count(typval_T *argvars, typval_T *rettv)
23562390
23572391 if ((d = argvars [0 ].vval .v_dict ) != NULL )
23582392 {
2359- int error = FALSE;
2360-
23612393 if (argvars [2 ].v_type != VAR_UNKNOWN )
23622394 {
2363- ic = (int )get_tv_number_chk (& argvars [2 ], & error );
23642395 if (argvars [3 ].v_type != VAR_UNKNOWN )
23652396 EMSG (_ (e_invarg ));
23662397 }
0 commit comments