aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBlockMen <nmuelll@web.de>2015-02-12 02:55:50 +0100
committerBlockMen <nmuelll@web.de>2015-02-12 16:03:55 +0100
commitd3026293927f560465b325280fef697cc3361daa (patch)
tree6dfe86bb89450f7a47be1e787e51541a20a33846
parente102cbd840c3dc3d52865868369aea3b8ee21028 (diff)
downloadminetest-d3026293927f560465b325280fef697cc3361daa.tar.gz
minetest-d3026293927f560465b325280fef697cc3361daa.tar.bz2
minetest-d3026293927f560465b325280fef697cc3361daa.zip
Fix gettext on MSVC
-rw-r--r--src/gettext.cpp26
-rw-r--r--src/gettext.h7
-rw-r--r--src/util/string.cpp23
3 files changed, 31 insertions, 25 deletions
diff --git a/src/gettext.cpp b/src/gettext.cpp
index 688a22570..fc7569418 100644
--- a/src/gettext.cpp
+++ b/src/gettext.cpp
@@ -26,24 +26,24 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "log.h"
#if USE_GETTEXT && defined(_MSC_VER)
-#include <WinNls.h>
+#include <windows.h>
#include <map>
#include <direct.h>
#include "filesys.h"
-#define setlocale(category,localename) \
- setlocale(category,MSVC_LocaleLookup(localename))
+#define setlocale(category, localename) \
+ setlocale(category, MSVC_LocaleLookup(localename))
-static std::map<std::wstring,std::wstring> glb_supported_locales;
+static std::map<std::wstring, std::wstring> glb_supported_locales;
/******************************************************************************/
BOOL CALLBACK UpdateLocaleCallback(LPTSTR pStr)
{
char* endptr = 0;
- int LOCALEID = strtol(pStr,&endptr,16);
+ int LOCALEID = strtol(pStr, &endptr,16);
wchar_t buffer[LOCALE_NAME_MAX_LENGTH];
- memset(buffer,0,sizeof(buffer));
+ memset(buffer, 0, sizeof(buffer));
if (GetLocaleInfoW(
LOCALEID,
LOCALE_SISO639LANGNAME,
@@ -52,7 +52,7 @@ BOOL CALLBACK UpdateLocaleCallback(LPTSTR pStr)
std::wstring name = buffer;
- memset(buffer,0,sizeof(buffer));
+ memset(buffer, 0, sizeof(buffer));
GetLocaleInfoW(
LOCALEID,
LOCALE_SISO3166CTRYNAME,
@@ -61,7 +61,7 @@ BOOL CALLBACK UpdateLocaleCallback(LPTSTR pStr)
std::wstring country = buffer;
- memset(buffer,0,sizeof(buffer));
+ memset(buffer, 0, sizeof(buffer));
GetLocaleInfoW(
LOCALEID,
LOCALE_SENGLISHLANGUAGENAME,
@@ -96,7 +96,7 @@ const char* MSVC_LocaleLookup(const char* raw_shortname) {
}
if (first_use) {
- EnumSystemLocalesA(UpdateLocaleCallback,LCID_SUPPORTED | LCID_ALTERNATE_SORTS);
+ EnumSystemLocalesA(UpdateLocaleCallback, LCID_SUPPORTED | LCID_ALTERNATE_SORTS);
first_use = false;
}
@@ -148,8 +148,8 @@ void init_gettext(const char *path, const std::string &configured_language) {
if (current_language_var != configured_language) {
STARTUPINFO startupinfo;
PROCESS_INFORMATION processinfo;
- memset(&startupinfo,0,sizeof(startupinfo));
- memset(&processinfo,0,sizeof(processinfo));
+ memset(&startupinfo, 0, sizeof(startupinfo));
+ memset(&processinfo, 0, sizeof(processinfo));
errorstream << "MSVC localization workaround active restating minetest in new environment!" << std::endl;
std::string parameters = "";
@@ -169,7 +169,7 @@ void init_gettext(const char *path, const std::string &configured_language) {
/** users may start by short name in commandline without extention **/
std::string appname = argv[0];
- if (appname.substr(appname.length() -4) != ".exe") {
+ if (appname.substr(appname.length() - 4) != ".exe") {
appname += ".exe";
}
@@ -260,7 +260,7 @@ void init_gettext(const char *path, const std::string &configured_language) {
/* no matter what locale is used we need number format to be "C" */
/* to ensure formspec parameters are evaluated correct! */
- setlocale(LC_NUMERIC,"C");
+ setlocale(LC_NUMERIC, "C");
infostream << "Message locale is now set to: "
<< setlocale(LC_ALL, 0) << std::endl;
}
diff --git a/src/gettext.h b/src/gettext.h
index 8e6282887..dce45fa3a 100644
--- a/src/gettext.h
+++ b/src/gettext.h
@@ -41,16 +41,19 @@ void init_gettext(const char *path, const std::string &configured_language);
extern const wchar_t *narrow_to_wide_c(const char *mbs);
extern std::wstring narrow_to_wide(const std::string &mbs);
-
// You must free the returned string!
inline const wchar_t *wgettext(const char *str)
{
return narrow_to_wide_c(gettext(str));
}
+// Gettext under MSVC needs this strange way. Just don't ask...
inline std::wstring wstrgettext(const std::string &text)
{
- return narrow_to_wide(gettext(text.c_str()));
+ const wchar_t *tmp = wgettext(text.c_str());
+ std::wstring retval = (std::wstring)tmp;
+ delete[] tmp;
+ return retval;
}
inline std::string strgettext(const std::string &text)
diff --git a/src/util/string.cpp b/src/util/string.cpp
index c18e58613..de669b473 100644
--- a/src/util/string.cpp
+++ b/src/util/string.cpp
@@ -99,11 +99,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)
@@ -121,12 +123,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__