diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2018-07-29 02:00:48 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-29 02:00:48 +0200 |
commit | befc7de26f2907fdf0c61b883c68c7a64432aa03 (patch) | |
tree | 3fa1225c46ed72b4e6d67772ef07468ea2d2cf1b /src/nvim/eval.c | |
parent | a4494b7cbc8b33932f53951d920aa3826b51935a (diff) | |
parent | 7c7701af1279996c999507750d4beb79ee0f03e0 (diff) | |
download | rneovim-befc7de26f2907fdf0c61b883c68c7a64432aa03.tar.gz rneovim-befc7de26f2907fdf0c61b883c68c7a64432aa03.tar.bz2 rneovim-befc7de26f2907fdf0c61b883c68c7a64432aa03.zip |
Merge pull request #8770 from janlazo/vim-8.0.0726
Diffstat (limited to 'src/nvim/eval.c')
-rw-r--r-- | src/nvim/eval.c | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 36662b2a39..1ba516a29c 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -7592,9 +7592,38 @@ static void f_copy(typval_T *argvars, typval_T *rettv, FunPtr fptr) static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr) { long n = 0; - int ic = FALSE; + int ic = 0; + bool error = false; - if (argvars[0].v_type == VAR_LIST) { + if (argvars[2].v_type != VAR_UNKNOWN) { + ic = tv_get_number_chk(&argvars[2], &error); + } + + if (argvars[0].v_type == VAR_STRING) { + const char_u *expr = (char_u *)tv_get_string_chk(&argvars[1]); + const char_u *p = argvars[0].vval.v_string; + + if (!error && expr != NULL && p != NULL) { + if (ic) { + const size_t len = STRLEN(expr); + + while (*p != NUL) { + if (mb_strnicmp(p, expr, len) == 0) { + n++; + p += len; + } else { + MB_PTR_ADV(p); + } + } + } else { + char_u *next; + while ((next = (char_u *)strstr((char *)p, (char *)expr)) != NULL) { + n++; + p = next + STRLEN(expr); + } + } + } + } else if (argvars[0].v_type == VAR_LIST) { listitem_T *li; list_T *l; long idx; @@ -7602,9 +7631,6 @@ static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr) if ((l = argvars[0].vval.v_list) != NULL) { li = tv_list_first(l); if (argvars[2].v_type != VAR_UNKNOWN) { - bool error = false; - - ic = tv_get_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) { idx = tv_get_number_chk(&argvars[3], &error); if (!error) { @@ -7630,10 +7656,7 @@ static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr) hashitem_T *hi; if ((d = argvars[0].vval.v_dict) != NULL) { - bool error = false; - if (argvars[2].v_type != VAR_UNKNOWN) { - ic = tv_get_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) { EMSG(_(e_invarg)); } @@ -7649,8 +7672,9 @@ static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr) } } } - } else + } else { EMSG2(_(e_listdictarg), "count()"); + } rettv->vval.v_number = n; } |