diff options
author | Bram Moolenaar <Bram@vim.org> | 2017-07-28 16:46:57 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2017-07-28 16:46:57 +0200 |
commit | 9966b21a57277986217aa28237d6c247ebd060d7 (patch) | |
tree | 0123999d430636663fe3d21f0ee0c9eb20e55331 /src | |
parent | 93723a4ef18f260b82d89759db2f1eeae730c4ec (diff) |
patch 8.0.0794: checking translations fails with multiple NLv8.0.0794
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.
Diffstat (limited to 'src')
-rw-r--r-- | src/evalfunc.c | 45 | ||||
-rw-r--r-- | src/po/check.vim | 8 | ||||
-rw-r--r-- | src/testdir/test_functions.vim | 8 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 50 insertions, 13 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 33307e5270..30006e3e24 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -2314,8 +2314,45 @@ f_count(typval_T *argvars, typval_T *rettv) { long n = 0; int ic = FALSE; + int error = FALSE; - if (argvars[0].v_type == VAR_LIST) + 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 *rettv) 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 *rettv) 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)); } diff --git a/src/po/check.vim b/src/po/check.vim index ba98ae7aac..3bcbef395e 100644 --- a/src/po/check.vim +++ b/src/po/check.vim @@ -114,14 +114,12 @@ endif func! CountNl(first, last) let nl = 0 for lnum in range(a:first, a:last) - if getline(lnum) =~ '\\n' - let nl += 1 - endif + let nl += count(getline(lnum), "\n") endfor return nl endfunc -" Check that the \n at the end of the msid line is also present in the msgstr +" Check that the \n at the end of the msgid line is also present in the msgstr " line. Skip over the header. /^"MIME-Version: while 1 @@ -138,7 +136,7 @@ while 1 let transcount = CountNl(strlnum, end - 1) " Allow for a few more or less line breaks when there are 2 or more if origcount != transcount && (origcount <= 2 || transcount <= 2) - echomsg 'Mismatching "\\n" in line ' . line('.') + echomsg 'Mismatching "\n" in line ' . line('.') if error == 0 let error = lnum endif diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index f0f656ac85..ac47ea1daf 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -635,7 +635,13 @@ func Test_count() call assert_equal(0, count(d, 'c', 1)) call assert_fails('call count(d, "a", 0, 1)', 'E474:') - call assert_fails('call count("a", "a")', 'E712:') + + call assert_equal(0, count("foo", "bar")) + call assert_equal(1, count("foo", "oo")) + call assert_equal(2, count("foo", "o")) + call assert_equal(0, count("foo", "O")) + call assert_equal(2, count("foo", "O", 1)) + call assert_equal(2, count("fooooo", "oo")) endfunc func Test_changenr() diff --git a/src/version.c b/src/version.c index 5fc0dbf914..312ec4ec4a 100644 --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 794, +/**/ 793, /**/ 792, |