From a8c4a7e44c10ab7049487907df6910d6cb61be10 Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 2 Mar 2009 03:22:14 +0000 Subject: * win32/win32.c (init_env): keeps wide chars as wide chars. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@22704 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 4 ++++ win32/win32.c | 57 +++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 20 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2c9897e7a3..32a9e4e835 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Mon Mar 2 12:22:12 2009 Nobuyoshi Nakada + + * win32/win32.c (init_env): keeps wide chars as wide chars. + Mon Mar 2 11:01:45 2009 Nobuyoshi Nakada * ext/dl/dl.h (dlerror): fixed on Windows. diff --git a/win32/win32.c b/win32/win32.c index 9c1a92a55c..02c6036263 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -350,6 +350,16 @@ flock(int fd, int oper) (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 @@ translate_char(char *p, int from, int to) #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); @@ -380,23 +390,35 @@ get_special_folder(int n, char *env) return f; } +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 @@ init_env(void) 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 = ""; return; } + SetEnvironmentVariableW(L"USER", env); } - NTLoginName = strdup(env); + NTLoginName = strdup(rb_w32_getenv("USER")); } -- cgit v1.2.3