summaryrefslogtreecommitdiff
path: root/libstdc++-v3/config
diff options
context:
space:
mode:
authorredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-18 16:17:47 +0000
committerredi <redi@138bc75d-0d04-0410-961f-82ee72b054a4>2015-03-18 16:17:47 +0000
commit58d79e33a99adca4865ec72eab93df8d81dacf8b (patch)
treef86c15c6bb0c38cfd5575f7d5bdc946c7e29438a /libstdc++-v3/config
parent648877c4fb8aec1b59cfbb70ec0800c481fe1d03 (diff)
PR libstdc++/13631
* config/locale/gnu/messages_members.cc (get_glibc_msg): Fix fallback implementation for old glibc. Fix whitespace. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221494 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config')
-rw-r--r--libstdc++-v3/config/locale/gnu/messages_members.cc69
1 files changed, 35 insertions, 34 deletions
diff --git a/libstdc++-v3/config/locale/gnu/messages_members.cc b/libstdc++-v3/config/locale/gnu/messages_members.cc
index f115d5fe6f6a..2e6122d2ea52 100644
--- a/libstdc++-v3/config/locale/gnu/messages_members.cc
+++ b/libstdc++-v3/config/locale/gnu/messages_members.cc
@@ -34,6 +34,8 @@
#include <limits>
#include <algorithm>
#include <vector>
+#include <cstdlib> // std::free
+#include <string.h> // ::strdup
#include <backward/auto_ptr.h>
#include <ext/concurrence.h>
@@ -139,28 +141,28 @@ namespace
}
const char*
- get_glibc_msg(__c_locale __attribute__((unused)) __locale_messages,
+ get_glibc_msg(__c_locale __locale_messages __attribute__((unused)),
+ const char* __name_messages __attribute__((unused)),
const char* __domainname,
const char* __dfault)
{
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
std::__c_locale __old = __uselocale(__locale_messages);
- const char* __msg =
- const_cast<const char*>(dgettext(__domainname, __dfault));
- __uselocale(__old);
-#else
- char* __old = setlocale(LC_ALL, 0);
- const size_t __len = strlen(__old) + 1;
- char* __sav = new char[__len];
- memcpy(__sav, __old, __len);
- setlocale(LC_ALL, _M_name_messages);
const char* __msg = dgettext(__domainname, __dfault);
- setlocale(LC_ALL, __sav);
- delete [] __sav;
-#endif
-
+ __uselocale(__old);
return __msg;
- }
+#else
+ if (char* __sav = strdup(setlocale(LC_ALL, 0)))
+ {
+ setlocale(LC_ALL, __name_messages);
+ const char* __msg = dgettext(__domainname, __dfault);
+ setlocale(LC_ALL, __sav);
+ free(__sav);
+ return __msg;
+ }
+ return __dfault;
+#endif
+ }
}
namespace std _GLIBCXX_VISIBILITY(default)
@@ -172,14 +174,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typename messages<char>::catalog
messages<char>::do_open(const basic_string<char>& __s,
const locale& __l) const
- {
- typedef codecvt<char, char, mbstate_t> __codecvt_t;
- const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
+ {
+ typedef codecvt<char, char, mbstate_t> __codecvt_t;
+ const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
- bind_textdomain_codeset(__s.c_str(),
- __nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
- return get_catalogs()._M_add(__s, __l);
- }
+ bind_textdomain_codeset(__s.c_str(),
+ __nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
+ return get_catalogs()._M_add(__s, __l);
+ }
template<>
void
@@ -199,7 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if (!__cat_info)
return __dfault;
- return get_glibc_msg(_M_c_locale_messages,
+ return get_glibc_msg(_M_c_locale_messages, _M_name_messages,
__cat_info->_M_domain.c_str(),
__dfault.c_str());
}
@@ -209,15 +211,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
typename messages<wchar_t>::catalog
messages<wchar_t>::do_open(const basic_string<char>& __s,
const locale& __l) const
- {
- typedef codecvt<wchar_t, char, mbstate_t> __codecvt_t;
- const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
+ {
+ typedef codecvt<wchar_t, char, mbstate_t> __codecvt_t;
+ const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
- bind_textdomain_codeset(__s.c_str(),
- __nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
+ bind_textdomain_codeset(__s.c_str(),
+ __nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
- return get_catalogs()._M_add(__s, __l);
- }
+ return get_catalogs()._M_add(__s, __l);
+ }
template<>
void
@@ -257,15 +259,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
// Make sure string passed to dgettext is \0 terminated.
*__dfault_next = '\0';
- __translation
- = get_glibc_msg(_M_c_locale_messages,
- __cat_info->_M_domain.c_str(), __dfault);
+ __translation = get_glibc_msg(_M_c_locale_messages, _M_name_messages,
+ __cat_info->_M_domain.c_str(), __dfault);
// If we end up getting default value back we can simply return original
// default value.
if (__translation == __dfault)
return __wdfault;
- }
+ }
__builtin_memset(&__state, 0, sizeof(mbstate_t));
size_t __size = __builtin_strlen(__translation);