summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/regexp_nfa.c50
-rw-r--r--src/testdir/test95.in11
-rw-r--r--src/testdir/test95.ok17
-rw-r--r--src/version.c2
4 files changed, 67 insertions, 13 deletions
diff --git a/src/regexp_nfa.c b/src/regexp_nfa.c
index 56098d3c1..11c011977 100644
--- a/src/regexp_nfa.c
+++ b/src/regexp_nfa.c
@@ -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;
diff --git a/src/testdir/test95.in b/src/testdir/test95.in
index 9c3ca8f1d..0f678794e 100644
--- a/src/testdir/test95.in
+++ b/src/testdir/test95.in
@@ -9,6 +9,7 @@ STARTTEST
:so mbyte.vim
:set nocp encoding=utf-8 viminfo+=nviminfo nomore
:" tl is a List of Lists with:
+:" 2: test auto/old/new 0: test auto/old 1: test auto/new
:" regexp pattern
:" text to test the pattern on
:" expected match (optional)
@@ -40,10 +41,14 @@ STARTTEST
: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, "\u05bb\u05b9", " 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 ", "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\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
@@ -74,7 +79,7 @@ STARTTEST
: let text = t[2]
: let matchidx = 3
: for engine in [0, 1, 2]
-: if engine == 2 && !re
+: if engine == 2 && re == 0 || engine == 1 && re == 1
: continue
: endif
: let &regexpengine = engine
diff --git a/src/testdir/test95.ok b/src/testdir/test95.ok
index a2e3d8626..3fafb8f52 100644
--- a/src/testdir/test95.ok
+++ b/src/testdir/test95.ok
@@ -41,12 +41,29 @@ OK 2 - ֹֻ
OK 0 - .ֹֻ
OK 1 - .ֹֻ
OK 2 - .ֹֻ
+OK 0 - ֹֻ
+OK 1 - ֹֻ
+OK 2 - ֹֻ
+OK 0 - .ֹֻ
+OK 1 - .ֹֻ
+OK 2 - .ֹֻ
OK 0 - ֹ
OK 1 - ֹ
OK 2 - ֹ
OK 0 - .ֹ
OK 1 - .ֹ
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 1 - ú\Z
OK 2 - ú\Z
diff --git a/src/version.c b/src/version.c
index 94d9a1a83..7997e17e0 100644
--- 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 */
/**/
+ 1021,
+/**/
1020,
/**/
1019,