diff -u unix/tclUnixFCmd.c~ unix/tclUnixFCmd.c
--- unix/tclUnixFCmd.c~	Tue Jun 11 02:41:52 2002
+++ unix/tclUnixFCmd.c	Tue Jun 18 15:54:21 2002
@@ -1697,6 +1697,10 @@
 	}
 	currentPathEndPosition++;
     }
+
+    if (nextCheckpoint == 0) {
+        nextCheckpoint = pathLen;
+    }
     /* 
      * We should really now convert this to a canonical path.  We do
      * that with 'realpath' if we have it available.  Otherwise we could
diff -u generic/tclFileName.c~ generic/tclFileName.c
--- generic/tclFileName.c~	Wed Jun  5 20:59:33 2002
+++ generic/tclFileName.c	Tue Jun 18 15:32:45 2002
@@ -2601,6 +2601,16 @@
     int splitElements;
     Tcl_Obj *splitPtr;
     Tcl_Obj *splitResultPtr = NULL;
+    CONST char *path;
+ 
+    /*
+     * if env(HOME) == "~", then file dirname "~" must return "~".
+     */
+    if ((strcmp((path = Tcl_GetString(pathPtr)), "~") == 0) && 
+	(strcmp((getenv("HOME")), "~") == 0)) {
+      Tcl_IncrRefCount(pathPtr);
+      return pathPtr;
+    }
 
     /* 
      * The behaviour we want here is slightly different to
diff -u generic/tclCmdAH.c.orig generic/tclCmdAH.c
--- generic/tclCmdAH.c.orig	Tue Jun 18 16:05:24 2002
+++ generic/tclCmdAH.c	Tue Jun 18 16:18:46 2002
@@ -1216,10 +1216,21 @@
     	case FILE_TAIL: {
 	    int splitElements;
 	    Tcl_Obj *splitPtr;
+	    CONST char *path = Tcl_GetString(objv[2]);
 
 	    if (objc != 3) {
 		goto only3Args;
 	    }
+
+	    /*
+             * if env(HOME) == "~" then "file tail ~" must return nil string.
+             */
+	    if ((strcmp(path, "~") == 0) && (strcmp(getenv("HOME"), "~") == 0)) {
+	      Tcl_Obj *tail = NULL;
+	      Tcl_SetObjResult(interp, tail);
+	      return TCL_OK;
+	    }
+	      
 	    /* 
 	     * The behaviour we want here is slightly different to
 	     * the standard Tcl_FSSplitPath in the handling of home
@@ -1228,7 +1239,7 @@
 	     * had just a single component.
 	     */	    
 	    splitPtr = Tcl_FSSplitPath(objv[2], &splitElements);
-	    if ((splitElements == 1) && (Tcl_GetString(objv[2])[0] == '~')) {
+	    if ((splitElements == 1) && (path[0] == '~')) {
 		Tcl_DecrRefCount(splitPtr);
 		splitPtr = Tcl_FSGetNormalizedPath(interp, objv[2]);
 		if (splitPtr == NULL) {
