0
0
mirror of https://github.com/vim/vim.git synced 2025-10-06 05:44:14 -04:00

updated for version 7.3.1012

Problem:    \Z does not work properly with the new regexp engine.
Solution:   Make \Z work.  Add tests.
This commit is contained in:
Bram Moolenaar
2013-05-24 23:10:50 +02:00
parent 3c577f26cd
commit fad8de084a
4 changed files with 44 additions and 15 deletions

View File

@@ -1185,13 +1185,14 @@ collection:
}
return OK;
} /* if exists closing ] */
else if (reg_strict)
if (reg_strict)
{
syntax_error = TRUE;
EMSG_RET_FAIL(_(e_missingbracket));
}
/* 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,6 +3146,17 @@ nfa_regmatch(start, submatch, m)
result = OK;
sta = t->state->out;
len = 0;
if (ireg_icombine)
{
/* 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)
@@ -3159,9 +3171,6 @@ nfa_regmatch(start, submatch, m)
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;
}

View File

@@ -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'])

View File

@@ -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=]]\+

View File

@@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1012,
/**/
1011,
/**/