* Alexey I. Froloff <raorn@> [060816 12:23]:
> > >A patch for the documentation is missing, this is required to see what
> > >the intention of shellescape() is.
> OK, I'll update patch.
Attached, fixed, documented, tested.  In whatever order ;-)

P.S.  I don't have cproto and can't "make proto"...

-- 
Regards,
Sir Raorn.
diff -crNp ../vim70.orig/runtime/doc/eval.txt ./runtime/doc/eval.txt
*** ../vim70.orig/runtime/doc/eval.txt  Sun May  7 16:16:44 2006
--- ./runtime/doc/eval.txt      Wed Aug 16 12:43:40 2006
***************
*** 1,4 ****
! *eval.txt*      For Vim version 7.0.  Last change: 2006 May 06
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
--- 1,4 ----
! *eval.txt*      For Vim version 7.0.  Last change: 2006 Aug 16
  
  
                  VIM REFERENCE MANUAL    by Bram Moolenaar
*************** setreg( {n}, {v}[, {opt}])      Number  set re
*** 1709,1714 ****
--- 1709,1716 ----
  settabwinvar( {tabnr}, {winnr}, {varname}, {val})    set {varname} in window
                                        {winnr} in tab page {tabnr} to {val}
  setwinvar( {nr}, {varname}, {val})    set {varname} in window {nr} to {val}
+ shellescape( {string})                String  escape {string} for use as shell
+                                       command argument
  simplify( {filename})         String  simplify filename as much as possible
  sort( {list} [, {func}])      List    sort {list}, using {func} to compare
  soundfold( {word})            String  sound-fold {word}
*************** setwinvar({nr}, {varname}, {val})                       *set
*** 4434,4439 ****
--- 4436,4454 ----
                        :call setwinvar(1, "&list", 0)
                        :call setwinvar(2, "myvar", "foobar")
  
