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 ///