changeset 1673:553c97222cc0 v7.2b.005

updated for version 7.2b-005
author vimboss
date Wed, 16 Jul 2008 20:43:37 +0000
parents fddea6c03dee
children 1d7f46148bf4
files src/misc2.c src/version.c
diffstat 2 files changed, 26 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/misc2.c
+++ b/src/misc2.c
@@ -1262,7 +1262,9 @@ vim_strsave_escaped_ext(string, esc_char
  * Escape "string" for use as a shell argument with system().
  * This uses single quotes, except when we know we need to use double qoutes
  * (MS-DOS and MS-Windows without 'shellslash' set).
- * Also replace "%", "#" and things like "<cfile>" when "do_special" is TRUE.
+ * Escape a newline, depending on the 'shell' option.
+ * When "do_special" is TRUE also replace "!", "%", "#" and things starting
+ * with "<" like "<cfile>".
  * Returns the result in allocated memory, NULL if we have run out.
  */
     char_u *
@@ -1275,6 +1277,13 @@ vim_strsave_shellescape(string, do_speci
     char_u	*d;
     char_u	*escaped_string;
     int		l;
+    int		csh_like;
+
+    /* Only csh and similar shells expand '!' within single quotes.  For sh and
+     * the like we must not put a backslash before it, it will be taken
+     * literally.  If do_special is set the '!' will be escaped twice.
+     * Csh also needs to have "\n" escaped twice when do_special is set. */
+    csh_like = (strstr((char *)gettail(p_sh), "csh") != NULL);
 
     /* First count the number of extra bytes required. */
     length = (unsigned)STRLEN(string) + 3;  /* two quotes and a trailing NUL */
@@ -1290,6 +1299,12 @@ vim_strsave_shellescape(string, do_speci
 # endif
 	if (*p == '\'')
 	    length += 3;		/* ' => '\'' */
+	if (*p == '\n' || (*p == '!' && (csh_like || do_special)))
+	{
+	    ++length;			/* insert backslash */
+	    if (csh_like && do_special)
+		++length;		/* insert backslash */
+	}
 	if (do_special && find_cmdline_var(p, &l) >= 0)
 	{
 	    ++length;			/* insert backslash */
@@ -1335,6 +1350,14 @@ vim_strsave_shellescape(string, do_speci
 		++p;
 		continue;
 	    }
+	    if (*p == '\n' || (*p == '!' && (csh_like || do_special)))
+	    {
+		*d++ = '\\';
+		if (csh_like && do_special)
+		    *d++ = '\\';
+		*d++ = *p++;
+		continue;
+	    }
 	    if (do_special && find_cmdline_var(p, &l) >= 0)
 	    {
 		*d++ = '\\';		/* insert backslash */
--- a/src/version.c
+++ b/src/version.c
@@ -677,6 +677,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    5,
+/**/
     4,
 /**/
     3,