ruby-changes:11106
From: nobu <ko1@a...>
Date: Mon, 2 Mar 2009 12:22:28 +0900 (JST)
Subject: [ruby-changes:11106] Ruby:r22704 (trunk): * win32/win32.c (init_env): keeps wide chars as wide chars.
nobu 2009-03-02 12:22:14 +0900 (Mon, 02 Mar 2009) New Revision: 22704 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=22704 Log: * win32/win32.c (init_env): keeps wide chars as wide chars. Modified files: trunk/ChangeLog trunk/win32/win32.c Index: ChangeLog =================================================================== --- ChangeLog (revision 22703) +++ ChangeLog (revision 22704) @@ -1,3 +1,7 @@ +Mon Mar 2 12:22:12 2009 Nobuyoshi Nakada <nobu@r...> + + * win32/win32.c (init_env): keeps wide chars as wide chars. + Mon Mar 2 11:01:45 2009 Nobuyoshi Nakada <nobu@r...> * ext/dl/dl.h (dlerror): fixed on Windows. Index: win32/win32.c =================================================================== --- win32/win32.c (revision 22703) +++ win32/win32.c (revision 22704) @@ -350,6 +350,16 @@ (DWORD)-1); } +static inline WCHAR * +translate_wchar(WCHAR *p, int from, int to) +{ + for (; *p; p++) { + if (*p == from) + *p = to; + } + return p; +} + static inline char * translate_char(char *p, int from, int to) { @@ -366,13 +376,13 @@ #endif static BOOL -get_special_folder(int n, char *env) +get_special_folder(int n, WCHAR *env) { LPITEMIDLIST pidl; LPMALLOC alloc; BOOL f = FALSE; if (SHGetSpecialFolderLocation(NULL, n, &pidl) == 0) { - f = SHGetPathFromIDList(pidl, env); + f = SHGetPathFromIDListW(pidl, env); SHGetMalloc(&alloc); alloc->lpVtbl->Free(alloc, pidl); alloc->lpVtbl->Release(alloc); @@ -381,22 +391,34 @@ } static void +regulate_path(WCHAR *path) +{ + WCHAR *p = translate_wchar(path, L'\\', L'/'); + if (p - path == 2 && path[1] == L':') { + *p++ = L'/'; + *p = L'\0'; + } +} + +#define numberof(array) (sizeof(array) / sizeof(*array)) + +static void init_env(void) { - char env[_MAX_PATH]; + WCHAR env[_MAX_PATH]; DWORD len; BOOL f; - if (!GetEnvironmentVariable("HOME", env, sizeof(env))) { + if (!GetEnvironmentVariableW(L"HOME", env, numberof(env))) { f = FALSE; - if (GetEnvironmentVariable("HOMEDRIVE", env, sizeof(env))) - len = strlen(env); + if (GetEnvironmentVariableW(L"HOMEDRIVE", env, numberof(env))) + len = lstrlenW(env); else len = 0; - if (GetEnvironmentVariable("HOMEPATH", env + len, sizeof(env) - len) || len) { + if (GetEnvironmentVariableW(L"HOMEPATH", env + len, numberof(env) - len) || len) { f = TRUE; } - else if (GetEnvironmentVariable("USERPROFILE", env, sizeof(env))) { + else if (GetEnvironmentVariableW(L"USERPROFILE", env, numberof(env))) { f = TRUE; } else if (get_special_folder(CSIDL_PROFILE, env)) { @@ -406,25 +428,20 @@ f = TRUE; } if (f) { - char *p = translate_char(env, '\\', '/'); - if (p - env == 2 && env[1] == ':') { - *p++ = '/'; - *p = 0; - } - SetEnvironmentVariable("HOME", env); + regulate_path(env); + SetEnvironmentVariableW(L"HOME", env); } } - if (!GetEnvironmentVariable("USER", env, sizeof env)) { - if (GetEnvironmentVariable("USERNAME", env, sizeof env)) { - SetEnvironmentVariable("USER", env); - } - else if (!GetUserName(env, (len = sizeof env, &len))) { + if (!GetEnvironmentVariableW(L"USER", env, numberof(env))) { + if (!GetEnvironmentVariableW(L"USERNAME", env, numberof(env)) && + !GetUserNameW(env, (len = numberof(env), &len))) { NTLoginName = "<Unknown>"; return; } + SetEnvironmentVariableW(L"USER", env); } - NTLoginName = strdup(env); + NTLoginName = strdup(rb_w32_getenv("USER")); } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/