| To: vim-dev@vim.org |
| Subject: Patch 7.0.111 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.0.111 |
| Problem: The gzip plugin can't handle filenames with single quotes. |
| Solution: Add and use the shellescape() function. (partly by Alexey Froloff) |
| Files: runtime/autoload/gzip.vim, runtime/doc/eval.txt, src/eval.c, |
| src/mbyte.c, src/misc2.c, src/proto/misc2.pro |
| |
| |
| |
| |
| |
| *** 1,6 **** |
| " Vim autoload file for editing compressed files. |
| " Maintainer: Bram Moolenaar <Bram@vim.org> |
| ! " Last Change: 2006 Jul 19 |
| |
| " These functions are used by the gzip plugin. |
| |
| --- 1,6 ---- |
| " Vim autoload file for editing compressed files. |
| " Maintainer: Bram Moolenaar <Bram@vim.org> |
| ! " Last Change: 2006 Oct 03 |
| |
| " These functions are used by the gzip plugin. |
| |
| |
| *** 68,76 **** |
| let tmp = tempname() |
| let tmpe = tmp . "." . expand("<afile>:e") |
| " write the just read lines to a temp file "'[,']w tmp.gz" |
| ! execute "silent '[,']w " . tmpe |
| " uncompress the temp file: call system("gzip -dn tmp.gz") |
| ! call system(a:cmd . " " . tmpe) |
| if !filereadable(tmp) |
| " uncompress didn't work! Keep the compressed file then. |
| echoerr "Error: Could not read uncompressed file" |
| --- 68,76 ---- |
| let tmp = tempname() |
| let tmpe = tmp . "." . expand("<afile>:e") |
| " write the just read lines to a temp file "'[,']w tmp.gz" |
| ! execute "silent '[,']w " . escape(tmpe, ' ') |
| " uncompress the temp file: call system("gzip -dn tmp.gz") |
| ! call system(a:cmd . " " . s:escape(tmpe)) |
| if !filereadable(tmp) |
| " uncompress didn't work! Keep the compressed file then. |
| echoerr "Error: Could not read uncompressed file" |
| |
| *** 127,135 **** |
| let nmt = s:tempname(nm) |
| if rename(nm, nmt) == 0 |
| if exists("b:gzip_comp_arg") |
| ! call system(a:cmd . " " . b:gzip_comp_arg . " '" . nmt . "'") |
| else |
| ! call system(a:cmd . " '" . nmt . "'") |
| endif |
| call rename(nmt . "." . expand("<afile>:e"), nm) |
| endif |
| --- 127,135 ---- |
| let nmt = s:tempname(nm) |
| if rename(nm, nmt) == 0 |
| if exists("b:gzip_comp_arg") |
| ! call system(a:cmd . " " . b:gzip_comp_arg . " " . s:escape(nmt)) |
| else |
| ! call system(a:cmd . " " . s:escape(nmt)) |
| endif |
| call rename(nmt . "." . expand("<afile>:e"), nm) |
| endif |
| |
| *** 154,163 **** |
| if rename(nm, nmte) == 0 |
| if &patchmode != "" && getfsize(nm . &patchmode) == -1 |
| " Create patchmode file by creating the decompressed file new |
| ! call system(a:cmd . " -c " . nmte . " > " . nmt) |
| call rename(nmte, nm . &patchmode) |
| else |
| ! call system(a:cmd . " " . nmte) |
| endif |
| call rename(nmt, nm) |
| endif |
| --- 154,163 ---- |
| if rename(nm, nmte) == 0 |
| if &patchmode != "" && getfsize(nm . &patchmode) == -1 |
| " Create patchmode file by creating the decompressed file new |
| ! call system(a:cmd . " -c " . s:escape(nmte) . " > " . s:escape(nmt)) |
| call rename(nmte, nm . &patchmode) |
| else |
| ! call system(a:cmd . " " . s:escape(nmte)) |
| endif |
| call rename(nmt, nm) |
| endif |
| |
| *** 173,178 **** |
| --- 173,186 ---- |
| return fn |
| endif |
| return fnamemodify(a:name, ":p:h") . "/X~=@l9q5" |
| + endfun |
| + |
| + fun s:escape(name) |
| + " shellescape() was added by patch 7.0.111 |
| + if v:version > 700 || (v:version == 700 && has('patch111')) |
| + return shellescape(a:name) |
| + endif |
| + return "'" . a:name . "'" |
| endfun |
| |
| " vim: set sw=2 : |
| |
| |
| |
| *** 1,4 **** |
| ! *eval.txt* For Vim version 7.0. Last change: 2006 Sep 09 |
| |
| |
| VIM REFERENCE MANUAL by Bram Moolenaar |
| --- 1,4 ---- |
| ! *eval.txt* For Vim version 7.0. Last change: 2006 Sep 22 |
| |
| |
| VIM REFERENCE MANUAL by Bram Moolenaar |
| |
| *** 1709,1714 **** |
| --- 1715,1722 ---- |
| 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} |
| |
| *** 4434,4439 **** |
| --- 4457,4477 ---- |
| :call setwinvar(1, "&list", 0) |
| :call setwinvar(2, "myvar", "foobar") |
| |
| + shellescape({string}) *shellescape()* |
| + Escape {string} for use as shell command argument. |
| + On MS-Windows and MS-DOS, when 'shellslash' is not set, it |
| + will enclose {string} double quotes and double all double |
| + quotes within {string}. |
| + For other systems, it will enclose {string} in single quotes |
| + and replace all "'" with "'\''". |
| + Example: > |
| + :echo shellescape('c:\program files\vim') |
| + < results in: |
| + "c:\program files\vim" ~ |
| + Example usage: > |
| + :call system("chmod +x -- " . shellescape(expand("%"))) |
| + |
| + |
| simplify({filename}) *simplify()* |
| Simplify the file name as much as possible without changing |
| the meaning. Shortcuts (on MS-Windows) or symbolic links (on |
| |
| |
| |
| *** 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)); |
| |
| *** 7146,7151 **** |
| --- 7147,7153 ---- |
| {"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}, |
| |
| *** 14602,14607 **** |
| --- 14604,14621 ---- |
| } |
| #endif |
| } |
| + } |
| + |
| + /* |
| + * "shellescape({string})" function |
| + */ |
| + static void |
| + f_shellescape(argvars, rettv) |
| + typval_T *argvars; |
| + typval_T *rettv; |
| + { |
| + rettv->vval.v_string = vim_strsave_shellescape(get_tv_string(&argvars[0])); |
| + rettv->v_type = VAR_STRING; |
| } |
| |
| /* |
| |
| |
| |
| *** 1229,1234 **** |
| --- 1229,1322 ---- |
| return escaped_string; |
| } |
| |
| + #if defined(FEAT_EVAL) || defined(PROTO) |
| + /* |
| + * 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). |
| + * Returns the result in allocated memory, NULL if we have run out. |
| + */ |
| + char_u * |
| + vim_strsave_shellescape(string) |
| + char_u *string; |
| + { |
| + unsigned length; |
| + char_u *p; |
| + char_u *d; |
| + char_u *escaped_string; |
| + |
| + /* First count the number of extra bytes required. */ |
| + length = STRLEN(string) + 3; /* two quotes and the trailing NUL */ |
| + for (p = string; *p != NUL; mb_ptr_adv(p)) |
| + { |
| + # if defined(WIN32) || defined(WIN16) || defined(DOS) |
| + if (!p_ssl) |
| + { |
| + if (*p == '"') |
| + ++length; /* " -> "" */ |
| + } |
| + else |
| + # endif |
| + if (*p == '\'') |
| + length += 3; /* ' => '\'' */ |
| + } |
| + |
| + /* Allocate memory for the result and fill it. */ |
| + escaped_string = alloc(length); |
| + if (escaped_string != NULL) |
| + { |
| + d = escaped_string; |
| + |
| + /* add opening quote */ |
| + # if defined(WIN32) || defined(WIN16) || defined(DOS) |
| + if (!p_ssl) |
| + *d++ = '"'; |
| + else |
| + # endif |
| + *d++ = '\''; |
| + |
| + for (p = string; *p != NUL; ) |
| + { |
| + # if defined(WIN32) || defined(WIN16) || defined(DOS) |
| + if (!p_ssl) |
| + { |
| + if (*p == '"') |
| + { |
| + *d++ = '"'; |
| + *d++ = '"'; |
| + ++p; |
| + continue; |
| + } |
| + } |
| + else |
| + # endif |
| + if (*p == '\'') |
| + { |
| + *d++='\''; |
| + *d++='\\'; |
| + *d++='\''; |
| + *d++='\''; |
| + ++p; |
| + continue; |
| + } |
| + |
| + MB_COPY_CHAR(p, d); |
| + } |
| + |
| + /* add terminating quote and finish with a NUL */ |
| + # if defined(WIN32) || defined(WIN16) || defined(DOS) |
| + if (!p_ssl) |
| + *d++ = '"'; |
| + else |
| + # endif |
| + *d++ = '\''; |
| + *d = NUL; |
| + } |
| + |
| + return escaped_string; |
| + } |
| + #endif |
| + |
| /* |
| * Like vim_strsave(), but make all characters uppercase. |
| * This uses ASCII lower-to-upper case translation, language independent. |
| |
| |
| |
| *** 29,34 **** |
| --- 29,35 ---- |
| extern char_u *vim_strnsave __ARGS((char_u *string, int len)); |
| extern char_u *vim_strsave_escaped __ARGS((char_u *string, char_u *esc_chars)); |
| extern char_u *vim_strsave_escaped_ext __ARGS((char_u *string, char_u *esc_chars, int cc, int bsl)); |
| + extern char_u *vim_strsave_shellescape __ARGS((char_u *string)); |
| extern char_u *vim_strsave_up __ARGS((char_u *string)); |
| extern char_u *vim_strnsave_up __ARGS((char_u *string, int len)); |
| extern void vim_strup __ARGS((char_u *p)); |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 111, |
| /**/ |
| |
| -- |
| The only way the average employee can speak to an executive is by taking a |
| second job as a golf caddie. |
| (Scott Adams - The Dilbert principle) |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ download, build and distribute -- http://www.A-A-P.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |