To: vim_dev@googlegroups.com Subject: Patch 7.4.2354 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.4.2354 Problem: The example that explains nested backreferences does not work properly with the new regexp engine. (Harm te Hennepe) Solution: Also save the end position when adding a state. (closes #990) Files: src/regexp_nfa.c, src/testdir/test_regexp_latin.vim *** ../vim-7.4.2353/src/regexp_nfa.c 2016-08-29 22:48:12.165106045 +0200 --- src/regexp_nfa.c 2016-09-09 17:45:51.693549619 +0200 *************** *** 4354,4360 **** { int subidx; nfa_thread_T *thread; ! lpos_T save_lpos; int save_in_use; char_u *save_ptr; int i; --- 4354,4360 ---- { int subidx; nfa_thread_T *thread; ! struct multipos save_multipos; int save_in_use; char_u *save_ptr; int i; *************** *** 4572,4579 **** /* avoid compiler warnings */ save_ptr = NULL; ! save_lpos.lnum = 0; ! save_lpos.col = 0; /* Set the position (with "off" added) in the subexpression. Save * and restore it when it was in use. Otherwise fill any gap. */ --- 4572,4578 ---- /* avoid compiler warnings */ save_ptr = NULL; ! vim_memset(&save_multipos, 0, sizeof(save_multipos)); /* Set the position (with "off" added) in the subexpression. Save * and restore it when it was in use. Otherwise fill any gap. */ *************** *** 4581,4588 **** { if (subidx < sub->in_use) { ! save_lpos.lnum = sub->list.multi[subidx].start_lnum; ! save_lpos.col = sub->list.multi[subidx].start_col; save_in_use = -1; } else --- 4580,4586 ---- { if (subidx < sub->in_use) { ! save_multipos = sub->list.multi[subidx]; save_in_use = -1; } else *************** *** 4640,4649 **** if (save_in_use == -1) { if (REG_MULTI) ! { ! sub->list.multi[subidx].start_lnum = save_lpos.lnum; ! sub->list.multi[subidx].start_col = save_lpos.col; ! } else sub->list.line[subidx].start = save_ptr; } --- 4638,4644 ---- if (save_in_use == -1) { if (REG_MULTI) ! sub->list.multi[subidx] = save_multipos; else sub->list.line[subidx].start = save_ptr; } *************** *** 4707,4714 **** sub->in_use = subidx + 1; if (REG_MULTI) { ! save_lpos.lnum = sub->list.multi[subidx].end_lnum; ! save_lpos.col = sub->list.multi[subidx].end_col; if (off == -1) { sub->list.multi[subidx].end_lnum = reglnum + 1; --- 4702,4708 ---- sub->in_use = subidx + 1; if (REG_MULTI) { ! save_multipos = sub->list.multi[subidx]; if (off == -1) { sub->list.multi[subidx].end_lnum = reglnum + 1; *************** *** 4728,4735 **** save_ptr = sub->list.line[subidx].end; sub->list.line[subidx].end = reginput + off; /* avoid compiler warnings */ ! save_lpos.lnum = 0; ! save_lpos.col = 0; } subs = addstate(l, state->out, subs, pim, off); --- 4722,4728 ---- save_ptr = sub->list.line[subidx].end; sub->list.line[subidx].end = reginput + off; /* avoid compiler warnings */ ! vim_memset(&save_multipos, 0, sizeof(save_multipos)); } subs = addstate(l, state->out, subs, pim, off); *************** *** 4742,4751 **** sub = &subs->norm; if (REG_MULTI) ! { ! sub->list.multi[subidx].end_lnum = save_lpos.lnum; ! sub->list.multi[subidx].end_col = save_lpos.col; ! } else sub->list.line[subidx].end = save_ptr; sub->in_use = save_in_use; --- 4735,4741 ---- sub = &subs->norm; if (REG_MULTI) ! sub->list.multi[subidx] = save_multipos; else sub->list.line[subidx].end = save_ptr; sub->in_use = save_in_use; *** ../vim-7.4.2353/src/testdir/test_regexp_latin.vim 2016-08-18 23:04:44.662592810 +0200 --- src/testdir/test_regexp_latin.vim 2016-09-09 17:52:55.139578167 +0200 *************** *** 38,40 **** --- 38,55 ---- call setwinvar(1, 'myvar', 1) bwipe! endfunc + + func Test_nested_backrefs() + " Check example in change.txt. + new + for re in range(0, 2) + exe 'set re=' . re + call setline(1, 'aa ab x') + 1s/\(\(a[a-d] \)*\)\(x\)/-\1- -\2- -\3-/ + call assert_equal('-aa ab - -ab - -x-', getline(1)) + + call assert_equal('-aa ab - -ab - -x-', substitute('aa ab x', '\(\(a[a-d] \)*\)\(x\)', '-\1- -\2- -\3-', '')) + endfor + bwipe! + set re=0 + endfunc *** ../vim-7.4.2353/src/version.c 2016-09-09 16:59:04.465154483 +0200 --- src/version.c 2016-09-09 17:58:09.543149388 +0200 *************** *** 765,766 **** --- 765,768 ---- { /* Add new patch number below this line */ + /**/ + 2354, /**/ -- I noticed my daughter's Disney-net password on a sticky note: "MickeyMinnieGoofyPluto". I asked her why it was so long. "Because they say it has to have at least four characters." /// 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 ///