From: ShadowNinja <shadowninja@minetest.net>
Date: Thu, 15 Oct 2015 04:45:56 +0000 (-0400)
Subject: Clean up gettext initialization
X-Git-Tag: 0.4.14~609
X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=e067ceacb8787f1dc5b1ab69b50dba4497c55433;p=oweals%2Fminetest.git

Clean up gettext initialization
---

diff --git a/src/gettext.cpp b/src/gettext.cpp
index e8819f131..26b16f434 100644
--- a/src/gettext.cpp
+++ b/src/gettext.cpp
@@ -118,106 +118,90 @@ const char* MSVC_LocaleLookup(const char* raw_shortname) {
 
 /******************************************************************************/
 #ifdef _MSC_VER
-void init_gettext(const char *path, const std::string &configured_language, int argc, char** argv) {
+void init_gettext(const char *path, const std::string &configured_language,
+	int argc, const char *argv[])
 #else
-void init_gettext(const char *path, const std::string &configured_language) {
+void init_gettext(const char *path, const std::string &configured_language)
 #endif
+{
 #if USE_GETTEXT
-	/** first try to set user override environment **/
-	if (configured_language.length() != 0) {
+	// First, try to set user override environment
+	if (!configured_language.empty()) {
 #ifndef _WIN32
-		/* add user specified locale to environment */
+		// Add user specified locale to environment
 		setenv("LANGUAGE", configured_language.c_str(), 1);
 
-		/* reload locale with changed environment */
+		// Reload locale with changed environment
 		setlocale(LC_ALL, "");
 #elif defined(_MSC_VER)
-		std::string current_language_var("");
-		if (getenv("LANGUAGE") != 0) {
-			current_language_var = std::string(getenv("LANGUAGE"));
-		}
-
-		char *lang_str = (char*)calloc(10 + configured_language.length(), sizeof(char));
-		strcat(lang_str, "LANGUAGE=");
-		strcat(lang_str, configured_language.c_str());
-		putenv(lang_str);
+		std::string current_language;
+		const char *env_lang = getenv("LANGUAGE");
+		if (env_lang)
+			current_language = env_lang;
 
-		SetEnvironmentVariableA("LANGUAGE",configured_language.c_str());
+		_putenv(("LANGUAGE=" + configured_language).c_str());
+		SetEnvironmentVariableA("LANGUAGE", configured_language.c_str());
 
 #ifndef SERVER
-		//very very dirty workaround to force gettext to see the right environment
-		if (current_language_var != configured_language) {
-			STARTUPINFO startupinfo;
-			PROCESS_INFORMATION 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 = "";
-
-			for (unsigned int i=1;i < argc; i++) {
-				if (parameters != "") {
-					parameters += " ";
-				}
+		// Hack to force gettext to see the right environment
+		if (current_language != configured_language) {
+			errorstream << "MSVC localization workaround active.  "
+				"Restarting " PROJECT_NAME_C " in a new environment!" << std::endl;
+
+			std::string parameters;
+
+			for (unsigned int i = 1; i < argc; i++) {
+				if (!parameters.empty())
+					parameters += ' ';
+
 				parameters += argv[i];
 			}
 
-			const char* ptr_parameters = 0;
+			const char *ptr_parameters = NULL;
 
-			if (parameters != "") {
+			if (!parameters.empty())
 				ptr_parameters = parameters.c_str();
-			}
 
-			/** users may start by short name in commandline without extention **/
-			std::string appname = argv[0];
-			if (appname.substr(appname.length() - 4) != ".exe") {
-				appname += ".exe";
-			}
+			// Allow calling without an extension
+			std::string app_name = argv[0];
+			if (app_name.compare(appname.size() - 4, 4, ".exe") != 0)
+				app_name += ".exe";
+
+			STARTUPINFO startup_info = {0};
+			PROCESS_INFORMATION process_info = {0};
 
-			if (!CreateProcess(appname.c_str(),
-					(char*) ptr_parameters,
-					NULL,
-					NULL,
-					false,
-					DETACHED_PROCESS | CREATE_UNICODE_ENVIRONMENT,
-					NULL,
-					NULL,
-					&startupinfo,
-					&processinfo)) {
+			bool success = CreateProcess(app_name.c_str(), (char *)ptr_parameters,
+				NULL, NULL, false, DETACHED_PROCESS | CREATE_UNICODE_ENVIRONMENT,
+				NULL, NULL, &startup_info, &process_info);
+
+			if (success) {
+				exit(0);
+				// NOTREACHED
+			} else {
 				char buffer[1024];
-				FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
-					NULL,
-					GetLastError(),
-					MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),
-					buffer,
-					sizeof(buffer)-1,
-					NULL);
+
+				FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(),
+					MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), buffer,
+					sizeof(buffer) - 1, NULL);
+
 				errorstream << "*******************************************************" << std::endl;
-				errorstream << "CMD: " << appname << std::endl;
+				errorstream << "CMD: " << app_name << std::endl;
 				errorstream << "Failed to restart with current locale: " << std::endl;
 				errorstream << buffer;
 				errorstream << "Expect language to be broken!" << std::endl;
 				errorstream << "*******************************************************" << std::endl;
 			}
-			else {
-				exit(0);
-			}
 		}
 #else
 		errorstream << "*******************************************************" << std::endl;
 		errorstream << "Can't apply locale workaround for server!" << std::endl;
 		errorstream << "Expect language to be broken!" << std::endl;
 		errorstream << "*******************************************************" << std::endl;
-
 #endif
 
-		setlocale(LC_ALL,configured_language.c_str());
+		setlocale(LC_ALL, configured_language.c_str());
 #else // Mingw
-		char *lang_str = (char*)calloc(10 + configured_language.length(), sizeof(char));
-		strcat(lang_str, "LANGUAGE=");
-		strcat(lang_str, configured_language.c_str());
-		putenv(lang_str);
-
+		_putenv(("LANGUAGE=" + configured_language).c_str());
 		setlocale(LC_ALL, "");
 #endif // ifndef _WIN32
 	}
diff --git a/src/gettext.h b/src/gettext.h
index 9b4e801f7..0170d1c45 100644
--- a/src/gettext.h
+++ b/src/gettext.h
@@ -34,7 +34,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #ifdef _MSC_VER
 void init_gettext(const char *path, const std::string &configured_language,
-		int argc, char** argv);
+		int argc, const char *argv[]);
 #else
 void init_gettext(const char *path, const std::string &configured_language);
 #endif