0
0
mirror of https://github.com/vim/vim.git synced 2025-09-04 21:33:48 -04:00

updated for version 7.3.1295

Problem:    glob() and globpath() do not handle escaped special characters
            properly.
Solution:   Handle escaped characters differently. (Adnan Zafar)
This commit is contained in:
Bram Moolenaar 2013-07-03 16:53:03 +02:00
parent a87aa8061c
commit f4e1143697
11 changed files with 89 additions and 12 deletions

View File

@ -10301,7 +10301,10 @@ file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
* foo\,bar -> foo,bar
* foo\ bar -> foo bar
* Don't unescape \, * and others that are also special in a
* regexp. */
* regexp.
* An escaped { must be unescaped since we use magic not
* verymagic.
*/
if (*++p == '?'
#ifdef BACKSLASH_IN_FILENAME
&& no_bslash
@ -10309,7 +10312,8 @@ file_pat_to_reg_pat(pat, pat_end, allow_dirs, no_bslash)
)
reg_pat[i++] = '?';
else
if (*p == ',' || *p == '%' || *p == '#' || *p == ' ')
if (*p == ',' || *p == '%' || *p == '#'
|| *p == ' ' || *p == '{')
reg_pat[i++] = *p;
else
{

View File

@ -10457,6 +10457,54 @@ remove_duplicates(gap)
}
#endif
static int has_env_var __ARGS((char_u *p));
/*
* Return TRUE if "p" contains what looks like an environment variable.
* Allowing for escaping.
*/
static int
has_env_var(p)
char_u *p;
{
for ( ; *p; mb_ptr_adv(p))
{
if (*p == '\\' && p[1] != NUL)
++p;
else if (vim_strchr((char_u *)
#if defined(MSDOS) || defined(MSWIN) || defined(OS2)
"$%"
#else
"$"
#endif
, *p) != NULL)
return TRUE;
}
return FALSE;
}
#ifdef SPECIAL_WILDCHAR
static int has_special_wildchar __ARGS((char_u *p));
/*
* Return TRUE if "p" contains a special wildcard character.
* Allowing for escaping.
*/
static int
has_special_wildchar(p)
char_u *p;
{
for ( ; *p; mb_ptr_adv(p))
{
if (*p == '\\' && p[1] != NUL)
++p;
else if (vim_strchr((char_u *)SPECIAL_WILDCHAR, *p) != NULL)
return TRUE;
}
return FALSE;
}
#endif
/*
* Generic wildcard expansion code.
*
@ -10507,7 +10555,7 @@ gen_expand_wildcards(num_pat, pat, num_file, file, flags)
*/
for (i = 0; i < num_pat; i++)
{
if (vim_strpbrk(pat[i], (char_u *)SPECIAL_WILDCHAR) != NULL
if (has_special_wildchar(pat[i])
# ifdef VIM_BACKTICK
&& !(vim_backtick(pat[i]) && pat[i][1] == '=')
# endif
@ -10537,7 +10585,7 @@ gen_expand_wildcards(num_pat, pat, num_file, file, flags)
/*
* First expand environment variables, "~/" and "~user/".
*/
if (vim_strchr(p, '$') != NULL || *p == '~')
if (has_env_var(p) || *p == '~')
{
p = expand_env_save_opt(p, TRUE);
if (p == NULL)
@ -10548,7 +10596,7 @@ gen_expand_wildcards(num_pat, pat, num_file, file, flags)
* variable, use the shell to do that. Discard previously
* found file names and start all over again.
*/
else if (vim_strchr(p, '$') != NULL || *p == '~')
else if (has_env_var(p) || *p == '~')
{
vim_free(p);
ga_clear_strings(&ga);

View File

@ -33,7 +33,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test76.out test77.out test78.out test79.out test80.out \
test81.out test82.out test83.out test84.out test88.out \
test89.out test90.out test91.out test92.out test93.out \
test94.out test95.out test96.out
test94.out test95.out test96.out test97.out
.SUFFIXES: .in .out
@ -146,3 +146,4 @@ test93.out: test93.in
test94.out: test94.in
test95.out: test95.in
test96.out: test96.in
test97.out: test97.in

View File

@ -32,7 +32,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test79.out test80.out test81.out test82.out test83.out \
test84.out test85.out test86.out test87.out test88.out \
test89.out test90.out test91.out test92.out test93.out \
test94.out test95.out test96.out
test94.out test95.out test96.out test97.out
SCRIPTS32 = test50.out test70.out

View File

@ -52,7 +52,7 @@ SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test79.out test80.out test81.out test82.out test83.out \
test84.out test85.out test86.out test87.out test88.out \
test89.out test90.out test91.out test92.out test93.out \
test94.out test95.out test96.out
test94.out test95.out test96.out test97.out
SCRIPTS32 = test50.out test70.out

View File

@ -33,7 +33,7 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test76.out test77.out test78.out test79.out test80.out \
test81.out test82.out test83.out test84.out test88.out \
test89.out test90.out test91.out test92.out test93.out \
test94.out test95.out test96.out
test94.out test95.out test96.out test97.out
.SUFFIXES: .in .out

View File

@ -4,7 +4,7 @@
# Authors: Zoltan Arpadffy, <arpadffy@polarhome.com>
# Sandor Kopanyi, <sandor.kopanyi@mailbox.hu>
#
# Last change: 2013 Jul 01
# Last change: 2013 Jul 03
#
# This has been tested on VMS 6.2 to 8.3 on DEC Alpha, VAX and IA64.
# Edit the lines in the Configuration section below to select.
@ -78,7 +78,7 @@ SCRIPT = test1.out test2.out test3.out test4.out test5.out \
test77.out test78.out test79.out test80.out test81.out \
test82.out test83.out test84.out test88.out test89.out \
test90.out test91.out test92.out test93.out test94.out \
test95.out test96.out
test95.out test96.out test97.out
# Known problems:
# Test 30: a problem around mac format - unknown reason

View File

@ -29,7 +29,7 @@ SCRIPTS = test1.out test2.out test3.out test4.out test5.out test6.out \
test79.out test80.out test81.out test82.out test83.out \
test84.out test85.out test86.out test87.out test88.out \
test89.out test90.out test91.out test92.out test93.out \
test94.out test95.out test96.out
test94.out test95.out test96.out test97.out
SCRIPTS_GUI = test16.out

17
src/testdir/test97.in Normal file
View File

@ -0,0 +1,17 @@
Test whether glob()/globpath() return correct results with certain escaped
characters.
STARTTEST
:so small.vim
:set shell=doesnotexist
:e test.out
:put =glob('Xxx\{')
:put =glob('Xxx\$')
:w! Xxx{
:w! Xxx\$
:put =glob('Xxx\{')
:put =glob('Xxx\$')
:w
:qa!
ENDTEST

5
src/testdir/test97.ok Normal file
View File

@ -0,0 +1,5 @@
Xxx{
Xxx$

View File

@ -728,6 +728,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
1295,
/**/
1294,
/**/