Fix gettext on MSVC
authorBlockMen <nmuelll@web.de>
Thu, 12 Feb 2015 01:55:50 +0000 (02:55 +0100)
committerCraig Robbins <kde.psych@gmail.com>
Thu, 12 Feb 2015 15:23:30 +0000 (01:23 +1000)
src/gettext.cpp
src/gettext.h
src/util/string.cpp

index 688a225707f642e74ff66aea048720e34fd06880..fc7569418a9105ab3ddac30f88bad74fa5bbbddc 100644 (file)
@@ -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;
 }
index 8e6282887632e81e0a9534ec6d6f699823b78aad..dce45fa3aafd3b339bbf843cbcb6fc5ab3b53c5b 100644 (file)
@@ -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)
index b4908d62d71ac16cccde4028c9b267a615a2b3de..00499ff32f7b03353538e5b42a4d2c15a67a678a 100644 (file)
@@ -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__