diff options
| author | Russell Belfer <rb@github.com> | 2012-05-24 13:56:03 -0700 |
|---|---|---|
| committer | Russell Belfer <rb@github.com> | 2012-05-24 13:56:03 -0700 |
| commit | 5f60fd009804fbd9886549dc74c04294e3e2cf7a (patch) | |
| tree | bcce30c7afd95d783a12b57641eab3f71da2dfa9 /src | |
| parent | d3e9c4a5fce82e34a91934121addc9b296e74cb8 (diff) | |
| parent | 9e35d7fd6ee0b6dc0008982ab84668fbb2478939 (diff) | |
| download | libgit2-5f60fd009804fbd9886549dc74c04294e3e2cf7a.tar.gz | |
Merge pull request #726 from arrbee/utf16-home-dir
Get user's home dir in UTF-16 clean manner
Diffstat (limited to 'src')
| -rw-r--r-- | src/fileops.c | 45 | ||||
| -rw-r--r-- | src/win32/utf-conv.c | 23 |
2 files changed, 52 insertions, 16 deletions
diff --git a/src/fileops.c b/src/fileops.c index d6960ca1a..6dd9270b5 100644 --- a/src/fileops.c +++ b/src/fileops.c @@ -353,13 +353,48 @@ int git_futils_rmdir_r(const char *path, git_directory_removal_type removal_type return error; } +#ifdef GIT_WIN32 +static char *win32_getenv(const wchar_t *name) +{ + char *val_utf8; + wchar_t *val_utf16; + DWORD len = GetEnvironmentVariableW(name, NULL, 0); + + if (len <= 0) + return NULL; + + val_utf16 = git__calloc(len, sizeof(wchar_t)); + if (!val_utf16) + return NULL; + + if (GetEnvironmentVariableW(name, val_utf16, len) != len - 1) { + giterr_set(GITERR_OS, "Could not read environment variable"); + git__free(val_utf16); + return NULL; + } + + val_utf8 = gitwin_from_utf16(val_utf16); + + git__free(val_utf16); + + return val_utf8; +} +#endif + int git_futils_find_global_file(git_buf *path, const char *filename) { - const char *home = getenv("HOME"); + char *home; #ifdef GIT_WIN32 - if (home == NULL) - home = getenv("USERPROFILE"); + home = win32_getenv(L"HOME"); + + if (!home) + home = win32_getenv(L"USERPROFILE"); + + if (home) + git_path_mkposix(home); +#else + home = getenv("HOME"); #endif if (home == NULL) { @@ -371,6 +406,10 @@ int git_futils_find_global_file(git_buf *path, const char *filename) if (git_buf_joinpath(path, home, filename) < 0) return -1; +#ifdef GIT_WIN32 + git__free(home); +#endif + if (git_path_exists(path->ptr) == false) { git_buf_clear(path); return GIT_ENOTFOUND; diff --git a/src/win32/utf-conv.c b/src/win32/utf-conv.c index 76f1e4237..0a705c0ad 100644 --- a/src/win32/utf-conv.c +++ b/src/win32/utf-conv.c @@ -32,19 +32,16 @@ void gitwin_set_utf8(void) wchar_t* gitwin_to_utf16(const char* str) { wchar_t* ret; - size_t cb; + int cb; if (!str) return NULL; - cb = strlen(str) * sizeof(wchar_t); + cb = MultiByteToWideChar(_active_codepage, 0, str, -1, NULL, 0); if (cb == 0) return (wchar_t *)git__calloc(1, sizeof(wchar_t)); - /* Add space for null terminator */ - cb += sizeof(wchar_t); - - ret = (wchar_t *)git__malloc(cb); + ret = (wchar_t *)git__malloc(cb * sizeof(wchar_t)); if (!ret) return NULL; @@ -59,7 +56,8 @@ wchar_t* gitwin_to_utf16(const char* str) int gitwin_append_utf16(wchar_t *buffer, const char *str, size_t len) { - int result = MultiByteToWideChar(_active_codepage, 0, str, -1, buffer, (int)len); + int result = MultiByteToWideChar( + _active_codepage, 0, str, -1, buffer, (int)len); if (result == 0) giterr_set(GITERR_OS, "Could not convert string to UTF-16"); return result; @@ -68,23 +66,22 @@ int gitwin_append_utf16(wchar_t *buffer, const char *str, size_t len) char* gitwin_from_utf16(const wchar_t* str) { char* ret; - size_t cb; + int cb; if (!str) return NULL; - cb = wcslen(str) * sizeof(char); + cb = WideCharToMultiByte(_active_codepage, 0, str, -1, NULL, 0, NULL, NULL); if (cb == 0) return (char *)git__calloc(1, sizeof(char)); - /* Add space for null terminator */ - cb += sizeof(char); - ret = (char*)git__malloc(cb); if (!ret) return NULL; - if (WideCharToMultiByte(_active_codepage, 0, str, -1, ret, (int)cb, NULL, NULL) == 0) { + if (WideCharToMultiByte( + _active_codepage, 0, str, -1, ret, (int)cb, NULL, NULL) == 0) + { giterr_set(GITERR_OS, "Could not convert string to UTF-8"); git__free(ret); ret = NULL; |
