summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvincentdarley <vincentdarley>2003-04-25 18:28:07 (GMT)
committervincentdarley <vincentdarley>2003-04-25 18:28:07 (GMT)
commit2207395596d5bdd38f3c6d01187ee678155d227f (patch)
treee656382d969e18617331f33d44031f1301bdf523
parente39ac41979189210210c4ad46c3d86e7e72069fb (diff)
downloadtcl-2207395596d5bdd38f3c6d01187ee678155d227f.zip
tcl-2207395596d5bdd38f3c6d01187ee678155d227f.tar.gz
tcl-2207395596d5bdd38f3c6d01187ee678155d227f.tar.bz2
fix to glob and filenames with square brackets
-rw-r--r--ChangeLog9
-rw-r--r--generic/tclFileName.c17
-rw-r--r--tests/fileName.test9
3 files changed, 31 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index 337bd38..6636922 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2003-04-24 Vince Darley <vincentdarley@users.sourceforge.net>
+
+ * generic/tclFileName.c: fix to bug reported privately by
+ Jeff where, for example, 'glob -path {[tcl]} *' gets confused
+ by the leading special character (which is escaped internally),
+ and instead lists files in '/'. Bug only occurs on Windows
+ where '\' is also a directory separator.
+ * tests/fileName.test: added test for the above bug.
+
2003-04-22 Andreas Kupries <andreask@activestate.com>
* The changes below fix SF bugs [593810], and [718045].
diff --git a/generic/tclFileName.c b/generic/tclFileName.c
index 16bf9d0..84b92c7 100644
--- a/generic/tclFileName.c
+++ b/generic/tclFileName.c
@@ -10,7 +10,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclFileName.c,v 1.40 2003/01/09 10:01:59 vincentdarley Exp $
+ * RCS: @(#) $Id: tclFileName.c,v 1.41 2003/04/25 18:28:41 vincentdarley Exp $
*/
#include "tclInt.h"
@@ -2330,8 +2330,19 @@ TclDoGlob(interp, separators, headPtr, tail, types)
count = 0;
name = tail;
for (; *tail != '\0'; tail++) {
- if ((*tail == '\\') && (strchr(separators, tail[1]) != NULL)) {
- tail++;
+ if (*tail == '\\') {
+ /*
+ * If the first character is escaped, either we have a directory
+ * separator, or we have any other character. In the latter case
+ * the rest of tail is a pattern, and we must break from the loop.
+ * This is particularly important on Windows where '\' is both
+ * the escaping character and a directory separator.
+ */
+ if (strchr(separators, tail[1]) != NULL) {
+ tail++;
+ } else {
+ break;
+ }
} else if (strchr(separators, *tail) == NULL) {
break;
}
diff --git a/tests/fileName.test b/tests/fileName.test
index 01b67ef..3dce4c5 100644
--- a/tests/fileName.test
+++ b/tests/fileName.test
@@ -10,7 +10,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: fileName.test,v 1.30 2003/02/12 18:57:51 vincentdarley Exp $
+# RCS: @(#) $Id: fileName.test,v 1.31 2003/04/25 18:28:42 vincentdarley Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest
@@ -1333,6 +1333,13 @@ test filename-11.21 {Tcl_GlobCmd} {
list [catch {lsort [glob -type d -path $globname *]} msg] $msg
} [list 0 [lsort [list $globname]]]
+test filename-11.21.1 {Tcl_GlobCmd} {
+ close [open {[tcl].testremains} w]
+ set res [list [catch {lsort [glob -path {[tcl]} *]} msg] $msg]
+ file delete -force {[tcl].testremains}
+ set res
+} [list 0 {{[tcl].testremains}}]
+
# Get rid of file/dir if it exists, since it will have
# been left behind by a previous failed run.
if {[file exists $horribleglobname]} {