Import Tcl 8.6.10
This commit is contained in:
@@ -17,7 +17,7 @@
|
||||
#include <lmcons.h>
|
||||
|
||||
/*
|
||||
* GetUserName() is found in advapi32.dll
|
||||
* GetUserNameW() is found in advapi32.dll
|
||||
*/
|
||||
#ifdef _MSC_VER
|
||||
# pragma comment(lib, "advapi32.lib")
|
||||
@@ -112,14 +112,19 @@ static ProcessGlobalValue sourceLibraryDir =
|
||||
{0, 0, NULL, NULL, InitializeSourceLibraryDir, NULL, NULL};
|
||||
|
||||
static void AppendEnvironment(Tcl_Obj *listPtr, const char *lib);
|
||||
static int ToUtf(const WCHAR *wSrc, char *dst);
|
||||
|
||||
#if TCL_UTF_MAX < 4
|
||||
static void ToUtf(const WCHAR *wSrc, char *dst);
|
||||
#else
|
||||
#define ToUtf(wSrc, dst) WideCharToMultiByte(CP_UTF8, 0, wSrc, -1, dst, MAX_PATH * TCL_UTF_MAX, NULL, NULL)
|
||||
#endif
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
* TclpInitPlatform --
|
||||
*
|
||||
* Initialize all the platform-dependant things like signals,
|
||||
* Initialize all the platform-dependent things like signals,
|
||||
* floating-point error handling and sockets.
|
||||
*
|
||||
* Called at process initialization time.
|
||||
@@ -161,7 +166,7 @@ TclpInitPlatform(void)
|
||||
/*
|
||||
* Fill available functions depending on windows version
|
||||
*/
|
||||
handle = GetModuleHandle(TEXT("KERNEL32"));
|
||||
handle = GetModuleHandleW(L"KERNEL32");
|
||||
tclWinProcs.cancelSynchronousIo =
|
||||
(BOOL (WINAPI *)(HANDLE)) GetProcAddress(handle,
|
||||
"CancelSynchronousIo");
|
||||
@@ -305,7 +310,7 @@ AppendEnvironment(
|
||||
Tcl_SplitPath(buf, &pathc, &pathv);
|
||||
|
||||
/*
|
||||
* The lstrcmpi() will work even if pathv[pathc-1] is random UTF-8
|
||||
* The lstrcmpiA() will work even if pathv[pathc-1] is random UTF-8
|
||||
* chars because I know shortlib is ascii.
|
||||
*/
|
||||
|
||||
@@ -435,7 +440,7 @@ InitializeSourceLibraryDir(
|
||||
*
|
||||
* ToUtf --
|
||||
*
|
||||
* Convert a char string to a UTF string.
|
||||
* Convert a wchar string to a UTF string.
|
||||
*
|
||||
* Results:
|
||||
* None.
|
||||
@@ -446,21 +451,19 @@ InitializeSourceLibraryDir(
|
||||
*---------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static int
|
||||
#if TCL_UTF_MAX < 4
|
||||
static void
|
||||
ToUtf(
|
||||
const WCHAR *wSrc,
|
||||
char *dst)
|
||||
{
|
||||
char *start;
|
||||
|
||||
start = dst;
|
||||
while (*wSrc != '\0') {
|
||||
dst += Tcl_UniCharToUtf(*wSrc, dst);
|
||||
wSrc++;
|
||||
}
|
||||
*dst = '\0';
|
||||
return (int) (dst - start);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
@@ -514,6 +517,27 @@ Tcl_GetEncodingNameFromEnvironment(
|
||||
return Tcl_DStringValue(bufPtr);
|
||||
}
|
||||
|
||||
const char *
|
||||
TclpGetUserName(
|
||||
Tcl_DString *bufferPtr) /* Uninitialized or free DString filled with
|
||||
* the name of user. */
|
||||
{
|
||||
Tcl_DStringInit(bufferPtr);
|
||||
|
||||
if (TclGetEnv("USERNAME", bufferPtr) == NULL) {
|
||||
WCHAR szUserName[UNLEN+1];
|
||||
DWORD cchUserNameLen = UNLEN;
|
||||
|
||||
if (!GetUserNameW(szUserName, &cchUserNameLen)) {
|
||||
return NULL;
|
||||
}
|
||||
cchUserNameLen--;
|
||||
cchUserNameLen *= sizeof(WCHAR);
|
||||
Tcl_WinTCharToUtf((TCHAR *)szUserName, cchUserNameLen, bufferPtr);
|
||||
}
|
||||
return Tcl_DStringValue(bufferPtr);
|
||||
}
|
||||
|
||||
/*
|
||||
*---------------------------------------------------------------------------
|
||||
*
|
||||
@@ -544,14 +568,12 @@ TclpSetVariables(
|
||||
static OSVERSIONINFOW osInfo;
|
||||
static int osInfoInitialized = 0;
|
||||
Tcl_DString ds;
|
||||
TCHAR szUserName[UNLEN+1];
|
||||
DWORD cchUserNameLen = UNLEN;
|
||||
|
||||
Tcl_SetVar2Ex(interp, "tclDefaultLibrary", NULL,
|
||||
TclGetProcessGlobalValue(&defaultLibraryDir), TCL_GLOBAL_ONLY);
|
||||
|
||||
if (!osInfoInitialized) {
|
||||
HMODULE handle = GetModuleHandle(TEXT("NTDLL"));
|
||||
HMODULE handle = GetModuleHandleW(L"NTDLL");
|
||||
int(__stdcall *getversion)(void *) =
|
||||
(int(__stdcall *)(void *)) GetProcAddress(handle, "RtlGetVersion");
|
||||
osInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
|
||||
@@ -580,7 +602,7 @@ TclpSetVariables(
|
||||
TCL_GLOBAL_ONLY);
|
||||
}
|
||||
|
||||
#ifdef _DEBUG
|
||||
#ifndef NDEBUG
|
||||
/*
|
||||
* The existence of the "debug" element of the tcl_platform array
|
||||
* indicates that this particular Tcl shell has been compiled with debug
|
||||
@@ -623,15 +645,8 @@ TclpSetVariables(
|
||||
* Note: cchUserNameLen is number of characters including nul terminator.
|
||||
*/
|
||||
|
||||
Tcl_DStringInit(&ds);
|
||||
if (TclGetEnv("USERNAME", &ds) == NULL) {
|
||||
if (GetUserName(szUserName, &cchUserNameLen) != 0) {
|
||||
int cbUserNameLen = cchUserNameLen - 1;
|
||||
cbUserNameLen *= sizeof(TCHAR);
|
||||
Tcl_WinTCharToUtf(szUserName, cbUserNameLen, &ds);
|
||||
}
|
||||
}
|
||||
Tcl_SetVar2(interp, "tcl_platform", "user", Tcl_DStringValue(&ds),
|
||||
ptr = TclpGetUserName(&ds);
|
||||
Tcl_SetVar2(interp, "tcl_platform", "user", ptr ? ptr : "",
|
||||
TCL_GLOBAL_ONLY);
|
||||
Tcl_DStringFree(&ds);
|
||||
|
||||
@@ -648,7 +663,7 @@ TclpSetVariables(
|
||||
* TclpFindVariable --
|
||||
*
|
||||
* Locate the entry in environ for a given name. On Unix this routine is
|
||||
* case sensitive, on Windows this matches mioxed case.
|
||||
* case sensitive, on Windows this matches mixed case.
|
||||
*
|
||||
* Results:
|
||||
* The return value is the index in environ of an entry with the name
|
||||
|
||||
Reference in New Issue
Block a user