diff src/buffer.c @ 170:8c60f65311fa v7.0052

updated for version 7.0052
author vimboss
date Sat, 26 Feb 2005 23:04:13 +0000
parents 8b0ee9d57d7f
children 027e316cb4f3
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -2082,25 +2082,38 @@ ExpandBufnames(pat, num_file, file, opti
     char_u	*p;
     int		attempt;
     regprog_T	*prog;
+    char_u	*patc;
 
     *num_file = 0;		    /* return values in case of FAIL */
     *file = NULL;
 
+    /* Make a copy of "pat" and change "^" to "\(^\|[\/]\)". */
+    if (*pat == '^')
+    {
+	patc = alloc((unsigned)STRLEN(pat) + 11);
+	if (patc == NULL)
+	    return FAIL;
+	STRCPY(patc, "\\(^\\|[\\/]\\)");
+	STRCPY(patc + 11, pat + 1);
+    }
+    else
+	patc = pat;
+
     /*
-     * attempt == 1: try match with    '^', match at start
-     * attempt == 2: try match without '^', match anywhere
+     * attempt == 0: try match with    '\<', match at start of word
+     * attempt == 2: try match without '\<', match anywhere
      */
-    for (attempt = 1; attempt <= 2; ++attempt)
+    for (attempt = 0; attempt <= 2; attempt += 2)
     {
-	if (attempt == 2)
+	if (attempt == 2 && patc == pat)
+	    break;	/* there was no anchor, no need to try again */
+	prog = vim_regcomp(patc + attempt, RE_MAGIC);
+	if (prog == NULL)
 	{
-	    if (*pat != '^')	    /* there's no '^', no need to try again */
-		break;
-	    ++pat;		    /* skip the '^' */
+	    if (patc != pat)
+		vim_free(patc);
+	    return FAIL;
 	}
-	prog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0);
-	if (prog == NULL)
-	    return FAIL;
 
 	/*
 	 * round == 1: Count the matches.
@@ -2136,6 +2149,8 @@ ExpandBufnames(pat, num_file, file, opti
 		if (*file == NULL)
 		{
 		    vim_free(prog);
+		    if (patc != pat)
+			vim_free(patc);
 		    return FAIL;
 		}
 	    }
@@ -2145,6 +2160,9 @@ ExpandBufnames(pat, num_file, file, opti
 	    break;
     }
 
+    if (patc != pat)
+	vim_free(patc);
+
     *num_file = count;
     return (count == 0 ? FAIL : OK);
 }