diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-07-03 16:53:03 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-07-03 16:53:03 +0200 |
commit | f4e1143697a2d08eff487dec36128a5e10d5eca8 (patch) | |
tree | eb55b1d73457b226548a93b7d22c260485c6ef4a | |
parent | a87aa8061ce670c38d742b0f7e41cc950d10320f (diff) |
updated for version 7.3.1295v7.3.1295
Problem: glob() and globpath() do not handle escaped special characters
properly.
Solution: Handle escaped characters differently. (Adnan Zafar)
-rw-r--r-- | src/fileio.c | 8 | ||||
-rw-r--r-- | src/misc1.c | 54 | ||||
-rw-r--r-- | src/testdir/Make_amiga.mak | 3 | ||||
-rw-r--r-- | src/testdir/Make_dos.mak | 2 | ||||
-rw-r--r-- | src/testdir/Make_ming.mak | 2 | ||||
-rw-r--r-- | src/testdir/Make_os2.mak | 2 | ||||
-rw-r--r-- | src/testdir/Make_vms.mms | 4 | ||||
-rw-r--r-- | src/testdir/Makefile | 2 | ||||
-rw-r--r-- | src/testdir/test97.in | 17 | ||||
-rw-r--r-- | src/testdir/test97.ok | 5 | ||||
-rw-r--r-- | src/version.c | 2 |
11 files changed, 89 insertions, 12 deletions
diff --git a/src/fileio.c b/src/fileio.c index b6f4016682..71ecf42aea 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -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 { diff --git a/src/misc1.c b/src/misc1.c index a9e6c8a595..9581631787 100644 --- 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_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); diff --git a/src/testdir/Make_amiga.mak b/src/testdir/Make_amiga.mak index 5a24e6d13f..afc4a03dd3 100644 --- a/src/testdir/Make_amiga.mak +++ b/src/testdir/Make_amiga.mak @@ -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 diff --git a/src/testdir/Make_dos.mak b/src/testdir/Make_dos.mak index 7204ae9630..573a1df383 100644 --- a/src/testdir/Make_dos.mak +++ b/src/testdir/Make_dos.mak @@ -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 diff --git a/src/testdir/Make_ming.mak b/src/testdir/Make_ming.mak index 8bcfe890a1..51c64efe83 100644 --- a/src/testdir/Make_ming.mak +++ b/src/testdir/Make_ming.mak @@ -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 diff --git a/src/testdir/Make_os2.mak b/src/testdir/Make_os2.mak index 2d111e8fb1..8c45229ca2 100644 --- a/src/testdir/Make_os2.mak +++ b/src/testdir/Make_os2.mak @@ -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 diff --git a/src/testdir/Make_vms.mms b/src/testdir/Make_vms.mms index 3435dfcca6..a62b7ad451 100644 --- a/src/testdir/Make_vms.mms +++ b/src/testdir/Make_vms.mms @@ -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 diff --git a/src/testdir/Makefile b/src/testdir/Makefile index 85b7c4d3e7..bc525d9d1a 100644 --- a/src/testdir/Makefile +++ b/src/testdir/Makefile @@ -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 diff --git a/src/testdir/test97.in b/src/testdir/test97.in new file mode 100644 index 0000000000..13e9dd5b6e --- /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 index 0000000000..afa96a4de4 --- /dev/null +++ b/src/testdir/test97.ok @@ -0,0 +1,5 @@ + + + +Xxx{ +Xxx$ diff --git a/src/version.c b/src/version.c index e4c6d503de..d735567737 100644 --- 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, |