Mercurial > vim
diff src/os_unix.c @ 628:efb7557aea10
updated for version 7.0181
author | vimboss |
---|---|
date | Sat, 14 Jan 2006 21:18:42 +0000 |
parents | ba54311bc43e |
children | 68a196b7504d |
line wrap: on
line diff
--- a/src/os_unix.c +++ b/src/os_unix.c @@ -4852,6 +4852,8 @@ mch_expandpath(gap, path, flags) # define SEEK_END 2 #endif +#define SHELL_SPECIAL (char_u *)"\t \"&';<>[\\]|" + /* ARGSUSED */ int mch_expand_wildcards(num_pat, pat, num_file, file, flags) @@ -5048,22 +5050,12 @@ mch_expand_wildcards(num_pat, pat, num_f len += STRLEN(pat[i]) + 3; /* add space and two quotes */ #else ++len; /* add space */ - for (j = 0; pat[i][j] != NUL; ) - if (vim_strchr((char_u *)" ';&<>", pat[i][j]) != NULL) - { - len += 2; /* add two quotes */ - while (pat[i][j] != NUL - && vim_strchr((char_u *)" ';&<>", pat[i][j]) != NULL) - { - ++len; - ++j; - } - } - else - { - ++len; - ++j; - } + for (j = 0; pat[i][j] != NUL; ++j) + { + if (vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL) + ++len; /* may add a backslash */ + ++len; + } #endif } command = alloc(len); @@ -5084,9 +5076,11 @@ mch_expand_wildcards(num_pat, pat, num_f */ if (shell_style == STYLE_BT) { - STRCPY(command, pat[0] + 1); /* exclude first backtick */ + /* change `command; command& ` to (command; command ) */ + STRCPY(command, "("); + STRCAT(command, pat[0] + 1); /* exclude first backtick */ p = command + STRLEN(command) - 1; - *p = ' '; /* remove last backtick */ + *p-- = ')'; /* remove last backtick */ while (p > command && vim_iswhite(*p)) --p; if (*p == '&') /* remove trailing '&' */ @@ -5114,8 +5108,8 @@ mch_expand_wildcards(num_pat, pat, num_f for (i = 0; i < num_pat; ++i) { /* When using system() always add extra quotes, because the shell - * is started twice. Otherwise only put quotes around spaces and - * single quotes. */ + * is started twice. Otherwise put a backslash before special + * characters, except insice ``. */ #ifdef USE_SYSTEM STRCAT(command, " \""); STRCAT(command, pat[i]); @@ -5125,30 +5119,32 @@ mch_expand_wildcards(num_pat, pat, num_f p = command + STRLEN(command); *p++ = ' '; - for (j = 0; pat[i][j] != NUL; ) + for (j = 0; pat[i][j] != NUL; ++j) { if (pat[i][j] == '`') { intick = !intick; - *p++ = pat[i][j++]; + *p++ = pat[i][j]; } - else if (!intick && vim_strchr((char_u *)" ';&<>", + else if (pat[i][j] == '\\' && pat[i][j + 1] != NUL) + { + /* Remove a backslash, take char literally. */ + *p++ = pat[i][++j]; + } + else if (!intick && vim_strchr(SHELL_SPECIAL, pat[i][j]) != NULL) { - /* Put quotes around special characters, but not when - * inside ``. */ - *p++ = '"'; - while (pat[i][j] != NUL && vim_strchr((char_u *)" ';&<>", - pat[i][j]) != NULL) - *p++ = pat[i][j++]; - *p++ = '"'; + /* Put a backslash before a special character, but not + * when inside ``. */ + *p++ = '\\'; + *p++ = pat[i][j]; } else { /* For a backslash also copy the next character, don't * want to put quotes around it. */ - if ((*p++ = pat[i][j++]) == '\\' && pat[i][j] != NUL) - *p++ = pat[i][j++]; + if ((*p++ = pat[i][j]) == '\\' && pat[i][j + 1] != NUL) + *p++ = pat[i][++j]; } } *p = NUL;