summaryrefslogtreecommitdiff
path: root/Source/Core/Common/StringUtil.cpp
diff options
context:
space:
mode:
authorGabriel Corona <gabriel.corona@enst-bretagne.fr>2015-02-02 00:45:37 +0100
committerGabriel Corona <gabriel.corona@enst-bretagne.fr>2015-02-04 17:49:22 +0100
commit266d50c8112dabc7a24bd290670e93bfef5b12f8 (patch)
tree2ae2353c232142c8f12436fb17a289ecc170e280 /Source/Core/Common/StringUtil.cpp
parent3c475b91ea5c4baa13b1339c3d2921938e8a3be9 (diff)
Use the C locale for non-Windows CharArrayFromFormatV() and StringFromFormat()
The Windows implementations of CharArrayFromFormatV() and StringFromFormat() use the "C"/".1252" locale instead of the user locale (using _vsnprintf_l). On non-Windows, the user locale was used. This leads to bugs on non-Windows: the Overclock parameter was serialised with the user locale ("0,279322" in some locale) and was interpreted back as "0" (because the C locale is used for parsing the string). Make non-Windows CharArrayFromFormatV() and StringFromFormat() consistent with their Windows counterpart. The locale code is not enables for Android:: uselocale is only available since API 21 and API 21 only supports C and C.UTF-8.
Diffstat (limited to 'Source/Core/Common/StringUtil.cpp')
-rw-r--r--Source/Core/Common/StringUtil.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/Source/Core/Common/StringUtil.cpp b/Source/Core/Common/StringUtil.cpp
index b922704032..7f233e430d 100644
--- a/Source/Core/Common/StringUtil.cpp
+++ b/Source/Core/Common/StringUtil.cpp
@@ -22,9 +22,18 @@
#include <Windows.h>
#else
#include <iconv.h>
+ #include <locale.h>
#include <errno.h>
#endif
+#if !defined(_WIN32) && !defined(ANDROID)
+static locale_t GetCLocale()
+{
+ static locale_t c_locale = newlocale(LC_ALL_MASK, "C", NULL);
+ return c_locale;
+}
+#endif
+
// faster than sscanf
bool AsciiToHex(const std::string& _szValue, u32& result)
{
@@ -77,7 +86,13 @@ bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list ar
c_locale = _create_locale(LC_ALL, ".1252");
writtenCount = _vsnprintf_l(out, outsize, format, c_locale, args);
#else
+ #if !defined(ANDROID)
+ locale_t previousLocale = uselocale(GetCLocale());
+ #endif
writtenCount = vsnprintf(out, outsize, format, args);
+ #if !defined(ANDROID)
+ uselocale(previousLocale);
+ #endif
#endif
if (writtenCount > 0 && writtenCount < outsize)
@@ -112,8 +127,14 @@ std::string StringFromFormatV(const char* format, va_list args)
std::string temp = buf;
delete[] buf;
#else
+ #if !defined(ANDROID)
+ locale_t previousLocale = uselocale(GetCLocale());
+ #endif
if (vasprintf(&buf, format, args) < 0)
ERROR_LOG(COMMON, "Unable to allocate memory for string");
+ #if !defined(ANDROID)
+ uselocale(previousLocale);
+ #endif
std::string temp = buf;
free(buf);