summaryrefslogtreecommitdiffstats
path: root/win/tclWinFile.c
diff options
context:
space:
mode:
authorhobbs <hobbs>2004-04-07 22:04:19 (GMT)
committerhobbs <hobbs>2004-04-07 22:04:19 (GMT)
commit9c4ceb163fd879f11fc0c03f0b20f8b86539f76c (patch)
tree838a0a2bc8c76ff14061d2cb1d442e1e487df248 /win/tclWinFile.c
parentbbbf72f5942c4fca232299946e6169fb4e796bcb (diff)
downloadtcl-9c4ceb163fd879f11fc0c03f0b20f8b86539f76c.zip
tcl-9c4ceb163fd879f11fc0c03f0b20f8b86539f76c.tar.gz
tcl-9c4ceb163fd879f11fc0c03f0b20f8b86539f76c.tar.bz2
* win/tclWinInit.c (TclpSetInitialEncodings): note that WIN32_CE
is also a unicode platform. * generic/tclEncoding.c (TclFindEncodings, Tcl_FindExecutable): * generic/tclInt.h: Correct handling of UTF * unix/tclUnixInit.c (TclpInitLibraryPath): data that is actually * win/tclWinFile.c (TclpFindExecutable): "clean", allowing the * win/tclWinInit.c (TclpInitLibraryPath): loading of Tcl from paths that contain multi-byte chars on Windows [Bug 920667]
Diffstat (limited to 'win/tclWinFile.c')
-rw-r--r--win/tclWinFile.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/win/tclWinFile.c b/win/tclWinFile.c
index 30d08fa..b7af7d0 100644
--- a/win/tclWinFile.c
+++ b/win/tclWinFile.c
@@ -11,7 +11,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinFile.c,v 1.61 2004/01/29 10:28:23 vincentdarley Exp $
+ * RCS: @(#) $Id: tclWinFile.c,v 1.62 2004/04/07 22:04:30 hobbs Exp $
*/
//#define _WIN32_WINNT 0x0500
@@ -666,12 +666,11 @@ NativeWriteReparse(LinkDirectory, buffer)
* application, given its argv[0] value.
*
* Results:
- * A dirty UTF string that is the path to the executable. At this
- * point we may not know the system encoding. Convert the native
- * string value to UTF using the default encoding. The assumption
- * is that we will still be able to parse the path given the path
- * name contains ASCII string and '/' chars do not conflict with
- * other UTF chars.
+ * A clean UTF string that is the path to the executable. At this
+ * point we may not know the system encoding, but we convert the
+ * string value to UTF-8 using core Windows functions. The path name
+ * contains ASCII string and '/' chars do not conflict with other UTF
+ * chars.
*
* Side effects:
* The variable tclNativeExecutableName gets filled in with the file
@@ -686,8 +685,8 @@ TclpFindExecutable(argv0)
CONST char *argv0; /* The value of the application's argv[0]
* (native). */
{
- Tcl_DString ds;
WCHAR wName[MAX_PATH];
+ char name[MAX_PATH * TCL_UTF_MAX];
if (argv0 == NULL) {
return NULL;
@@ -701,12 +700,15 @@ TclpFindExecutable(argv0)
* create this process.
*/
- (*tclWinProcs->getModuleFileNameProc)(NULL, wName, MAX_PATH);
- Tcl_WinTCharToUtf((CONST TCHAR *) wName, -1, &ds);
+ if (GetModuleFileNameW(NULL, wName, MAX_PATH) == 0) {
+ GetModuleFileNameA(NULL, name, sizeof(name));
+ } else {
+ WideCharToMultiByte(CP_UTF8, 0, wName, -1,
+ name, sizeof(name), NULL, NULL);
+ }
- tclNativeExecutableName = ckalloc((unsigned) (Tcl_DStringLength(&ds) + 1));
- strcpy(tclNativeExecutableName, Tcl_DStringValue(&ds));
- Tcl_DStringFree(&ds);
+ tclNativeExecutableName = ckalloc((unsigned) (strlen(name) + 1));
+ strcpy(tclNativeExecutableName, name);
TclWinNoBackslash(tclNativeExecutableName);
return tclNativeExecutableName;