diff --git a/7.3.1021 b/7.3.1021 new file mode 100644 index 0000000..6d26807 --- /dev/null +++ b/7.3.1021 @@ -0,0 +1,229 @@ +To: vim_dev@googlegroups.com +Subject: Patch 7.3.1021 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 7.3.1021 +Problem: New regexp engine does not ignore order of composing chars. +Solution: Ignore composing chars order. +Files: src/regexp_nfa.c, src/testdir/test95.in, src/testdir/test95.ok + + +*** ../vim-7.3.1020/src/regexp_nfa.c 2013-05-25 22:04:19.000000000 +0200 +--- src/regexp_nfa.c 2013-05-26 14:27:11.000000000 +0200 +*************** +*** 3275,3282 **** + int len = 0; + nfa_state_T *end; + nfa_state_T *sta; + +- result = OK; + sta = t->state->out; + len = 0; + if (utf_iscomposing(sta->c)) +--- 3275,3284 ---- + int len = 0; + nfa_state_T *end; + nfa_state_T *sta; ++ int cchars[MAX_MCO]; ++ int ccount = 0; ++ int j; + + sta = t->state->out; + len = 0; + if (utf_iscomposing(sta->c)) +*************** +*** 3293,3316 **** + /* TODO: How about negated? */ + if (len == 0 && 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 */ + ADD_POS_NEG_STATE(end); + break; +--- 3295,3346 ---- + /* TODO: How about negated? */ + if (len == 0 && sta->c != c) + result = FAIL; +! else +! result = OK; + while (sta->c != NFA_END_COMPOSING) + sta = sta->out; + } +! +! /* Check base character matches first, unless ignored. */ +! else if (len > 0 || mc == sta->c) +! { +! if (len == 0) + { + len += mb_char2len(mc); + sta = sta->out; + } + +! /* 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; +*** ../vim-7.3.1020/src/testdir/test95.in 2013-05-25 23:15:21.000000000 +0200 +--- src/testdir/test95.in 2013-05-26 14:12:13.000000000 +0200 +*************** +*** 9,14 **** +--- 9,15 ---- + :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,49 **** + :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, "\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"]) + :call add(tl, [2, ".\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"]) + + + :"""" Test \Z +--- 41,54 ---- + :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 ", "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,80 **** + : let text = t[2] + : let matchidx = 3 + : for engine in [0, 1, 2] +! : if engine == 2 && !re + : continue + : endif + : let ®expengine = engine +--- 79,85 ---- + : let text = t[2] + : let matchidx = 3 + : for engine in [0, 1, 2] +! : if engine == 2 && re == 0 || engine == 1 && re == 1 + : continue + : endif + : let ®expengine = engine +*** ../vim-7.3.1020/src/testdir/test95.ok 2013-05-25 23:15:21.000000000 +0200 +--- src/testdir/test95.ok 2013-05-26 14:12:36.000000000 +0200 +*************** +*** 41,52 **** +--- 41,69 ---- + 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 +*** ../vim-7.3.1020/src/version.c 2013-05-25 23:15:21.000000000 +0200 +--- src/version.c 2013-05-26 13:54:16.000000000 +0200 +*************** +*** 730,731 **** +--- 730,733 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1021, + /**/ + +-- +Engineers are always delighted to share wisdom, even in areas in which they +have no experience whatsoever. Their logic provides them with inherent +insight into any field of expertise. This can be a problem when dealing with +the illogical people who believe that knowledge can only be derived through +experience. + (Scott Adams - The Dilbert principle) + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org ///