Mercurial > vim
changeset 4669:2d15582e132f v7.3.1082
updated for version 7.3.1082
Problem: New regexp engine: Problem with \@= matching.
Solution: Save and restore nfa_match.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 31 May 2013 21:45:09 +0200 |
parents | aed971d62627 |
children | 053beb7bf8ba |
files | src/regexp_nfa.c src/testdir/test64.in src/testdir/test64.ok src/version.c |
diffstat | 4 files changed, 23 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -3332,11 +3332,8 @@ nfa_regmatch(start, submatch, m) int result; int size = 0; int flag = 0; - int old_reglnum = -1; int go_to_nextline = FALSE; nfa_thread_T *t; - char_u *old_reginput = NULL; - char_u *old_regline = NULL; nfa_list_T list[3]; nfa_list_T *listtbl[2][2]; nfa_list_T *ll; @@ -3560,15 +3557,18 @@ nfa_regmatch(start, submatch, m) break; case NFA_START_INVISIBLE: - /* Save global variables, and call nfa_regmatch() to check if - * the current concat matches at this position. The concat - * ends with the node NFA_END_INVISIBLE */ - old_reginput = reginput; - old_regline = regline; - old_reglnum = reglnum; + { + char_u *save_reginput = reginput; + char_u *save_regline = regline; + int save_reglnum = reglnum; + int save_nfa_match = nfa_match; + + /* Call nfa_regmatch() to check if the current concat matches + * at this position. The concat ends with the node + * NFA_END_INVISIBLE */ if (listids == NULL) { - listids = (int *) lalloc(sizeof(int) * nstate, TRUE); + listids = (int *)lalloc(sizeof(int) * nstate, TRUE); if (listids == NULL) { EMSG(_("E878: (NFA) Could not allocate memory for branch traversal!")); @@ -3588,7 +3588,12 @@ nfa_regmatch(start, submatch, m) result = nfa_regmatch(t->state->out, submatch, m); nfa_set_neg_listids(start); nfa_restore_listids(start, listids); - nfa_match = FALSE; + + /* restore position in input text */ + reginput = save_reginput; + regline = save_regline; + reglnum = save_reglnum; + nfa_match = save_nfa_match; #ifdef ENABLE_LOG log_fd = fopen(NFA_REGEXP_RUN_LOG, "a"); @@ -3610,10 +3615,6 @@ nfa_regmatch(start, submatch, m) { int j; - /* Restore position in input text */ - reginput = old_reginput; - regline = old_regline; - reglnum = old_reglnum; /* Copy submatch info from the recursive call */ if (REG_MULTI) for (j = 1; j < m->in_use; j++) @@ -3635,12 +3636,8 @@ nfa_regmatch(start, submatch, m) addstate_here(thislist, t->state->out1->out, &t->sub, &listidx); } - else - { - /* continue with next input char */ - reginput = old_reginput; - } break; + } case NFA_BOL: if (reginput == regline)
--- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -305,6 +305,7 @@ STARTTEST :call add(tl, [2, '\v(abc)@=..', 'xabcd', 'ab', 'abc']) :call add(tl, [2, '\(.*John\)\@=.*Bob', 'here is John, and here is B']) :call add(tl, [2, '\(John.*\)\@=.*Bob', 'John is Bobs friend', 'John is Bob', 'John is Bobs friend']) +:call add(tl, [2, '\<\S\+\())\)\@=', '$((i=i+1))', 'i=i+1', '))']) :call add(tl, [2, '.*John\&.*Bob', 'here is John, and here is B']) :call add(tl, [2, '.*John\&.*Bob', 'John is Bobs friend', 'John is Bob']) :call add(tl, [2, '\v(test1)@=.*yep', 'this is a test1, yep it is', 'test1, yep', 'test1'])
--- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -669,6 +669,9 @@ OK 2 - \(.*John\)\@=.*Bob OK 0 - \(John.*\)\@=.*Bob OK 1 - \(John.*\)\@=.*Bob OK 2 - \(John.*\)\@=.*Bob +OK 0 - \<\S\+\())\)\@= +OK 1 - \<\S\+\())\)\@= +OK 2 - \<\S\+\())\)\@= OK 0 - .*John\&.*Bob OK 1 - .*John\&.*Bob OK 2 - .*John\&.*Bob