]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.3.1012 v7.3.1012
authorBram Moolenaar <Bram@vim.org>
Fri, 24 May 2013 21:10:50 +0000 (23:10 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 24 May 2013 21:10:50 +0000 (23:10 +0200)
Problem:    \Z does not work properly with the new regexp engine.
Solution:   Make \Z work.  Add tests.

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

index 8a90248deeebd86c66d814178a6a78e1dab6d623..02efe0a2d55ccafbef036dc289409a57698ad089 100644 (file)
@@ -1184,14 +1184,15 @@ collection:
                    EMIT(NFA_CONCAT);
                }
                return OK;
-           }           /* if exists closing ] */
-           else if (reg_strict)
+           } /* if exists closing ] */
+
+           if (reg_strict)
            {
                syntax_error = TRUE;
                EMSG_RET_FAIL(_(e_missingbracket));
            }
+           /* FALLTHROUGH */
 
-       /* FALLTHROUGH */
        default:
            {
 #ifdef FEAT_MBYTE
@@ -1214,7 +1215,7 @@ nfa_do_multibyte:
                        EMIT(c);
                        if (i > 0)
                            EMIT(NFA_CONCAT);
-                       if (i += utf_char2len(c) >= plen)
+                       if ((i += utf_char2len(c)) >= plen)
                            break;
                        c = utf_ptr2char(old_regparse + i);
                    }
@@ -2269,7 +2270,7 @@ post2nfa(postfix, end, nfa_calc_size)
            /* TODO */
            if (regflags & RF_ICOMBINE)
            {
-               goto normalchar;
+               /* use the base character only */
            }
 #endif
            /* FALLTHROUGH */
@@ -3145,23 +3146,31 @@ nfa_regmatch(start, submatch, m)
                result = OK;
                sta = t->state->out;
                len = 0;
-               while (sta->c != NFA_END_COMPOSING && len < n)
+               if (ireg_icombine)
                {
-                   if (len > 0)
-                       mc = mb_ptr2char(reginput + len);
-                   if (mc != sta->c)
-                       break;
-                   len += mb_char2len(mc);
-                   sta = sta->out;
+                   /* If \Z was present, then ignore composing characters. */
+                   /* TODO: How about negated? */
+                   if (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 */
-               /* If \Z was present, then ignore composing characters */
-               if (ireg_icombine)
-                   result = 1 ^ sta->negated;
                ADD_POS_NEG_STATE(end);
                break;
            }
index 3451cc511f66c4c23b6c58fafa71c3dc62990b9c..5e4822051b95ba3083cc4386b0394e6431e6df05 100644 (file)
@@ -41,6 +41,15 @@ STARTTEST
 
 :"""" Test \Z
 :call add(tl, ['ú\Z', 'x'])
+:call add(tl, ['יהוה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יְהוָה\Z', 'יהוה', 'יהוה'])
+:call add(tl, ['יהוה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְהוָה\Z', 'יְהוָה', 'יְהוָה'])
+:call add(tl, ['יְ\Z', 'וְיַ', 'יַ'])
+:call add(tl, ["ק\u200d\u05b9x\\Z", "xק\u200d\u05b9xy", "ק\u200d\u05b9x"])
+: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"])
 
 :"""" Combining different tests and features
 :call add(tl, ['[^[=a=]]\+', 'ddaãâbcd', 'dd'])
index 57c28d9175500bfd63c4138572a8fd4b6eccad17..8297899a5027cb3933a975b14e6dc29f3d1743cf 100644 (file)
@@ -12,4 +12,13 @@ OK - \%#=1\f\+
 OK - .ม
 OK - .ม่
 OK - ú\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יהוה\Z
+OK - יְהוָה\Z
+OK - יְ\Z
+OK - ק‍ֹx\Z
+OK - ק‍ֹx\Z
+OK - ק‍x\Z
+OK - ק‍x\Z
 OK - [^[=a=]]\+
index 1a60933663e9b49caec92e9529d34bb2b482f58a..c55167086e6ed0d472adb9763f988ec18afc5201 100644 (file)
@@ -728,6 +728,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1012,
 /**/
     1011,
 /**/