From ea2ebe5242290d7fa2b53cd32d27e12e53a41b87 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 27 Mar 2009 19:17:54 +0000 Subject: * generic/tclPathObj.c (TclPathPart): TclPathPart() was computing * tests/fileName.test: the wrong results for both [file dirname] and [file tail] on "path" arguments with the PATHFLAGS != 0 intrep and with an empty string for the "joined-on" part. [Bug 2710920] --- ChangeLog | 7 +++++++ generic/tclPathObj.c | 32 +++++++++++++++++++++++++++++--- tests/fileName.test | 14 +++++++++++++- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index cedc795..3fb29f7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2009-03-27 Don Porter + + * generic/tclPathObj.c (TclPathPart): TclPathPart() was computing + * tests/fileName.test: the wrong results for both [file dirname] and + [file tail] on "path" arguments with the PATHFLAGS != 0 intrep and + with an empty string for the "joined-on" part. [Bug 2710920] + 2009-03-25 Jan Nijtmans * doc/tclsh.1 bring doc and tools in line with http://wiki.tcl.tk/812 diff --git a/generic/tclPathObj.c b/generic/tclPathObj.c index 725f2a9..3c7cce5 100644 --- a/generic/tclPathObj.c +++ b/generic/tclPathObj.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: tclPathObj.c,v 1.79 2009/02/20 18:19:16 dgp Exp $ + * RCS: @(#) $Id: tclPathObj.c,v 1.80 2009/03/27 19:17:54 dgp Exp $ */ #include "tclInt.h" @@ -578,11 +578,24 @@ TclPathPart( * the standardPath code. */ - const char *rest = TclGetString(fsPathPtr->normPathPtr); + int numBytes; + const char *rest = + Tcl_GetStringFromObj(fsPathPtr->normPathPtr, &numBytes); if (strchr(rest, '/') != NULL) { goto standardPath; } + /* + * If the joined-on bit is empty, then [file dirname] is + * documented to return all but the last non-empty element + * of the path, so we need to split apart the main part to + * get the right answer. We could do that here, but it's + * simpler to fall back to the standardPath code. + * [Bug 2710920] + */ + if (numBytes == 0) { + goto standardPath; + } if (tclPlatform == TCL_PLATFORM_WINDOWS && strchr(rest, '\\') != NULL) { goto standardPath; @@ -603,11 +616,24 @@ TclPathPart( * we don't, and instead just use the standardPath code. */ - const char *rest = TclGetString(fsPathPtr->normPathPtr); + int numBytes; + const char *rest = + Tcl_GetStringFromObj(fsPathPtr->normPathPtr, &numBytes); if (strchr(rest, '/') != NULL) { goto standardPath; } + /* + * If the joined-on bit is empty, then [file tail] is + * documented to return the last non-empty element + * of the path, so we need to split off the last element + * of the main part to get the right answer. We could do + * that here, but it's simpler to fall back to the + * standardPath code. [Bug 2710920] + */ + if (numBytes == 0) { + goto standardPath; + } if (tclPlatform == TCL_PLATFORM_WINDOWS && strchr(rest, '\\') != NULL) { goto standardPath; diff --git a/tests/fileName.test b/tests/fileName.test index c40b8ac..78f2e58 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.58 2009/02/20 18:19:16 dgp Exp $ +# RCS: @(#) $Id: fileName.test,v 1.59 2009/03/27 19:17:54 dgp Exp $ if {[lsearch [namespace children] ::tcltest] == -1} { package require tcltest 2 @@ -1277,6 +1277,18 @@ test filename-14.25.1 {type specific globbing} {win} { test filename-14.26 {type specific globbing} { glob -nocomplain -dir globTest -types {readonly} * } {} +test filename-14.27 {Bug 2710920} {unixOrPc} { + file tail [lindex [lsort [glob globTest/*/]] 0] +} a1 +test filename-14.28 {Bug 2710920} {unixOrPc} { + file dirname [lindex [lsort [glob globTest/*/]] 0] +} globTest +test filename-14.29 {Bug 2710920} {unixOrPc} { + file extension [lindex [lsort [glob globTest/*/]] 0] +} {} +test filename-14.30 {Bug 2710920} {unixOrPc} { + file rootname [lindex [lsort [glob globTest/*/]] 0] +} globTest/a1/ unset globname -- cgit v0.12