diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-06-15 15:09:50 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-06-15 15:09:50 +0200 |
commit | 141f6bb34124872d8676066e021bf899d4023c23 (patch) | |
tree | 799f4523cac94dff9e470b493457310376999a82 | |
parent | 4cff8faf0567209ab95b39b9cf7f3d555162392e (diff) | |
download | vim-git-141f6bb34124872d8676066e021bf899d4023c23.tar.gz |
updated for version 7.3.1196v7.3.1196
Problem: Old regexp engine does not match pattern with backref correctly.
(Dominique Pelle)
Solution: Fix setting status. Test multi-line patterns better.
-rw-r--r-- | src/regexp.c | 5 | ||||
-rw-r--r-- | src/testdir/test64.in | 92 | ||||
-rw-r--r-- | src/testdir/test64.ok | 27 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 67 insertions, 59 deletions
diff --git a/src/regexp.c b/src/regexp.c index 0798f028b..fdcd9f41e 100644 --- a/src/regexp.c +++ b/src/regexp.c @@ -5021,12 +5021,15 @@ regmatch(scan) { /* Messy situation: Need to compare between two * lines. */ - status = match_with_backref( + int r = match_with_backref( reg_startpos[no].lnum, reg_startpos[no].col, reg_endpos[no].lnum, reg_endpos[no].col, &len); + + if (r != RA_MATCH) + status = r; } } } diff --git a/src/testdir/test64.in b/src/testdir/test64.in index fe61ed3f2..ad11c3c49 100644 --- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -377,6 +377,7 @@ STARTTEST :call add(tl, [2, '\(\i\+\) \1', 'xgoo goox', 'goo goo', 'goo']) :call add(tl, [2, '\(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9', 'xabcddefghiabcddefghix', 'abcddefghiabcddefghi', 'a', 'b', 'c', 'dd', 'e', 'f', 'g', 'h', 'i']) :call add(tl, [2, '\(\d*\)a \1b', ' a b ', 'a b', '']) +:call add(tl, [2, '^.\(.\).\_..\1.', "aaa\naaa\nb", "aaa\naaa", 'a']) :" :"""" Look-behind with limit :call add(tl, [2, '<\@<=span.', 'xxspanxx<spanyyy', 'spany']) @@ -453,17 +454,48 @@ STARTTEST :endfor :unlet t tl e l :" +:"""""" multi-line tests +:let tl = [] +:" +:"""" back references +:call add(tl, [2, '^.\(.\).\_..\1.', ['aaa', 'aaa', 'b'], ['XX', 'b']]) +:call add(tl, [2, '\v.*\/(.*)\n.*\/\1$', ['./Dir1/Dir2/zyxwvuts.txt', './Dir1/Dir2/abcdefgh.bat', '', './Dir1/Dir2/file1.txt', './OtherDir1/OtherDir2/file1.txt'], ['./Dir1/Dir2/zyxwvuts.txt', './Dir1/Dir2/abcdefgh.bat', '', 'XX']]) +:" +:"""" line breaks +:call add(tl, [2, '\S.*\nx', ['abc', 'def', 'ghi', 'xjk', 'lmn'], ['abc', 'def', 'XXjk', 'lmn']]) +:" :" Check that \_[0-9] matching EOL does not break a following \> -:" This only works on a buffer line, not with expression evaluation -/^Find this -/\%#=0\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> -y$Gop:" -/^Find this -/\%#=1\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> -y$Gop:" -/^Find this -/\%#=2\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> -y$Gop:" +:call add(tl, [2, '\<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\>', ['', 'localnet/192.168.0.1', ''], ['', 'localnet/XX', '']]) +:" +:" Check a pattern with a line break and ^ and $ +:call add(tl, [2, 'a\n^b$\n^c', ['a', 'b', 'c'], ['XX']]) +:" +:"""" Run the multi-line tests +:" +:$put ='multi-line tests' +:for t in tl +: let re = t[0] +: let pat = t[1] +: let before = t[2] +: let after = t[3] +: for engine in [0, 1, 2] +: if engine == 2 && re == 0 || engine == 1 && re ==1 +: continue +: endif +: let ®expengine = engine +: new +: call setline(1, before) +: exe '%s/' . pat . '/XX/' +: let result = getline(1, '$') +: q! +: if result != after +: $put ='ERROR: pat: \"' . pat . '\", text: \"' . string(before) . '\", expected: \"' . string(after) . '\", got: \"' . string(result) . '\"' +: else +: $put ='OK ' . engine . ' - ' . pat +: endif +: endfor +:endfor +:unlet t tl :" :" Check that using a pattern on two lines doesn't get messed up by using :" matchstr() with \ze in between. @@ -474,24 +506,6 @@ y$Gop:" :.+1,.+2yank Gop:" :" -:" Check a pattern with a line break matches in the right position. -/^Multiline -/\S.*\nx -:.yank -y$Gop:" -:" -:" Check a pattern with a line break and ^ and $ -/^Abc: -/a\n^b$\n^c/e -:.yank -Gop:" -:" -:" Check using a backref matching in a previous line -/^Backref: -/\v.*\/(.*)\n.*\/\1$ -:.yank -Gop:" -:" :" Check a pattern with a look beind crossing a line boundary /^Behind: /\(<\_[xy]\+\)\@3<=start @@ -553,32 +567,10 @@ yeGopA END:" :/\%#=1^Results/,$wq! test.out ENDTEST -Find this: -localnet/192.168.0.1 - Substitute here: <T="">Ta 5</Title> <T="">Ac 7</Title> -Multiline: -abc -def -ghi -xjk -lmn - -Abc: -a -b -c - -Backref: -./Dir1/Dir2/zyxwvuts.txt -./Dir1/Dir2/abcdefgh.bat - -./Dir1/Dir2/file1.txt -./OtherDir1/OtherDir2/file1.txt - Behind: asdfasd<yyy xxstart1 diff --git a/src/testdir/test64.ok b/src/testdir/test64.ok index fe14fbd3f..48694fb51 100644 --- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -857,6 +857,9 @@ OK 2 - \(a\)\(b\)\(c\)\(dd\)\(e\)\(f\)\(g\)\(h\)\(i\)\1\2\3\4\5\6\7\8\9 OK 0 - \(\d*\)a \1b OK 1 - \(\d*\)a \1b OK 2 - \(\d*\)a \1b +OK 0 - ^.\(.\).\_..\1. +OK 1 - ^.\(.\).\_..\1. +OK 2 - ^.\(.\).\_..\1. OK 0 - <\@<=span. OK 1 - <\@<=span. OK 2 - <\@<=span. @@ -910,17 +913,25 @@ OK 2 - \_[^a]\+ OK 0 - [0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12} OK 1 - [0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12} OK 2 - [0-9a-zA-Z]\{8}-\([0-9a-zA-Z]\{4}-\)\{3}[0-9a-zA-Z]\{12} -192.168.0.1 -192.168.0.1 -192.168.0.1 +multi-line tests +OK 0 - ^.\(.\).\_..\1. +OK 1 - ^.\(.\).\_..\1. +OK 2 - ^.\(.\).\_..\1. +OK 0 - \v.*\/(.*)\n.*\/\1$ +OK 1 - \v.*\/(.*)\n.*\/\1$ +OK 2 - \v.*\/(.*)\n.*\/\1$ +OK 0 - \S.*\nx +OK 1 - \S.*\nx +OK 2 - \S.*\nx +OK 0 - \<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> +OK 1 - \<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> +OK 2 - \<\(\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\.\)\{3\}\(25\_[0-5]\|2\_[0-4]\_[0-9]\|\_[01]\?\_[0-9]\_[0-9]\?\)\> +OK 0 - a\n^b$\n^c +OK 1 - a\n^b$\n^c +OK 2 - a\n^b$\n^c <T="5">Ta 5</Title> <T="7">Ac 7</Title> -ghi - -c - -./Dir1/Dir2/file1.txt xxstart3 diff --git a/src/version.c b/src/version.c index 1547d57dd..8fa7aace8 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1196, +/**/ 1195, /**/ 1194, |