]> granicus.if.org Git - vim/commitdiff
patch 8.0.0794: checking translations fails with multiple NL v8.0.0794
authorBram Moolenaar <Bram@vim.org>
Fri, 28 Jul 2017 14:46:57 +0000 (16:46 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 28 Jul 2017 14:46:57 +0000 (16:46 +0200)
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.

runtime/doc/eval.txt
src/evalfunc.c
src/po/check.vim
src/testdir/test_functions.vim
src/version.c

index 84c5c0b393ec26ee3f4c50fe7e3c15463ae61630..ef02e6597ce8493b99b712235b79c9d007a29df5 100644 (file)
@@ -1,4 +1,4 @@
-*eval.txt*     For Vim version 8.0.  Last change: 2017 Jul 22
+*eval.txt*     For Vim version 8.0.  Last change: 2017 Jul 28
 
 
                  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -3255,11 +3255,16 @@ cosh({expr})                                            *cosh()*
                
 count({comp}, {expr} [, {ic} [, {start}]])                     *count()*
                Return the number of times an item with value {expr} appears
-               in |List| or |Dictionary| {comp}.
+               in |String|, |List| or |Dictionary| {comp}.
+
                If {start} is given then start with the item with this index.
                {start} can only be used with a |List|.
+
                When {ic} is given and it's |TRUE| then case is ignored.
 
+               When {comp} is a string then the number of not overlapping
+               occurences of {expr} is returned.
+
 
                                                        *cscope_connection()*
 cscope_connection([{num} , {dbpath} [, {prepend}]])
index 33307e5270425c348fa489952deaacddd78f6eb2..30006e3e2456d8dc90cb6ade9307ae20ee13688d 100644 (file)
@@ -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));
            }
index ba98ae7aac574d2d2f52237d45abf90562cb845a..3bcbef395e5bd9c06df7a477f1990d6a5f07868e 100644 (file)
@@ -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
index f0f656ac8593ca59f7ba421d729d0437131e19a1..ac47ea1daf1ed4459a4ed73a4e1773c7edf9c758 100644 (file)
@@ -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()
index 5fc0dbf914ef6d7f29a5684200af7592f2215ec7..312ec4ec4aa8094c3afd8d532d73b1cc243ca66b 100644 (file)
@@ -769,6 +769,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    794,
 /**/
     793,
 /**/