Karsten Hopp 03d5e4
To: vim-dev@vim.org
Karsten Hopp 03d5e4
Subject: Patch 7.2.010
Karsten Hopp 03d5e4
Fcc: outbox
Karsten Hopp 03d5e4
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 03d5e4
Mime-Version: 1.0
Karsten Hopp 03d5e4
Content-Type: text/plain; charset=ISO-8859-1
Karsten Hopp 03d5e4
Content-Transfer-Encoding: 8bit
Karsten Hopp 03d5e4
------------
Karsten Hopp 03d5e4
Karsten Hopp 03d5e4
Patch 7.2.010
Karsten Hopp 03d5e4
Problem:    When using "K" in Visual mode not all characters are properly
Karsten Hopp 03d5e4
	    escaped. (Ben Schmidt)
Karsten Hopp 03d5e4
Solution:   Use a function with the functionality of shellescape(). (Jan
Karsten Hopp 03d5e4
	    Minar)
Karsten Hopp 03d5e4
Files:	    src/mbyte.c, src/misc2.c, src/normal.c
Karsten Hopp 03d5e4
Karsten Hopp 03d5e4
Karsten Hopp 03d5e4
*** ../vim-7.2.009/src/mbyte.c	Wed Aug  6 18:45:36 2008
Karsten Hopp 03d5e4
--- src/mbyte.c	Wed Sep  3 22:34:48 2008
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 2540,2546 ****
Karsten Hopp 03d5e4
      return (int)(p - q);
Karsten Hopp 03d5e4
  }
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
- #if defined(FEAT_EVAL) || defined(PROTO)
Karsten Hopp 03d5e4
  /*
Karsten Hopp 03d5e4
   * Copy a character from "*fp" to "*tp" and advance the pointers.
Karsten Hopp 03d5e4
   */
Karsten Hopp 03d5e4
--- 2540,2545 ----
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 2555,2561 ****
Karsten Hopp 03d5e4
      *tp += l;
Karsten Hopp 03d5e4
      *fp += l;
Karsten Hopp 03d5e4
  }
Karsten Hopp 03d5e4
- #endif
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
  /*
Karsten Hopp 03d5e4
   * Return the offset from "p" to the first byte of a character.  When "p" is
Karsten Hopp 03d5e4
--- 2554,2559 ----
Karsten Hopp 03d5e4
*** ../vim-7.2.009/src/misc2.c	Thu Jul 24 20:28:58 2008
Karsten Hopp 03d5e4
--- src/misc2.c	Wed Sep  3 22:05:21 2008
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 1257,1263 ****
Karsten Hopp 03d5e4
      return escaped_string;
Karsten Hopp 03d5e4
  }
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
- #if !defined(BACKSLASH_IN_FILENAME) || defined(FEAT_EVAL) || defined(PROTO)
Karsten Hopp 03d5e4
  /*
Karsten Hopp 03d5e4
   * Return TRUE when 'shell' has "csh" in the tail.
Karsten Hopp 03d5e4
   */
Karsten Hopp 03d5e4
--- 1257,1262 ----
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 1266,1274 ****
Karsten Hopp 03d5e4
  {
Karsten Hopp 03d5e4
      return (strstr((char *)gettail(p_sh), "csh") != NULL);
Karsten Hopp 03d5e4
  }
Karsten Hopp 03d5e4
- #endif
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
- #if defined(FEAT_EVAL) || defined(PROTO)
Karsten Hopp 03d5e4
  /*
Karsten Hopp 03d5e4
   * Escape "string" for use as a shell argument with system().
Karsten Hopp 03d5e4
   * This uses single quotes, except when we know we need to use double qoutes
Karsten Hopp 03d5e4
--- 1265,1271 ----
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 1391,1397 ****
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
      return escaped_string;
Karsten Hopp 03d5e4
  }
Karsten Hopp 03d5e4
- #endif
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
  /*
Karsten Hopp 03d5e4
   * Like vim_strsave(), but make all characters uppercase.
Karsten Hopp 03d5e4
--- 1388,1393 ----
Karsten Hopp 03d5e4
*** ../vim-7.2.009/src/normal.c	Thu Jul 31 22:03:54 2008
Karsten Hopp 03d5e4
--- src/normal.c	Sat Sep  6 15:06:07 2008
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 5469,5474 ****
Karsten Hopp 03d5e4
--- 5469,5479 ----
Karsten Hopp 03d5e4
  		STRCPY(buf, "he! ");
Karsten Hopp 03d5e4
  	    else
Karsten Hopp 03d5e4
  	    {
Karsten Hopp 03d5e4
+ 		/* An external command will probably use an argument starting
Karsten Hopp 03d5e4
+ 		 * with "-" as an option.  To avoid trouble we skip the "-". */
Karsten Hopp 03d5e4
+ 		while (*ptr == '-')
Karsten Hopp 03d5e4
+ 		    ++ptr;
Karsten Hopp 03d5e4
+ 
Karsten Hopp 03d5e4
  		/* When a count is given, turn it into a range.  Is this
Karsten Hopp 03d5e4
  		 * really what we want? */
