Mercurial > vim
diff src/evalfunc.c @ 11828:5a07a3ff56c1 v8.0.0794
patch 8.0.0794: checking translations fails with multiple NL
commit https://github.com/vim/vim/commit/9966b21a57277986217aa28237d6c247ebd060d7
Author: Bram Moolenaar <Bram@vim.org>
Date: Fri Jul 28 16:46:57 2017 +0200
patch 8.0.0794: checking translations fails with multiple NL
Problem: The script to check translations fails if there is more than one
NL in one line.
Solution: Count the number of NL characters. Make count() accept a string.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Fri, 28 Jul 2017 17:00:05 +0200 |
parents | ce434212d682 |
children | 1c65cad8b967 |
line wrap: on
line diff
--- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2314,8 +2314,45 @@ f_count(typval_T *argvars, typval_T *ret { long n = 0; int ic = FALSE; - - if (argvars[0].v_type == VAR_LIST) + int error = FALSE; + + if (argvars[2].v_type != VAR_UNKNOWN) + ic = (int)get_tv_number_chk(&argvars[2], &error); + + if (argvars[0].v_type == VAR_STRING) + { + char_u *expr = get_tv_string_chk(&argvars[1]); + char_u *p = argvars[0].vval.v_string; + char_u *next; + + if (!error && expr != NULL && p != NULL) + { + if (ic) + { + size_t len = STRLEN(expr); + + while (*p != NUL) + { + if (MB_STRNICMP(p, expr, len) == 0) + { + ++n; + p += len; + } + else + MB_PTR_ADV(p); + } + } + else + 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; @@ -2326,9 +2363,6 @@ f_count(typval_T *argvars, typval_T *ret li = l->lv_first; if (argvars[2].v_type != VAR_UNKNOWN) { - int error = FALSE; - - ic = (int)get_tv_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) { idx = (long)get_tv_number_chk(&argvars[3], &error); @@ -2356,11 +2390,8 @@ f_count(typval_T *argvars, typval_T *ret if ((d = argvars[0].vval.v_dict) != NULL) { - int error = FALSE; - if (argvars[2].v_type != VAR_UNKNOWN) { - ic = (int)get_tv_number_chk(&argvars[2], &error); if (argvars[3].v_type != VAR_UNKNOWN) EMSG(_(e_invarg)); }