diff options
author | BlockMen <nmuelll@web.de> | 2015-02-12 02:55:50 +0100 |
---|---|---|
committer | Craig Robbins <kde.psych@gmail.com> | 2015-02-13 01:23:30 +1000 |
commit | e62927ed71c557cd885fce03fbc34bb6020089a3 (patch) | |
tree | 3c163576fcdc244ffec57797312238c261b03a7c /src/util/string.cpp | |
parent | 15c037614f6f7193cef4bfd1da45d83ef2fef393 (diff) | |
download | minetest-e62927ed71c557cd885fce03fbc34bb6020089a3.tar.gz minetest-e62927ed71c557cd885fce03fbc34bb6020089a3.tar.bz2 minetest-e62927ed71c557cd885fce03fbc34bb6020089a3.zip |
Fix gettext on MSVC
Diffstat (limited to 'src/util/string.cpp')
-rw-r--r-- | src/util/string.cpp | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/src/util/string.cpp b/src/util/string.cpp index b4908d62d..00499ff32 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -98,11 +98,13 @@ const wchar_t *narrow_to_wide_c(const char *mbs) { wchar_t *wcs = NULL; #if defined(_WIN32) - int wcl = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, NULL, 0); - if (!wcl) - return NULL; - wcs = new wchar_t[wcl]; - MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, (WCHAR *) wcs, wcl); + int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, 0, 0); + if (nResult == 0) { + errorstream << "gettext: MultiByteToWideChar returned null" << std::endl; + } else { + wcs = new wchar_t[nResult]; + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, (WCHAR *) wcs, nResult); + } #else size_t wcl = mbstowcs(NULL, mbs, 0); if (wcl == (size_t) -1) @@ -120,12 +122,13 @@ const wchar_t *narrow_to_wide_c(const char *mbs) std::wstring narrow_to_wide(const std::string& mbs) { - const wchar_t *wcs = narrow_to_wide_c(mbs.c_str()); - if (!wcs) + size_t wcl = mbs.size(); + Buffer<wchar_t> wcs(wcl + 1); + size_t l = mbstowcs(*wcs, mbs.c_str(), wcl); + if (l == (size_t)(-1)) return L"<invalid multibyte string>"; - std::wstring wstr(wcs); - delete [] wcs; - return wstr; + wcs[l] = 0; + return *wcs; } #ifdef __ANDROID__ |