summaryrefslogtreecommitdiffstats
path: root/generic/tclFileName.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2009-08-20 22:08:02 (GMT)
committerdgp <dgp@users.sourceforge.net>2009-08-20 22:08:02 (GMT)
commitfa5ee967b1643fdd114d19a71f4d12e10a2b4b54 (patch)
tree2429cc2ef1bb7ad58712d1e6b919ccc447917884 /generic/tclFileName.c
parent1f93e1ab3fd01d0f68a3cfe19185e00a07a7d884 (diff)
downloadtcl-fa5ee967b1643fdd114d19a71f4d12e10a2b4b54.zip
tcl-fa5ee967b1643fdd114d19a71f4d12e10a2b4b54.tar.gz
tcl-fa5ee967b1643fdd114d19a71f4d12e10a2b4b54.tar.bz2
* generic/tclFileName.c: Correct result from [glob */test] when *
matches something like ~foo. [Bug 2837800]
Diffstat (limited to 'generic/tclFileName.c')
-rw-r--r--generic/tclFileName.c32
1 files changed, 30 insertions, 2 deletions
diff --git a/generic/tclFileName.c b/generic/tclFileName.c
index c56c684..b2d43b9 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.86.2.2 2008/12/03 07:03:13 dgp Exp $
+ * RCS: @(#) $Id: tclFileName.c,v 1.86.2.3 2009/08/20 22:08:03 dgp Exp $
*/
#include "tclInt.h"
@@ -2350,14 +2350,42 @@ DoGlob(
pattern, &dirOnly);
*p = save;
if (result == TCL_OK) {
- int subdirc, i;
+ int subdirc, i, repair = -1;
Tcl_Obj **subdirv;
result = Tcl_ListObjGetElements(interp, subdirsPtr,
&subdirc, &subdirv);
for (i=0; result==TCL_OK && i<subdirc; i++) {
+ Tcl_Obj *copy = NULL;
+
+ if (Tcl_GetString(subdirv[i])[0] == '~') {
+ Tcl_ListObjLength(NULL, matchesObj, &repair);
+ copy = subdirv[i];
+ subdirv[i] = Tcl_NewStringObj("./", 2);
+ Tcl_AppendObjToObj(subdirv[i], copy);
+ Tcl_IncrRefCount(subdirv[i]);
+ }
result = DoGlob(interp, matchesObj, separators, subdirv[i],
1, p+1, types);
+ if (copy) {
+ int end;
+
+ Tcl_DecrRefCount(subdirv[i]);
+ subdirv[i] = copy;
+ Tcl_ListObjLength(NULL, matchesObj, &end);
+ while (repair < end) {
+ const char *bytes;
+ int numBytes;
+ Tcl_Obj *fixme, *newObj;
+ Tcl_ListObjIndex(NULL, matchesObj, repair, &fixme);
+ bytes = Tcl_GetStringFromObj(fixme, &numBytes);
+ newObj = Tcl_NewStringObj(bytes+2, numBytes-2);
+ Tcl_ListObjReplace(NULL, matchesObj, repair, 1,
+ 1, &newObj);
+ repair++;
+ }
+ repair = -1;
+ }
}
}
TclDecrRefCount(subdirsPtr);