From: Bram Moolenaar Date: Tue, 13 May 2014 14:44:29 +0000 (+0200) Subject: updated for version 7.4.290 X-Git-Tag: v7.4.290 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=9c235069b237caed426eff14ce91df46bc69e234;p=vim updated for version 7.4.290 Problem: A non-greedy match followed by a branch is too greedy. (Ingo Karkat) Solution: Add NFA_MATCH when it is already in the state list if the position differs. --- diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index d855df33b..3873d9ab2 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -4324,8 +4324,10 @@ addstate(l, state, subs_arg, pim, off) { /* This state is already in the list, don't add it again, * unless it is an MOPEN that is used for a backreference or - * when there is a PIM. */ - if (!nfa_has_backref && pim == NULL && !l->has_pim) + * when there is a PIM. For NFA_MATCH check the position, + * lower position is preferred. */ + if (!nfa_has_backref && pim == NULL && !l->has_pim + && state->c != NFA_MATCH) { skip_add: #ifdef ENABLE_LOG diff --git a/src/testdir/test64.in b/src/testdir/test64.in index e3f5d82a4..2abdcd1c0 100644 --- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -238,7 +238,11 @@ STARTTEST :call add(tl, [2, '\vx(.{-,8})yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz','ayxa','xayzxayz']) :call add(tl, [2, '\vx(.*)yz(.*)','xayxayzxayzxayz','xayxayzxayzxayz', 'ayxayzxayzxa','']) :call add(tl, [2, '\v(a{1,2}){-2,3}','aaaaaaa','aaaa','aa']) -:call add(tl, [2, '\v(a{-1,3})+','aa','aa','a']) +:call add(tl, [2, '\v(a{-1,3})+', 'aa', 'aa', 'a']) +:call add(tl, [2, '^\s\{-}\zs\( x\|x$\)', ' x', ' x', ' x']) +:call add(tl, [2, '^\s\{-}\zs\(x\| x$\)', ' x', ' x', ' x']) +:call add(tl, [2, '^\s\{-}\ze\(x\| x$\)', ' x', '', ' x']) +:call add(tl, [2, '^\(\s\{-}\)\(x\| x$\)', ' x', ' x', '', ' x']) :" :" Test Character classes :call add(tl, [2, '\d\+e\d\d','test 10e23 fd','10e23']) @@ -462,15 +466,15 @@ STARTTEST : try : let l = matchlist(text, pat) : catch -: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"' +: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", caused an exception: \"' . v:exception . '\"' : endtry :" check the match itself : if len(l) == 0 && len(t) > matchidx -: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"' +: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", did not match, expected: \"' . t[matchidx] . '\"' : elseif len(l) > 0 && len(t) == matchidx -: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match' +: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected no match' : elseif len(t) > matchidx && l[0] != t[matchidx] -: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"' +: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", match: \"' . l[0] . '\", expected: \"' . t[matchidx] . '\"' : else : $put ='OK ' . engine . ' - ' . pat : endif @@ -483,7 +487,7 @@ STARTTEST : let e = t[matchidx + i] : endif : if l[i] != e -: $put ='ERROR: pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' +: $put ='ERROR ' . engine . ': pat: \"' . pat . '\", text: \"' . text . '\", submatch ' . i . ': \"' . l[i] . '\", expected: \"' . e . '\"' : endif : endfor : unlet i diff --git a/src/testdir/test64.ok b/src/testdir/test64.ok index 9fb6c60b9..e7d173141 100644 --- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -533,6 +533,18 @@ OK 2 - \v(a{1,2}){-2,3} OK 0 - \v(a{-1,3})+ OK 1 - \v(a{-1,3})+ OK 2 - \v(a{-1,3})+ +OK 0 - ^\s\{-}\zs\( x\|x$\) +OK 1 - ^\s\{-}\zs\( x\|x$\) +OK 2 - ^\s\{-}\zs\( x\|x$\) +OK 0 - ^\s\{-}\zs\(x\| x$\) +OK 1 - ^\s\{-}\zs\(x\| x$\) +OK 2 - ^\s\{-}\zs\(x\| x$\) +OK 0 - ^\s\{-}\ze\(x\| x$\) +OK 1 - ^\s\{-}\ze\(x\| x$\) +OK 2 - ^\s\{-}\ze\(x\| x$\) +OK 0 - ^\(\s\{-}\)\(x\| x$\) +OK 1 - ^\(\s\{-}\)\(x\| x$\) +OK 2 - ^\(\s\{-}\)\(x\| x$\) OK 0 - \d\+e\d\d OK 1 - \d\+e\d\d OK 2 - \d\+e\d\d diff --git a/src/version.c b/src/version.c index 81ce691f9..fdda82c1f 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 290, /**/ 289, /**/