mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
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:
parent
fdb6dc1105
commit
3f1682e808
@ -3275,8 +3275,10 @@ nfa_regmatch(start, submatch, m)
|
|||||||
int len = 0;
|
int len = 0;
|
||||||
nfa_state_T *end;
|
nfa_state_T *end;
|
||||||
nfa_state_T *sta;
|
nfa_state_T *sta;
|
||||||
|
int cchars[MAX_MCO];
|
||||||
|
int ccount = 0;
|
||||||
|
int j;
|
||||||
|
|
||||||
result = OK;
|
|
||||||
sta = t->state->out;
|
sta = t->state->out;
|
||||||
len = 0;
|
len = 0;
|
||||||
if (utf_iscomposing(sta->c))
|
if (utf_iscomposing(sta->c))
|
||||||
@ -3293,24 +3295,52 @@ nfa_regmatch(start, submatch, m)
|
|||||||
/* TODO: How about negated? */
|
/* TODO: How about negated? */
|
||||||
if (len == 0 && sta->c != c)
|
if (len == 0 && sta->c != c)
|
||||||
result = FAIL;
|
result = FAIL;
|
||||||
len = n;
|
else
|
||||||
|
result = OK;
|
||||||
while (sta->c != NFA_END_COMPOSING)
|
while (sta->c != NFA_END_COMPOSING)
|
||||||
sta = sta->out;
|
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);
|
len += mb_char2len(mc);
|
||||||
sta = sta->out;
|
sta = sta->out;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if input char length doesn't match regexp char length */
|
/* We don't care about the order of composing characters.
|
||||||
if (len < n || sta->c != NFA_END_COMPOSING)
|
* 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;
|
result = FAIL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
sta = sta->out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
result = FAIL;
|
||||||
|
|
||||||
end = t->state->out1; /* NFA_END_COMPOSING */
|
end = t->state->out1; /* NFA_END_COMPOSING */
|
||||||
ADD_POS_NEG_STATE(end);
|
ADD_POS_NEG_STATE(end);
|
||||||
break;
|
break;
|
||||||
|
@ -9,6 +9,7 @@ STARTTEST
|
|||||||
:so mbyte.vim
|
:so mbyte.vim
|
||||||
:set nocp encoding=utf-8 viminfo+=nviminfo nomore
|
:set nocp encoding=utf-8 viminfo+=nviminfo nomore
|
||||||
:" tl is a List of Lists with:
|
:" tl is a List of Lists with:
|
||||||
|
:" 2: test auto/old/new 0: test auto/old 1: test auto/new
|
||||||
:" regexp pattern
|
:" regexp pattern
|
||||||
:" text to test the pattern on
|
:" text to test the pattern on
|
||||||
:" expected match (optional)
|
:" expected match (optional)
|
||||||
@ -40,10 +41,14 @@ STARTTEST
|
|||||||
:call add(tl, [2, ".\u05b9", " x\u05b9 ", "x\u05b9"])
|
:call add(tl, [2, ".\u05b9", " x\u05b9 ", "x\u05b9"])
|
||||||
:call add(tl, [2, "\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
:call add(tl, [2, "\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
:call add(tl, [2, ".\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
:call add(tl, [2, ".\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
:"call add(tl, [2, "\u05bb\u05b9", " x\u05b9\u05bb "])
|
:call add(tl, [2, "\u05bb\u05b9", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
:"call add(tl, [2, ".\u05bb\u05b9", " x\u05b9\u05bb "])
|
:call add(tl, [2, ".\u05bb\u05b9", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
:call add(tl, [2, "\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
|
:call add(tl, [2, "\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
|
||||||
:call add(tl, [2, ".\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
|
:call add(tl, [2, ".\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
|
||||||
|
:call add(tl, [2, "\u05b9", " y\u05bb\u05b9 x\u05b9 ", "y\u05bb\u05b9"])
|
||||||
|
:call add(tl, [2, ".\u05b9", " y\u05bb\u05b9 x\u05b9 ", "y\u05bb\u05b9"])
|
||||||
|
:call add(tl, [1, "\u05b9\u05bb", " y\u05b9 x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
|
:call add(tl, [2, ".\u05b9\u05bb", " y\u05bb x\u05b9\u05bb ", "x\u05b9\u05bb"])
|
||||||
|
|
||||||
|
|
||||||
:"""" Test \Z
|
:"""" Test \Z
|
||||||
@ -74,7 +79,7 @@ STARTTEST
|
|||||||
: let text = t[2]
|
: let text = t[2]
|
||||||
: let matchidx = 3
|
: let matchidx = 3
|
||||||
: for engine in [0, 1, 2]
|
: for engine in [0, 1, 2]
|
||||||
: if engine == 2 && !re
|
: if engine == 2 && re == 0 || engine == 1 && re == 1
|
||||||
: continue
|
: continue
|
||||||
: endif
|
: endif
|
||||||
: let ®expengine = engine
|
: let ®expengine = engine
|
||||||
|
@ -41,12 +41,29 @@ OK 2 - ֹֻ
|
|||||||
OK 0 - .ֹֻ
|
OK 0 - .ֹֻ
|
||||||
OK 1 - .ֹֻ
|
OK 1 - .ֹֻ
|
||||||
OK 2 - .ֹֻ
|
OK 2 - .ֹֻ
|
||||||
|
OK 0 - ֹֻ
|
||||||
|
OK 1 - ֹֻ
|
||||||
|
OK 2 - ֹֻ
|
||||||
|
OK 0 - .ֹֻ
|
||||||
|
OK 1 - .ֹֻ
|
||||||
|
OK 2 - .ֹֻ
|
||||||
OK 0 - ֹ
|
OK 0 - ֹ
|
||||||
OK 1 - ֹ
|
OK 1 - ֹ
|
||||||
OK 2 - ֹ
|
OK 2 - ֹ
|
||||||
OK 0 - .ֹ
|
OK 0 - .ֹ
|
||||||
OK 1 - .ֹ
|
OK 1 - .ֹ
|
||||||
OK 2 - .ֹ
|
OK 2 - .ֹ
|
||||||
|
OK 0 - ֹ
|
||||||
|
OK 1 - ֹ
|
||||||
|
OK 2 - ֹ
|
||||||
|
OK 0 - .ֹ
|
||||||
|
OK 1 - .ֹ
|
||||||
|
OK 2 - .ֹ
|
||||||
|
OK 0 - ֹֻ
|
||||||
|
OK 2 - ֹֻ
|
||||||
|
OK 0 - .ֹֻ
|
||||||
|
OK 1 - .ֹֻ
|
||||||
|
OK 2 - .ֹֻ
|
||||||
OK 0 - ú\Z
|
OK 0 - ú\Z
|
||||||
OK 1 - ú\Z
|
OK 1 - ú\Z
|
||||||
OK 2 - ú\Z
|
OK 2 - ú\Z
|
||||||
|
@ -728,6 +728,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1021,
|
||||||
/**/
|
/**/
|
||||||
1020,
|
1020,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user