Karsten Hopp 03d5e4
  		isman = (STRCMP(kp, "man") == 0);
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 5511,5547 ****
Karsten Hopp 03d5e4
      /*
Karsten Hopp 03d5e4
       * Now grab the chars in the identifier
Karsten Hopp 03d5e4
       */
Karsten Hopp 03d5e4
!     if (cmdchar == '*')
Karsten Hopp 03d5e4
! 	aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
Karsten Hopp 03d5e4
!     else if (cmdchar == '#')
Karsten Hopp 03d5e4
! 	aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
Karsten Hopp 03d5e4
!     else if (cmdchar == 'K' && !kp_help)
Karsten Hopp 03d5e4
! 	aux_ptr = (char_u *)" \t\\\"|!";
Karsten Hopp 03d5e4
!     else
Karsten Hopp 03d5e4
! 	/* Don't escape spaces and Tabs in a tag with a backslash */
Karsten Hopp 03d5e4
! 	aux_ptr = (char_u *)"\\|\"";
Karsten Hopp 03d5e4
! 
Karsten Hopp 03d5e4
!     p = buf + STRLEN(buf);
Karsten Hopp 03d5e4
!     while (n-- > 0)
Karsten Hopp 03d5e4
!     {
Karsten Hopp 03d5e4
! 	/* put a backslash before \ and some others */
Karsten Hopp 03d5e4
! 	if (vim_strchr(aux_ptr, *ptr) != NULL)
Karsten Hopp 03d5e4
! 	    *p++ = '\\';
Karsten Hopp 03d5e4
! #ifdef FEAT_MBYTE
Karsten Hopp 03d5e4
! 	/* When current byte is a part of multibyte character, copy all bytes
Karsten Hopp 03d5e4
! 	 * of that character. */
Karsten Hopp 03d5e4
! 	if (has_mbyte)
Karsten Hopp 03d5e4
  	{
Karsten Hopp 03d5e4
! 	    int i;
Karsten Hopp 03d5e4
! 	    int len = (*mb_ptr2len)(ptr) - 1;
Karsten Hopp 03d5e4
! 
Karsten Hopp 03d5e4
! 	    for (i = 0; i < len && n >= 1; ++i, --n)
Karsten Hopp 03d5e4
! 		*p++ = *ptr++;
Karsten Hopp 03d5e4
  	}
Karsten Hopp 03d5e4
  #endif
Karsten Hopp 03d5e4
! 	*p++ = *ptr++;
Karsten Hopp 03d5e4
      }
Karsten Hopp 03d5e4
-     *p = NUL;
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
      /*
Karsten Hopp 03d5e4
       * Execute the command.
Karsten Hopp 03d5e4
--- 5516,5572 ----
Karsten Hopp 03d5e4
      /*
Karsten Hopp 03d5e4
       * Now grab the chars in the identifier
Karsten Hopp 03d5e4
       */
