1
0
forked from aniani/vim

updated for version 7.3.1021

Problem:    New regexp engine does not ignore order of composing chars.
Solution:   Ignore composing chars order.
This commit is contained in:
Bram Moolenaar
2013-05-26 14:32:05 +02:00
parent fdb6dc1105
commit 3f1682e808
4 changed files with 67 additions and 13 deletions

View File

@@ -3275,8 +3275,10 @@ nfa_regmatch(start, submatch, m)
int len = 0;
nfa_state_T *end;
nfa_state_T *sta;
int cchars[MAX_MCO];
int ccount = 0;
int j;
result = OK;
sta = t->state->out;
len = 0;
if (utf_iscomposing(sta->c))
@@ -3293,24 +3295,52 @@ nfa_regmatch(start, submatch, m)
/* TODO: How about negated? */
if (len == 0 && sta->c != c)
result = FAIL;
len = n;
else
result = OK;
while (sta->c != NFA_END_COMPOSING)
sta = sta->out;
}
else
while (sta->c != NFA_END_COMPOSING && len < n)
/* Check base character matches first, unless ignored. */
else if (len > 0 || mc == sta->c)
{
if (len == 0)
{
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)
/* We don't care about the order of composing characters.
* Get them into cchars[] first. */
while (len < n)
{
mc = mb_ptr2char(reginput + len);
cchars[ccount++] = mc;
len += mb_char2len(mc);
if (ccount == MAX_MCO)
break;
}
/* Check that each composing char in the pattern matches a
* composing char in the text. We do not check if all
* composing chars are matched. */
result = OK;
while (sta->c != NFA_END_COMPOSING)
{
for (j = 0; j < ccount; ++j)
if (cchars[j] == sta->c)
break;
if (j == ccount)
{
result = FAIL;
break;
}
sta = sta->out;
}
}
else
result = FAIL;
end = t->state->out1; /* NFA_END_COMPOSING */
ADD_POS_NEG_STATE(end);
break;