Mercurial > vim
changeset 4529:432a6b8c7d93 v7.3.1012
updated for version 7.3.1012
Problem: \Z does not work properly with the new regexp engine.
Solution: Make \Z work. Add tests.
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Fri, 24 May 2013 23:10:50 +0200 |
parents | 592769af9d32 |
children | 5a4995e468e1 |
files | src/regexp_nfa.c src/testdir/test95.in src/testdir/test95.ok src/version.c |
diffstat | 4 files changed, 45 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- 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; }
--- 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'])