]> granicus.if.org Git - vim/commitdiff
updated for version 7.3.636 v7.3.636
authorBram Moolenaar <Bram@vim.org>
Thu, 23 Aug 2012 13:53:05 +0000 (15:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 23 Aug 2012 13:53:05 +0000 (15:53 +0200)
Problem:    Not all zero-width matches handled correctly for "gn".
Solution:   Move zero-width detection to a separate function. (Christian
            Brabandt)

src/search.c
src/version.c

index 5ace05d6ae00a7b1558a24594235958633478642..b54b30f9e80d5959c94f0a265317472b4cbce2b9 100644 (file)
@@ -4526,6 +4526,8 @@ current_quote(oap, count, include, quotechar)
 #endif /* FEAT_TEXTOBJ */
 
 #if defined(FEAT_VISUAL) || defined(PROTO)
+static int is_zerowidth __ARGS((char_u *pattern));
+
 /*
  * Find next search match under cursor, cursor at end.
  * Used while an operator is pending, and in Visual mode.
@@ -4546,11 +4548,8 @@ current_search(count, forward)
     int                visual_active = FALSE;
     int                flags = 0;
     pos_T      save_VIsual;
-    regmmatch_T        regmatch;
-    int                nmatched = 0;
     int                zerowidth = FALSE;
 
-
     /* wrapping should not occur */
     p_ws = FALSE;
 
@@ -4583,23 +4582,10 @@ current_search(count, forward)
     else
        orig_pos = pos = start_pos = curwin->w_cursor;
 
-    /*
-     * Check for zero-width pattern.
-     */
-    if (search_regcomp(spats[last_idx].pat, RE_SEARCH, RE_SEARCH,
-                            ((SEARCH_HIS + SEARCH_KEEP)), &regmatch) == FAIL)
-       return FAIL;
-
-    /* Zero-width pattern should match somewhere, then we can check if start
-     * and end are in the same position. */
-    nmatched = vim_regexec_multi(&regmatch, curwin, curbuf,
-                                    curwin->w_cursor.lnum, (colnr_T)0, NULL);
-    if (called_emsg)
+    /* Is the pattern is zero-width? */
+    zerowidth = is_zerowidth(spats[last_idx].pat);
+    if (zerowidth == -1)
        return FAIL;
-    if (nmatched && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
-                && regmatch.endpos[0].col == regmatch.startpos[0].col)
-       zerowidth = TRUE;
-    vim_free(regmatch.regprog);
 
     /*
      * The trick is to first search backwards and then search forward again,
@@ -4693,6 +4679,43 @@ current_search(count, forward)
 
     return OK;
 }
+
+/*
+ * Check if the pattern is zero-width.
+ * Returns TRUE, FALSE or -1 for failure.
+ */
+    static int
+is_zerowidth(pattern)
+    char_u     *pattern;
+{
+    regmmatch_T        regmatch;
+    int                nmatched = 0;
+    int                result = -1;
+    pos_T       pos;
+
+    if (search_regcomp(pattern, RE_SEARCH, RE_SEARCH,
+                                             SEARCH_KEEP, &regmatch) == FAIL)
+       return -1;
+
+    /* move to match */
+    clearpos(&pos);
+    if (searchit(curwin, curbuf, &pos, FORWARD, spats[last_idx].pat, 1,
+                                    SEARCH_KEEP, RE_SEARCH, 0, NULL) != FAIL)
+    {
+       /* Zero-width pattern should match somewhere, then we can check if
+        * start and end are in the same position. */
+       nmatched = vim_regexec_multi(&regmatch, curwin, curbuf,
+                                                 pos.lnum, (colnr_T)0, NULL);
+
+       if (!called_emsg)
+           result = (nmatched != 0
+                   && regmatch.startpos[0].lnum == regmatch.endpos[0].lnum
+                   && regmatch.startpos[0].col == regmatch.endpos[0].col);
+    }
+
+    vim_free(regmatch.regprog);
+    return result;
+}
 #endif /* FEAT_VISUAL */
 
 #if defined(FEAT_LISP) || defined(FEAT_CINDENT) || defined(FEAT_TEXTOBJ) \
index 5551da4be9f7513baea304813c4966653ac921d9..88836bc452db5ca83dce98b4ffc1c280e98637bb 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    636,
 /**/
     635,
 /**/