To: vim_dev@googlegroups.com Subject: Patch 7.3.1196 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.3.1196 Problem: Old regexp engine does not match pattern with backref correctly. (Dominique Pelle) Solution: Fix setting status. Test multi-line patterns better. Files: src/regexp.c, src/testdir/test64.in, src/testdir/test64.ok *** ../vim-7.3.1195/src/regexp.c 2013-06-14 22:48:50.000000000 +0200 --- src/regexp.c 2013-06-15 14:09:21.000000000 +0200 *************** *** 5021,5032 **** { /* Messy situation: Need to compare between two * lines. */ ! status = match_with_backref( reg_startpos[no].lnum, reg_startpos[no].col, reg_endpos[no].lnum, reg_endpos[no].col, &len); } } } --- 5021,5035 ---- { /* Messy situation: Need to compare between two * lines. */ ! 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; } } } *** ../vim-7.3.1195/src/testdir/test64.in 2013-06-14 20:31:20.000000000 +0200 --- src/testdir/test64.in 2013-06-15 15:05:03.000000000 +0200 *************** *** 377,382 **** --- 377,383 ---- :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 ! :" 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:" :" :" Check that using a pattern on two lines doesn't get messed up by using :" matchstr() with \ze in between. --- 454,501 ---- :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 \> ! :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,497 **** :.+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 --- 506,511 ---- *************** *** 553,584 **** :/\%#=1^Results/,$wq! test.out ENDTEST - Find this: - localnet/192.168.0.1 - Substitute here: Ta 5 Ac 7 - 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: asdfasdTa 5 Ac 7 - ghi - - c - - ./Dir1/Dir2/file1.txt xxstart3 --- 913,937 ---- 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} ! 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 Ta 5 Ac 7 xxstart3 *** ../vim-7.3.1195/src/version.c 2013-06-14 22:48:50.000000000 +0200 --- src/version.c 2013-06-15 14:12:46.000000000 +0200 *************** *** 730,731 **** --- 730,733 ---- { /* Add new patch number below this line */ + /**/ + 1196, /**/ -- hundred-and-one symptoms of being an internet addict: 213. Your kids start referring to you as "that guy in front of the monitor." /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///