1
0
forked from aniani/vim

updated for version 7.0181

This commit is contained in:
Bram Moolenaar
2006-01-14 21:18:42 +00:00
parent ea8bd73212
commit 316059c019
4 changed files with 46 additions and 44 deletions

View File

@@ -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_file, file, flags)
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_file, file, flags)
*/
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_file, file, flags)
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_file, file, flags)
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;