summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2013-07-03 16:53:03 +0200
committerBram Moolenaar <bram@vim.org>2013-07-03 16:53:03 +0200
commit92b57498038ddb5e464719cbb92075a87231af83 (patch)
treeafd4fdbc1c3e13b25d7bbe1fd8a95c1792a412e0
parenteb5f500b8b92c765ce8808ddeb226b8ee244a3d2 (diff)
downloadvim-92b57498038ddb5e464719cbb92075a87231af83.tar.gz
updated for version 7.3.1295v7.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.c8
-rw-r--r--src/misc1.c54
-rw-r--r--src/testdir/Make_amiga.mak3
-rw-r--r--src/testdir/Make_dos.mak2
-rw-r--r--src/testdir/Make_ming.mak2
-rw-r--r--src/testdir/Make_os2.mak2
-rw-r--r--src/testdir/Make_vms.mms4
-rw-r--r--src/testdir/Makefile2
-rw-r--r--src/testdir/test97.in17
-rw-r--r--src/testdir/test97.ok5
-rw-r--r--src/version.c2
11 files changed, 89 insertions, 12 deletions
diff --git a/src/fileio.c b/src/fileio.c
index b6f40166..71ecf42a 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 a9e6c8a5..95816317 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 5a24e6d1..afc4a03d 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 7204ae96..573a1df3 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 8bcfe890..51c64efe 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 2d111e8f..8c45229c 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 3435dfcc..a62b7ad4 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 85b7c4d3..bc525d9d 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 00000000..13e9dd5b
--- /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 00000000..afa96a4d
--- /dev/null
+++ b/src/testdir/test97.ok
@@ -0,0 +1,5 @@
+
+
+
+Xxx{
+Xxx$
diff --git a/src/version.c b/src/version.c
index e4c6d503..d7355677 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,