diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-05-24 23:10:50 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-05-24 23:10:50 +0200 |
commit | fad8de084a568678ccb5e38c62618c6ae0f57bfe (patch) | |
tree | 7bb288dcfc45680c20a4509063f78480e7a7cd3a /src | |
parent | 3c577f26cd5d3b8252352d66396e85c4ebe1305d (diff) | |
download | vim-fad8de084a568678ccb5e38c62618c6ae0f57bfe.zip |
updated for version 7.3.1012
Problem: \Z does not work properly with the new regexp engine.
Solution: Make \Z work. Add tests.
Diffstat (limited to 'src')
-rw-r--r-- | src/regexp_nfa.c | 39 | ||||
-rw-r--r-- | src/testdir/test95.in | 9 | ||||
-rw-r--r-- | src/testdir/test95.ok | 9 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 44 insertions, 15 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c index 8a90248de..02efe0a2d 100644 --- a/src/regexp_nfa.c +++ b/src/regexp_nfa.c @@ -1184,14 +1184,15 @@ collection: EMIT(NFA_CONCAT); } return OK; - } /* if exists closing ] */ - else if (reg_strict) + } /* if exists closing ] */ + + if (reg_strict) { syntax_error = TRUE; EMSG_RET_FAIL(_(e_missingbracket)); } + /* FALLTHROUGH */ - /* FALLTHROUGH */ default: { #ifdef FEAT_MBYTE @@ -1214,7 +1215,7 @@ nfa_do_multibyte: EMIT(c); if (i > 0) EMIT(NFA_CONCAT); - if (i += utf_char2len(c) >= plen) + if ((i += utf_char2len(c)) >= plen) break; c = utf_ptr2char(old_regparse + i); } @@ -2269,7 +2270,7 @@ post2nfa(postfix, end, nfa_calc_size) /* TODO */ if (regflags & RF_ICOMBINE) { - goto normalchar; + /* use the base character only */ } #endif /* FALLTHROUGH */ @@ -3145,23 +3146,31 @@ nfa_regmatch(start, submatch, m) result = OK; sta = t->state->out; len = 0; - while (sta->c != NFA_END_COMPOSING && len < n) + if (ireg_icombine) { - if (len > 0) - mc = mb_ptr2char(reginput + len); - if (mc != sta->c) - break; - len += mb_char2len(mc); - sta = sta->out; + /* If \Z was present, then ignore composing characters. */ + /* TODO: How about negated? */ + if (sta->c != c) + result = FAIL; + len = n; + while (sta->c != NFA_END_COMPOSING) + sta = sta->out; } + else + while (sta->c != NFA_END_COMPOSING && len < n) + { + if (len > 0) + mc = mb_ptr2char(reginput + len); + if (mc != sta->c) + break; + len += mb_char2len(mc); + sta = sta->out; + } /* if input char length doesn't match regexp char length */ if (len < n || sta->c != NFA_END_COMPOSING) result = FAIL; end = t->state->out1; /* NFA_END_COMPOSING */ - /* If \Z was present, then ignore composing characters */ - if (ireg_icombine) - result = 1 ^ sta->negated; ADD_POS_NEG_STATE(end); break; } diff --git a/src/testdir/test95.in b/src/testdir/test95.in index 3451cc511..5e4822051 100644 --- a/src/testdir/test95.in +++ b/src/testdir/test95.in @@ -41,6 +41,15 @@ STARTTEST :"""" Test \Z :call add(tl, ['ú\Z', 'x']) +:call add(tl, ['יהוה\Z', 'יהוה', 'יהוה']) +:call add(tl, ['יְהוָה\Z', 'יהוה', 'יהוה']) +:call add(tl, ['יהוה\Z', 'יְהוָה', 'יְהוָה']) +:call add(tl, ['יְהוָה\Z', 'יְהוָה', 'יְהוָה']) +:call add(tl, ['יְ\Z', 'וְיַ', 'יַ']) +:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"]) +:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200dxy", "ק\u200dx"]) +:call add(tl, ["ק\u200dx\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"]) +:call add(tl, ["ק\u200dx\\Z", "xק\u200dxy", "ק\u200dx"]) :"""" Combining different tests and features :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd']) diff --git a/src/testdir/test95.ok b/src/testdir/test95.ok index 57c28d917..8297899a5 100644 --- a/src/testdir/test95.ok +++ b/src/testdir/test95.ok @@ -12,4 +12,13 @@ OK - \%#=1\f\+ OK - .ม OK - .ม่ OK - ú\Z +OK - יהוה\Z +OK - יְהוָה\Z +OK - יהוה\Z +OK - יְהוָה\Z +OK - יְ\Z +OK - קֹx\Z +OK - קֹx\Z +OK - קx\Z +OK - קx\Z OK - [^[=a=]]\+ diff --git a/src/version.c b/src/version.c index 1a6093366..c55167086 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 */ /**/ + 1012, +/**/ 1011, /**/ 1010, |