# HG changeset patch # User Bram Moolenaar # Date 1369429850 -7200 # Node ID 432a6b8c7d933dee8faf25a342e857fa0a538eea # Parent 592769af9d324e520a056c165524d94563b043fe updated for version 7.3.1012 Problem: \Z does not work properly with the new regexp engine. Solution: Make \Z work. Add tests. diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c --- 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 --- 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 --- 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 --- 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,