From 2207395596d5bdd38f3c6d01187ee678155d227f Mon Sep 17 00:00:00 2001 From: vincentdarley Date: Fri, 25 Apr 2003 18:28:07 +0000 Subject: fix to glob and filenames with square brackets --- ChangeLog | 9 +++++++++ generic/tclFileName.c | 17 ++++++++++++++--- tests/fileName.test | 9 ++++++++- 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 + + * 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 * 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]} { -- cgit v0.12