diff options
Diffstat (limited to 'generic/tclIOUtil.c')
-rw-r--r-- | generic/tclIOUtil.c | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/generic/tclIOUtil.c b/generic/tclIOUtil.c index e59f244..c44687b 100644 --- a/generic/tclIOUtil.c +++ b/generic/tclIOUtil.c @@ -17,7 +17,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclIOUtil.c,v 1.45 2002/05/28 15:05:22 vincentdarley Exp $ + * RCS: @(#) $Id: tclIOUtil.c,v 1.46 2002/06/10 10:41:29 vincentdarley Exp $ */ #include "tclInt.h" @@ -25,6 +25,10 @@ #ifdef MAC_TCL #include "tclMacInt.h" #endif +#ifdef __WIN32__ +/* For 'file link' */ +#include "tclWinInt.h" +#endif /* * Prototypes for procedures defined later in this file. @@ -4417,13 +4421,31 @@ TclpNativeToNormalized(clientData) { Tcl_DString ds; Tcl_Obj *objPtr; + CONST char *copy; + int len; #ifdef __WIN32__ Tcl_WinTCharToUtf((CONST char*)clientData, -1, &ds); #else Tcl_ExternalToUtfDString(NULL, (CONST char*)clientData, -1, &ds); #endif - objPtr = Tcl_NewStringObj(Tcl_DStringValue(&ds),Tcl_DStringLength(&ds)); + + copy = Tcl_DStringValue(&ds); + len = Tcl_DStringLength(&ds); + +#ifdef __WIN32__ + /* + * Certain native path representations on Windows have this special + * prefix to indicate that they are to be treated specially. For + * example extremely long paths, or symlinks + */ + if (0 == strncmp(copy,"\\??\\",4)) { + copy += 4; + len -= 4; + } +#endif + + objPtr = Tcl_NewStringObj(copy,len); Tcl_DStringFree(&ds); return objPtr; @@ -4450,19 +4472,29 @@ static ClientData NativeDupInternalRep(clientData) ClientData clientData; { -#ifdef __WIN32__ - /* Copying internal representations is complicated with multi-byte TChars */ - return NULL; -#else + ClientData copy; + size_t len; + if (clientData == NULL) { - return NULL; + return NULL; + } + +#ifdef __WIN32__ + if (tclWinProcs->useWide) { + /* unicode representation when running on NT/2K/XP */ + len = sizeof(WCHAR) + (wcslen((CONST WCHAR*)clientData) * sizeof(WCHAR)); } else { - char *native = (char*)clientData; - char *copy = ckalloc((unsigned)(1+strlen(native))); - strcpy(copy,native); - return (ClientData)copy; + /* ansi representation when running on 95/98/ME */ + len = sizeof(CHAR) + (strlen((CONST CHAR*)clientData) * sizeof(CHAR)); } +#else + /* ansi representation when running on Unix/MacOS */ + len = sizeof(CHAR) + (strlen((CONST CHAR*)clientData) * sizeof(CHAR)); #endif + + copy = (ClientData) ckalloc(len); + memcpy((VOID*)copy, (VOID*)clientData, len); + return copy; } /* |