+ shellescape({string})                                 *shellescape()*
+               Escape {string} for use as shell command argument.
+               On Unix, it will enclose {string} in single quotes and replace
+               all "'" with "'\''" within {string}.
+               On Windows and DOS, it will enclose {string} double quotes and
+               strip all double quotes within {string}.
+               On other platforms untouched {string} is returned.
+               Example: >
+                       :echo shellescape('c:\program files\vim')
+ <             results in: >
+                       "c:\program files\vim"
+ <             Example usage: >
+                       :call system("chmod +x -- " . escapeshell(expand("%")))
  simplify({filename})                                  *simplify()*
                Simplify the file name as much as possible without changing
                the meaning.  Shortcuts (on MS-Windows) or symbolic links (on
diff -crNp ../vim70.orig/runtime/doc/tags ./runtime/doc/tags
*** ../vim70.orig/runtime/doc/tags      Sun May  7 17:33:26 2006
--- ./runtime/doc/tags  Wed Aug 16 12:42:26 2006
*************** sftp    pi_netrw.txt    /*sftp*
*** 6831,6836 ****
--- 6831,6837 ----
  sgml.vim      syntax.txt      /*sgml.vim*
  sh.vim        syntax.txt      /*sh.vim*
  shell-window  tips.txt        /*shell-window*
+ shellescape() eval.txt        /*shellescape()*
  shell_error-variable  eval.txt        /*shell_error-variable*
  shift intro.txt       /*shift*
  shift-left-right      change.txt      /*shift-left-right*
diff -crNp ../vim70.orig/src/eval.c ./src/eval.c
*** ../vim70.orig/src/eval.c    Wed Aug 16 11:44:57 2006
--- ./src/eval.c        Wed Aug 16 11:46:14 2006
*************** static void f_setqflist __ARGS((typval_T
*** 622,627 ****
--- 622,628 ----
  static void f_setreg __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_settabwinvar __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_setwinvar __ARGS((typval_T *argvars, typval_T *rettv));
+ static void f_shellescape __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_simplify __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_sort __ARGS((typval_T *argvars, typval_T *rettv));
  static void f_soundfold __ARGS((typval_T *argvars, typval_T *rettv));
*************** static struct fst
*** 7139,7144 ****
--- 7140,7146 ----
      {"setreg",                2, 3, f_setreg},
      {"settabwinvar",  4, 4, f_settabwinvar},
      {"setwinvar",     3, 3, f_setwinvar},
+     {"shellescape",   1, 1, f_shellescape},
      {"simplify",      1, 1, f_simplify},
      {"sort",          1, 2, f_sort},
      {"soundfold",     1, 1, f_soundfold},
*************** setwinvar(argvars, rettv, off)
*** 14609,14614 ****
--- 14611,14630 ----
  }
  
  /*
+  * "shellescape({string})" function
+  */
+     static void
+ f_shellescape(argvars, rettv)
+     typval_T  *argvars;
+     typval_T  *rettv;
+ {
+     char_u    buf[NUMBUFLEN];
+ 
+     rettv->vval.v_string = 
vim_strsave_shell_escape(get_tv_string(&argvars[0]));
+     rettv->v_type = VAR_STRING;
+ }
+ 
+ /*
   * "simplify()" function
   */
      static void
diff -crNp ../vim70.orig/src/misc2.c ./src/misc2.c
*** ../vim70.orig/src/misc2.c   Thu May  4 16:12:38 2006
--- ./src/misc2.c       Wed Aug 16 12:27:27 2006
*************** vim_strsave_escaped_ext(string, esc_char
*** 1230,1235 ****
--- 1230,1336 ----
  }
  
  /*
+  * Like vim_strsave_escaped(), but escape string for use as command
+  * argument in system().
+  */
+     char_u *
+ vim_strsave_shell_escape(string)
+     char_u    *string;
+ {
+     char_u    *p;
+     char_u    *p2;
+     char_u    *escaped_string;
+     unsigned  length;
+ #ifdef FEAT_MBYTE
+     int               l;
+ #endif
+ 
+     /*
+      * First count the number of escaped characters required.
+      * Then allocate the memory and insert them.
+      */
+     length = 3;                               /* two quotes and the trailing 
NUL */
+     for (p = string; *p; p++)
+     {
+ #ifdef FEAT_MBYTE
+       if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
+       {
+           length += l;                /* count a multibyte char */
+           p += l - 1;
+           continue;
+       }
+ #endif
+       switch (*p)
+       {
+ #if defined(WIN32) || defined(WIN16) || defined(DOS)
+           case '"':
+               break;                  /* strip quotes */
+ #else
+ # if defined(UNIX)
+           case '\'':
+               length+=4;              /* ' => '\'' */
+               break;
+ # endif
+ #endif
+           default:
+               ++length;               /* count an ordinary char */
+               break;
+       }
+     }
+     escaped_string = alloc(length);
+     if (escaped_string != NULL)
+     {
+       p2 = escaped_string;
+ #if defined(WIN32) || defined(WIN16) || defined(DOS)
+       *p2++ = '"';
+ #else
+ # if defined(UNIX)
+       *p2++ = '\'';
+ # endif
+ #endif
+       for (p = string; *p; p++)
+       {
+ #ifdef FEAT_MBYTE
+           if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
+           {
+               mch_memmove(p2, p, (size_t)l);
+               p2 += l;
+               p += l - 1;             /* skip multibyte char  */
+               continue;
+           }
+ #endif
+           switch (*p) {
+ #if defined(WIN32) || defined(WIN16) || defined(DOS)
+               case '"':
+                   break;              /* strip quotes */
+ #else
+ # if defined(UNIX)
+               case '\'':
+                   *p2++='\'';
+                   *p2++='\\';
+                   *p2++='\'';
+                   *p2++='\'';
+                   break;
+ # endif
+ #endif
+               default:
+                   *p2++ = *p;
+                   break;
+           }
+       }
+ #if defined(WIN32) || defined(WIN16) || defined(DOS)
+       *p2++ = '"';
+ #else
+ # if defined(UNIX)
+       *p2++ = '\'';
+ # endif
+ #endif
+       *p2 = NUL;
+     }
+     return escaped_string;
+ }
+ 
+ /*
   * Like vim_strsave(), but make all characters uppercase.
   * This uses ASCII lower-to-upper case translation, language independent.
   */

Attachment: signature.asc
Description: Digital signature

Reply via email to