Mercurial > vim
diff src/regexp_nfa.c @ 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 | 55bcaa1d2749 |
children | 1be43c095aff |
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; }