From 63b9254b8e38329d98f5400339ec563abd953444 Mon Sep 17 00:00:00 2001
From: Bram Moolenaar <Bram@vim.org>
Date: Tue, 27 Mar 2007 14:57:09 +0000
Subject: [PATCH] updated for version 7.0-224

---
 src/eval.c             |  2 +-
 src/ex_docmd.c         | 28 ++++++++++++++++++++--------
 src/proto/ex_docmd.pro |  2 +-
 src/version.c          |  2 ++
 4 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/src/eval.c b/src/eval.c
index ea8361524c..e895b997b9 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -8924,7 +8924,7 @@ f_expand(argvars, rettv)
     if (*s == '%' || *s == '#' || *s == '<')
     {
 	++emsg_off;
-	rettv->vval.v_string = eval_vars(s, &len, NULL, &errormsg, s);
+	rettv->vval.v_string = eval_vars(s, s, &len, NULL, &errormsg, NULL);
 	--emsg_off;
     }
     else
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 71a7fa1801..3cb064e9c2 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -4176,6 +4176,7 @@ expand_filename(eap, cmdlinep, errormsgp)
     int		srclen;
     char_u	*p;
     int		n;
+    int		escaped;
 
 #ifdef FEAT_QUICKFIX
     /* Skip a regexp pattern for ":vimgrep[add] pat file..." */
@@ -4216,7 +4217,8 @@ expand_filename(eap, cmdlinep, errormsgp)
 	/*
 	 * Try to find a match at this position.
 	 */
-	repl = eval_vars(p, &srclen, &(eap->do_ecmd_lnum), errormsgp, eap->arg);
+	repl = eval_vars(p, eap->arg, &srclen, &(eap->do_ecmd_lnum),
+							 errormsgp, &escaped);
 	if (*errormsgp != NULL)		/* error detected */
 	    return FAIL;
 	if (repl == NULL)		/* no match found */
@@ -4235,11 +4237,15 @@ expand_filename(eap, cmdlinep, errormsgp)
 	    vim_free(l);
 	}
 
-	/* Need to escape white space et al. with a backslash.  Don't do this
-	 * for shell commands (may have to use quotes instead).  Don't do this
-	 * for non-unix systems when there is a single argument (spaces don't
-	 * separate arguments then). */
+	/* Need to escape white space et al. with a backslash.
+	 * Don't do this for:
+	 * - replacement that already has been escaped: "##"
+	 * - shell commands (may have to use quotes instead).
+	 * - non-unix systems when there is a single argument (spaces don't
+	 *   separate arguments then).
+	 */
 	if (!eap->usefilter
+		&& !escaped
 		&& eap->cmdidx != CMD_bang
 		&& eap->cmdidx != CMD_make
 		&& eap->cmdidx != CMD_lmake
@@ -9280,12 +9286,14 @@ ex_tag_cmd(eap, name)
  * number of characters to skip.
  */
     char_u *
-eval_vars(src, usedlen, lnump, errormsg, srcstart)
+eval_vars(src, srcstart, usedlen, lnump, errormsg, escaped)
     char_u	*src;		/* pointer into commandline */
+    char_u	*srcstart;	/* beginning of valid memory for src */
     int		*usedlen;	/* characters after src that are used */
     linenr_T	*lnump;		/* line number for :e command, or NULL */
     char_u	**errormsg;	/* pointer to error message */
-    char_u	*srcstart;	/* beginning of valid memory for src */
+    int		*escaped;	/* return value has escaped white space (can
+				 * be NULL) */
 {
     int		i;
     char_u	*s;
@@ -9332,6 +9340,8 @@ eval_vars(src, usedlen, lnump, errormsg, srcstart)
 #endif
 
     *errormsg = NULL;
+    if (escaped != NULL)
+	*escaped = FALSE;
 
     /*
      * Check if there is something to do.
@@ -9407,6 +9417,8 @@ eval_vars(src, usedlen, lnump, errormsg, srcstart)
 		    result = arg_all();
 		    resultbuf = result;
 		    *usedlen = 2;
+		    if (escaped != NULL)
+			*escaped = TRUE;
 #ifdef FEAT_MODIFY_FNAME
 		    skip_mod = TRUE;
 #endif
@@ -9627,7 +9639,7 @@ expand_sfile(arg)
 	else
 	{
 	    /* replace "<sfile>" with the sourced file name, and do ":" stuff */
-	    repl = eval_vars(p, &srclen, NULL, &errormsg, result);
+	    repl = eval_vars(p, result, &srclen, NULL, &errormsg, NULL);
 	    if (errormsg != NULL)
 	    {
 		if (*errormsg)
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index 992409b2b4..50d0643c3b 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -44,7 +44,7 @@ extern int vim_mkdir_emsg __ARGS((char_u *name, int prot));
 extern FILE *open_exfile __ARGS((char_u *fname, int forceit, char *mode));
 extern void update_topline_cursor __ARGS((void));
 extern void exec_normal_cmd __ARGS((char_u *cmd, int remap, int silent));
-extern char_u *eval_vars __ARGS((char_u *src, int *usedlen, linenr_T *lnump, char_u **errormsg, char_u *srcstart));
+extern char_u *eval_vars __ARGS((char_u *src, char_u *srcstart, int *usedlen, linenr_T *lnump, char_u **errormsg, int *escaped));
 extern char_u *expand_sfile __ARGS((char_u *arg));
 extern int put_eol __ARGS((FILE *fd));
 extern int put_line __ARGS((FILE *fd, char *s));
diff --git a/src/version.c b/src/version.c
index 81b8f49930..3c8b1733e4 100644
--- a/src/version.c
+++ b/src/version.c
@@ -666,6 +666,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    224,
 /**/
     223,
 /**/
-- 
GitLab