vim-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.
9966b21a57
This commit is contained in:
Jan Edmund Lazo
2018-07-23 11:27:16 -04:00
parent d551a49958
commit 1ed5abfe88
4 changed files with 49 additions and 16 deletions

View File

@@ -2990,11 +2990,16 @@ cosh({expr}) *cosh()*
count({comp}, {expr} [, {ic} [, {start}]]) *count()* count({comp}, {expr} [, {ic} [, {start}]]) *count()*
Return the number of times an item with value {expr} appears 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. If {start} is given then start with the item with this index.
{start} can only be used with a |List|. {start} can only be used with a |List|.
When {ic} is given and it's |TRUE| then case is ignored. 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()*
cscope_connection([{num} , {dbpath} [, {prepend}]]) cscope_connection([{num} , {dbpath} [, {prepend}]])

View File

@@ -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) static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr)
{ {
long n = 0; 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; listitem_T *li;
list_T *l; list_T *l;
long idx; 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) { if ((l = argvars[0].vval.v_list) != NULL) {
li = tv_list_first(l); li = tv_list_first(l);
if (argvars[2].v_type != VAR_UNKNOWN) { 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) { if (argvars[3].v_type != VAR_UNKNOWN) {
idx = tv_get_number_chk(&argvars[3], &error); idx = tv_get_number_chk(&argvars[3], &error);
if (!error) { if (!error) {
@@ -7630,10 +7656,7 @@ static void f_count(typval_T *argvars, typval_T *rettv, FunPtr fptr)
hashitem_T *hi; hashitem_T *hi;
if ((d = argvars[0].vval.v_dict) != NULL) { if ((d = argvars[0].vval.v_dict) != NULL) {
bool error = false;
if (argvars[2].v_type != VAR_UNKNOWN) { if (argvars[2].v_type != VAR_UNKNOWN) {
ic = tv_get_number_chk(&argvars[2], &error);
if (argvars[3].v_type != VAR_UNKNOWN) { if (argvars[3].v_type != VAR_UNKNOWN) {
EMSG(_(e_invarg)); 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()"); EMSG2(_(e_listdictarg), "count()");
}
rettv->vval.v_number = n; rettv->vval.v_number = n;
} }

View File

@@ -117,14 +117,12 @@ endif
func! CountNl(first, last) func! CountNl(first, last)
let nl = 0 let nl = 0
for lnum in range(a:first, a:last) for lnum in range(a:first, a:last)
if getline(lnum) =~ '\\n' let nl += count(getline(lnum), "\n")
let nl += 1
endif
endfor endfor
return nl return nl
endfunc 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. " line. Skip over the header.
/^"MIME-Version: /^"MIME-Version:
while 1 while 1
@@ -141,7 +139,7 @@ while 1
let transcount = CountNl(strlnum, end - 1) let transcount = CountNl(strlnum, end - 1)
" Allow for a few more or less line breaks when there are 2 or more " Allow for a few more or less line breaks when there are 2 or more
if origcount != transcount && (origcount <= 2 || transcount <= 2) if origcount != transcount && (origcount <= 2 || transcount <= 2)
echomsg 'Mismatching "\\n" in line ' . line('.') echomsg 'Mismatching "\n" in line ' . line('.')
if error == 0 if error == 0
let error = lnum let error = lnum
endif endif

View File

@@ -680,7 +680,13 @@ func Test_count()
call assert_equal(0, count(d, 'c', 1)) call assert_equal(0, count(d, 'c', 1))
call assert_fails('call count(d, "a", 0, 1)', 'E474:') 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 endfunc
func Test_changenr() func Test_changenr()