Karsten Hopp 03d5e4
!     if (cmdchar == 'K' && !kp_help)
Karsten Hopp 03d5e4
!     {
Karsten Hopp 03d5e4
! 	/* Escape the argument properly for a shell command */
Karsten Hopp 03d5e4
! 	p = vim_strsave_shellescape(ptr, TRUE);
Karsten Hopp 03d5e4
! 	if (p == NULL)
Karsten Hopp 03d5e4
  	{
Karsten Hopp 03d5e4
! 	    vim_free(buf);
Karsten Hopp 03d5e4
! 	    return;
Karsten Hopp 03d5e4
  	}
Karsten Hopp 03d5e4
+ 	buf = (char_u *)vim_realloc(buf, STRLEN(buf) + STRLEN(p) + 1);
Karsten Hopp 03d5e4
+ 	if (buf == NULL)
Karsten Hopp 03d5e4
+ 	{
Karsten Hopp 03d5e4
+ 	    vim_free(buf);
Karsten Hopp 03d5e4
+ 	    vim_free(p);
Karsten Hopp 03d5e4
+ 	    return;
Karsten Hopp 03d5e4
+ 	}
Karsten Hopp 03d5e4
+ 	STRCAT(buf, p);
Karsten Hopp 03d5e4
+ 	vim_free(p);
Karsten Hopp 03d5e4
+     }
Karsten Hopp 03d5e4
+     else
Karsten Hopp 03d5e4
+     {
Karsten Hopp 03d5e4
+ 	if (cmdchar == '*')
Karsten Hopp 03d5e4
+ 	    aux_ptr = (char_u *)(p_magic ? "/.*~[^$\\" : "/^$\\");
Karsten Hopp 03d5e4
+ 	else if (cmdchar == '#')
Karsten Hopp 03d5e4
+ 	    aux_ptr = (char_u *)(p_magic ? "/?.*~[^$\\" : "/?^$\\");
Karsten Hopp 03d5e4
+ 	else
Karsten Hopp 03d5e4
+ 	    /* Don't escape spaces and Tabs in a tag with a backslash */
Karsten Hopp 03d5e4
+ 	    aux_ptr = (char_u *)"\\|\"\n*?[";
Karsten Hopp 03d5e4
+ 
Karsten Hopp 03d5e4
+ 	p = buf + STRLEN(buf);
Karsten Hopp 03d5e4
+ 	while (n-- > 0)
Karsten Hopp 03d5e4
+ 	{
Karsten Hopp 03d5e4
+ 	    /* put a backslash before \ and some others */
Karsten Hopp 03d5e4
+ 	    if (vim_strchr(aux_ptr, *ptr) != NULL)
Karsten Hopp 03d5e4
+ 		*p++ = '\\';
Karsten Hopp 03d5e4
+ #ifdef FEAT_MBYTE
Karsten Hopp 03d5e4
+ 	    /* When current byte is a part of multibyte character, copy all
Karsten Hopp 03d5e4
+ 	     * bytes of that character. */
Karsten Hopp 03d5e4
+ 	    if (has_mbyte)
Karsten Hopp 03d5e4
+ 	    {
Karsten Hopp 03d5e4
+ 		int i;
Karsten Hopp 03d5e4
+ 		int len = (*mb_ptr2len)(ptr) - 1;
Karsten Hopp 03d5e4
+ 
Karsten Hopp 03d5e4
+ 		for (i = 0; i < len && n >= 1; ++i, --n)
Karsten Hopp 03d5e4
+ 		    *p++ = *ptr++;
Karsten Hopp 03d5e4
+ 	    }
Karsten Hopp 03d5e4
  #endif
Karsten Hopp 03d5e4
! 	    *p++ = *ptr++;
Karsten Hopp 03d5e4
! 	}
Karsten Hopp 03d5e4
! 	*p = NUL;
Karsten Hopp 03d5e4
      }
Karsten Hopp 03d5e4
  
Karsten Hopp 03d5e4
      /*
Karsten Hopp 03d5e4
       * Execute the command.
Karsten Hopp 03d5e4
*** ../vim-7.2.009/src/version.c	Mon Sep  1 17:56:05 2008
Karsten Hopp 03d5e4
--- src/version.c	Sat Sep  6 16:26:42 2008
Karsten Hopp 03d5e4
***************
Karsten Hopp 03d5e4
*** 678,679 ****
Karsten Hopp 03d5e4
--- 678,681 ----
Karsten Hopp 03d5e4
  {   /* Add new patch number below this line */
Karsten Hopp 03d5e4
+ /**/
Karsten Hopp 03d5e4
+     10,
Karsten Hopp 03d5e4
  /**/
Karsten Hopp 03d5e4
Karsten Hopp 03d5e4
-- 
Karsten Hopp 03d5e4
Q. What happens to programmers when they die?
Karsten Hopp 03d5e4
A: MS-Windows programmers are reinstalled.  C++ programmers become undefined,
Karsten Hopp 03d5e4
   anyone who refers to them will die as well.  Java programmers reincarnate
Karsten Hopp 03d5e4
   after being garbage collected.
Karsten Hopp 03d5e4
Karsten Hopp 03d5e4
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 03d5e4
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 03d5e4
\\\        download, build and distribute -- http://www.A-A-P.org        ///
Karsten Hopp 03d5e4
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///