]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.1015 v7.3.1015
authorBram Moolenaar <Bram@vim.org>
Sat, 25 May 2013 12:42:03 +0000 (14:42 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 25 May 2013 12:42:03 +0000 (14:42 +0200)
Problem:    New regexp engine: Matching composing characters is wrong.
Solution:   Fix matching composing characters.

src/regexp_nfa.c
src/testdir/test95.in
src/testdir/test95.ok
src/version.c

index 0a6dded827068bbca50396fb665364be1b6be046..19b8d925e564249ed590af0b7fb3edd4e717843c 100644 (file)
@@ -716,6 +716,7 @@ nfa_regatom()
             * the composing char is matched here. */
            if (enc_utf8 && c == Magic('.') && utf_iscomposing(peekchr()))
            {
+               old_regparse = regparse;
                c = getchr();
                goto nfa_do_multibyte;
            }
@@ -1217,9 +1218,11 @@ collection:
 
 nfa_do_multibyte:
                /* Length of current char with composing chars. */
-               if (enc_utf8 && clen != (plen = (*mb_ptr2len)(old_regparse)))
+               if (enc_utf8 && (clen != (plen = (*mb_ptr2len)(old_regparse))
+                           || utf_iscomposing(c)))
                {
-                   /* A base character plus composing characters.
+                   /* A base character plus composing characters, or just one
+                    * or more composing characters.
                     * This requires creating a separate atom as if enclosing
                     * the characters in (), where NFA_COMPOSING is the ( and
                     * NFA_END_COMPOSING is the ). Note that right now we are
@@ -1400,7 +1403,6 @@ nfa_regpiece()
            /* Save pos after the repeated atom and the \{} */
            new_regparse = regparse;
 
-           new_regparse = regparse;
            quest = (greedy == TRUE? NFA_QUEST : NFA_QUEST_NONGREEDY);
            for (i = 0; i < maxval; i++)
            {
@@ -3218,11 +3220,19 @@ nfa_regmatch(start, submatch, m)
                result = OK;
                sta = t->state->out;
                len = 0;
+               if (utf_iscomposing(sta->c))
+               {
+                   /* Only match composing character(s), ignore base
+                    * character.  Used for ".{composing}" and "{composing}"
+                    * (no preceding character). */
+                   len += mb_char2len(c);
+               }
                if (ireg_icombine)
                {
-                   /* If \Z was present, then ignore composing characters. */
+                   /* If \Z was present, then ignore composing characters.
+                    * When ignoring the base character this always matches. */
                    /* TODO: How about negated? */
-                   if (sta->c != c)
+                   if (len == 0 && sta->c != c)
                        result = FAIL;
                    len = n;
                    while (sta->c != NFA_END_COMPOSING)
index 5e4822051b95ba3083cc4386b0394e6431e6df05..2484ace1aa8a228d7d593e1d5d7786950684f776 100644 (file)
@@ -38,6 +38,15 @@ STARTTEST
 :"""" Test composing character matching
 :call add(tl, ['.ม', 'xม่x yมy', 'yม'])
 :call add(tl, ['.ม่', 'xม่x yมy', 'xม่'])
+:call add(tl, ["\u05b9", " x\u05b9 ", "x\u05b9"])
+:call add(tl, [".\u05b9", " x\u05b9 ", "x\u05b9"])
+:call add(tl, ["\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
+:call add(tl, [".\u05b9\u05bb", " x\u05b9\u05bb ", "x\u05b9\u05bb"])
+:call add(tl, ["\u05bb\u05b9", " x\u05b9\u05bb "])
+:call add(tl, [".\u05bb\u05b9", " x\u05b9\u05bb "])
+:call add(tl, ["\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
+:call add(tl, [".\u05b9", " y\u05bb x\u05b9 ", "x\u05b9"])
+
 
 :"""" Test \Z
 :call add(tl, ['ú\Z', 'x'])
@@ -50,6 +59,8 @@ STARTTEST
 :call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200dxy", "ק\u200dx"])
 :call add(tl, ["ק\u200dx\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
 :call add(tl, ["ק\u200dx\\Z", "xק\u200dxy", "ק\u200dx"])
+:call add(tl, ["\u05b9\\+\\Z", "xyz", "xyz"])
+:call add(tl, ["\\Z\u05b9\\+", "xyz", "xyz"])
 
 :"""" Combining different tests and features
 :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd'])
index 8297899a5027cb3933a975b14e6dc29f3d1743cf..9211c2ca6164c32c796bbf0a2b6c4ca42ce81b8d 100644 (file)
@@ -11,6 +11,14 @@ OK - \f\+
 OK - \%#=1\f\+
 OK - .ม
 OK - .ม่
+OK - ֹ
+OK - .ֹ
+OK - ֹֻ
+OK - .ֹֻ
+OK - ֹֻ
+OK - .ֹֻ
+OK - ֹ
+OK - .ֹ
 OK - ú\Z
 OK - יהוה\Z
 OK - יְהוָה\Z
@@ -21,4 +29,6 @@ OK - ק‍ֹx\Z
 OK - ק‍ֹx\Z
 OK - ק‍x\Z
 OK - ק‍x\Z
+OK - ֹ\+\Z
+OK - \Zֹ\+
 OK - [^[=a=]]\+
index 5063b8d01dcdc5328d4e6b07ce437e49e3418835..0d4ca1871f87cbb893f65a58a5ceb69fb494f889 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1015,
 /**/
     1014,
 /**/