diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-07-21 18:59:24 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-07-21 18:59:24 +0200 |
commit | 196ed14d15f27d91856fd2f415da53f3f5db6c10 (patch) | |
tree | 3d76f5dfc0cfa2d5fcae3d0b51b0e2d78629b2d6 | |
parent | 9d48895e4c65e54d0436b76e48336e3c2ace0bf6 (diff) | |
download | vim-git-196ed14d15f27d91856fd2f415da53f3f5db6c10.tar.gz |
updated for version 7.4a.039v7.4a.039
Problem: New regexp engine doesn't match pattern. (Ingo Karkat)
Solution: When adding a state also check for different PIM if the list of
states has any state with a PIM.
-rw-r--r-- | src/regexp_nfa.c | 9 | ||||
-rw-r--r-- | src/testdir/test64.in | 1 | ||||
-rw-r--r-- | src/testdir/test64.ok | 3 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 14 insertions, 1 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index 07e2fa1fe..0b9917fe6 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -3464,6 +3464,7 @@ typedef struct int n; /* nr of states currently in "t" */ int len; /* max nr of states in "t" */ int id; /* ID of the list */ + int has_pim; /* TRUE when any state has a PIM */ } nfa_list_T; #ifdef ENABLE_LOG @@ -3966,7 +3967,7 @@ 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) + if (!nfa_has_backref && pim == NULL && !l->has_pim) { skip_add: #ifdef ENABLE_LOG @@ -4012,7 +4013,10 @@ skip_add: if (pim == NULL) thread->pim.result = NFA_PIM_UNUSED; else + { copy_pim(&thread->pim, pim); + l->has_pim = TRUE; + } copy_sub(&thread->subs.norm, &subs->norm); #ifdef FEAT_SYN_HL if (nfa_has_zsubexpr) @@ -5060,8 +5064,10 @@ nfa_regmatch(prog, start, submatch, m) thislist = &list[0]; thislist->n = 0; + thislist->has_pim = FALSE; nextlist = &list[1]; nextlist->n = 0; + nextlist->has_pim = FALSE; #ifdef ENABLE_LOG fprintf(log_fd, "(---) STARTSTATE first\n"); #endif @@ -5120,6 +5126,7 @@ nfa_regmatch(prog, start, submatch, m) thislist = &list[flag]; nextlist = &list[flag ^= 1]; nextlist->n = 0; /* clear nextlist */ + nextlist->has_pim = FALSE; ++nfa_listid; thislist->id = nfa_listid; nextlist->id = nfa_listid + 1; diff --git a/src/testdir/test64.in b/src/testdir/test64.in index a946aa450..82669b047 100644 --- a/src/testdir/test64.in +++ b/src/testdir/test64.in @@ -341,6 +341,7 @@ STARTTEST :call add(tl, [2, '^\%(.*bar\)\@!.*\zsfoo', ' foo xxx ', 'foo']) :call add(tl, [2, '[ ]\@!\p\%([ ]\@!\p\)*:', 'implicit mappings:', 'mappings:']) :call add(tl, [2, 'm\k\+_\@=\%(_\@!\k\)\@<=\k\+e', 'mx__xe', 'mx__xe']) +:call add(tl, [2, '\%(\U\@<=S\k*\|S\l\)R', 'SuR', 'SuR']) :" :"""" Combining different tests and features :call add(tl, [2, '[[:alpha:]]\{-2,6}', '787abcdiuhsasiuhb4', 'ab']) diff --git a/src/testdir/test64.ok b/src/testdir/test64.ok index efcf8dd50..d08227f2c 100644 --- a/src/testdir/test64.ok +++ b/src/testdir/test64.ok @@ -779,6 +779,9 @@ OK 2 - [ ]\@!\p\%([ ]\@!\p\)*: OK 0 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e OK 1 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e OK 2 - m\k\+_\@=\%(_\@!\k\)\@<=\k\+e +OK 0 - \%(\U\@<=S\k*\|S\l\)R +OK 1 - \%(\U\@<=S\k*\|S\l\)R +OK 2 - \%(\U\@<=S\k*\|S\l\)R OK 0 - [[:alpha:]]\{-2,6} OK 1 - [[:alpha:]]\{-2,6} OK 2 - [[:alpha:]]\{-2,6} diff --git a/src/version.c b/src/version.c index 6b724dacd..f1d5214a1 100644 --- a/src/version.c +++ b/src/version.c @@ -728,6 +728,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 39, +/**/ 38, /**/ 37, |