# HG changeset patch # User Bram Moolenaar # Date 1372863183 -7200 # Node ID 93cccad6a26b439728bf3c155ed5532001a2f2ab # Parent 1fc08f2489e7ffb387d7768df2dd93b24ecf512e updated for version 7.3.1295 Problem: glob() and globpath() do not handle escaped special characters properly. Solution: Handle escaped characters differently. (Adnan Zafar) diff --git a/src/fileio.c b/src/fileio.c --- a/src/fileio.c +++ b/src/fileio.c @@ -10301,7 +10301,10 @@ file_pat_to_reg_pat(pat, pat_end, allow_ * 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_ ) reg_pat[i++] = '?'; else - if (*p == ',' || *p == '%' || *p == '#' || *p == ' ') + if (*p == ',' || *p == '%' || *p == '#' + || *p == ' ' || *p == '{') reg_pat[i++] = *p; else { diff --git a/src/misc1.c b/src/misc1.c --- a/src/misc1.c +++ b/src/misc1.c @@ -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_f */ 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_f /* * 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_f * 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); diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak --- a/src/testdir/Make_amiga.mak +++ b/src/testdir/Make_amiga.mak @@ -33,7 +33,7 @@ SCRIPTS = test1.out test3.out test4.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 diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak --- a/src/testdir/Make_dos.mak +++ b/src/testdir/Make_dos.mak @@ -32,7 +32,7 @@ SCRIPTS = test3.out test4.out test5.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 diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak --- a/src/testdir/Make_ming.mak +++ b/src/testdir/Make_ming.mak @@ -52,7 +52,7 @@ SCRIPTS = test3.out test4.out test5.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 diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak --- a/src/testdir/Make_os2.mak +++ b/src/testdir/Make_os2.mak @@ -33,7 +33,7 @@ SCRIPTS = test1.out test3.out test4.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 diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -4,7 +4,7 @@ # Authors: Zoltan Arpadffy, # Sandor Kopanyi, # -# 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 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 diff --git a/src/testdir/Makefile b/src/testdir/Makefile --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -29,7 +29,7 @@ SCRIPTS = test1.out test2.out test3.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 diff --git a/src/testdir/test97.in b/src/testdir/test97.in new file mode 100644 --- /dev/null +++ b/src/testdir/test97.in @@ -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 + diff --git a/src/testdir/test97.ok b/src/testdir/test97.ok new file mode 100644 --- /dev/null +++ b/src/testdir/test97.ok @@ -0,0 +1,5 @@ + + + +Xxx{ +Xxx$ diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1295, +/**/ 1294, /**/ 1293,