updated for version 7.3.1010 v7.3.1010
authorBram Moolenaar <Bram@vim.org>
Fri, 24 May 2013 18:25:33 +0000 (20:25 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 24 May 2013 18:25:33 +0000 (20:25 +0200)
Problem:    New regexp: adding \Z makes every character match.
Solution:   Only apply ireg_icombine for composing characters.
            Alsl add missing change from patch 1008. (Ken Takata)

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

index 157d3ebad5134f2b61381cdb9ce9f6c45b3010ca..4f2b9254010928f251dade0d6496740224677952 100644 (file)
@@ -2859,7 +2859,7 @@ nfa_regmatch(start, submatch, m)
     List       *listtbl[2][2];
     List       *ll;
     int                listid = 1;
-    int                endnode = 0;
+    int                endnode;
     List       *thislist;
     List       *nextlist;
     List       *neglist;
@@ -3192,13 +3192,7 @@ nfa_regmatch(start, submatch, m)
 
            case NFA_MULTIBYTE:
            case NFA_COMPOSING:
-               switch (t->state->c)
-               {
-                   case NFA_MULTIBYTE:     endnode = NFA_END_MULTIBYTE; break;
-                   case NFA_COMPOSING:     endnode = NFA_END_COMPOSING; break;
-                   default:                endnode = 0;
-               }
-
+               endnode = t->state->c + 1;
                result = OK;
                sta = t->state->out;
                len = 1;
@@ -3206,7 +3200,7 @@ nfa_regmatch(start, submatch, m)
                {
                    if (reginput[len-1] != sta->c)
                    {
-                       result = OK - 1;
+                       result = FAIL;
                        break;
                    }
                    len++;
@@ -3215,11 +3209,11 @@ nfa_regmatch(start, submatch, m)
 
                /* if input char length doesn't match regexp char length */
                if (len -1 < n || sta->c != endnode)
-                   result = OK - 1;
+                   result = FAIL;
                end = t->state->out1;       /* NFA_END_MULTIBYTE or
                                               NFA_END_COMPOSING */
                /* If \Z was present, then ignore composing characters */
-               if (regflags & RF_ICOMBINE)
+               if (ireg_icombine && endnode == NFA_END_COMPOSING)
                    result = 1 ^ sta->negated;
                ADD_POS_NEG_STATE(end);
                break;
index 41e3f78b2f1fd8e618c09b3f1305c0b28df178aa..e332b9708ba258e0b1f50b6529101f8d87a14044 100644 (file)
@@ -7,7 +7,7 @@ actually tried.
 STARTTEST
 :so small.vim
 :so mbyte.vim
-:set nocp encoding=utf-8 viminfo+=nviminfo
+:set nocp encoding=utf-8 viminfo+=nviminfo nomore
 :" tl is a List of Lists with:
 :"    regexp pattern
 :"    text to test the pattern on
@@ -35,11 +35,13 @@ STARTTEST
 :call add(tl, ['\f\+', '&*\9ffname ', 'fname'])
 :call add(tl, ['\%#=1\f\+', '&*\9ffname ', 'fname'])
 
+:"""" Test \Z
+:call add(tl, ['ú\Z', 'x'])
+
 :"""" Combining different tests and features
 :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd'])
 
 :"""" Run the tests
-
 :"
 :for t in tl
 :  let l = matchlist(t[1], t[0])
index 4c1f0ca1d07edc20cf3bbd2bb388a7e1a4b355ad..23d228494938f45db48b9e735e190933b7e189b5 100644 (file)
@@ -9,4 +9,5 @@ OK - \i\+
 OK - \%#=1\i\+
 OK - \f\+
 OK - \%#=1\f\+
+OK - ú\Z
 OK - [^[=a=]]\+
index 8504dfe259490489aa233af836c7f5b05dd4a275..ffc138ec82a712e2dfee231426603a65d85ce8f1 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1010,
 /**/
     1009,
 /**/