mirror of git://gcc.gnu.org/git/gcc.git
re PR libstdc++/13631 (Problems in messages)
PR libstdc++/13631 * config/locale/gnu/messages_members.cc (get_glibc_msg): Fix fallback implementation for old glibc. Fix whitespace. From-SVN: r221494
This commit is contained in:
parent
b4f3051a5f
commit
2a9611d03b
|
|
@ -1,3 +1,9 @@
|
||||||
|
2015-03-18 Jonathan Wakely <jwakely@redhat.com>
|
||||||
|
|
||||||
|
PR libstdc++/13631
|
||||||
|
* config/locale/gnu/messages_members.cc (get_glibc_msg): Fix fallback
|
||||||
|
implementation for old glibc. Fix whitespace.
|
||||||
|
|
||||||
2015-03-18 Jonathan Wakely <jwakely@redhat.com>
|
2015-03-18 Jonathan Wakely <jwakely@redhat.com>
|
||||||
Torvald Riegel <triegel@redhat.com>
|
Torvald Riegel <triegel@redhat.com>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstdlib> // std::free
|
||||||
|
#include <string.h> // ::strdup
|
||||||
|
|
||||||
#include <backward/auto_ptr.h>
|
#include <backward/auto_ptr.h>
|
||||||
#include <ext/concurrence.h>
|
#include <ext/concurrence.h>
|
||||||
|
|
@ -139,28 +141,28 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
const char*
|
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* __domainname,
|
||||||
const char* __dfault)
|
const char* __dfault)
|
||||||
{
|
{
|
||||||
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
|
||||||
std::__c_locale __old = __uselocale(__locale_messages);
|
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);
|
const char* __msg = dgettext(__domainname, __dfault);
|
||||||
setlocale(LC_ALL, __sav);
|
__uselocale(__old);
|
||||||
delete [] __sav;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return __msg;
|
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)
|
namespace std _GLIBCXX_VISIBILITY(default)
|
||||||
|
|
@ -172,14 +174,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
typename messages<char>::catalog
|
typename messages<char>::catalog
|
||||||
messages<char>::do_open(const basic_string<char>& __s,
|
messages<char>::do_open(const basic_string<char>& __s,
|
||||||
const locale& __l) const
|
const locale& __l) const
|
||||||
{
|
{
|
||||||
typedef codecvt<char, char, mbstate_t> __codecvt_t;
|
typedef codecvt<char, char, mbstate_t> __codecvt_t;
|
||||||
const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
|
const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
|
||||||
|
|
||||||
bind_textdomain_codeset(__s.c_str(),
|
bind_textdomain_codeset(__s.c_str(),
|
||||||
__nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
|
__nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
|
||||||
return get_catalogs()._M_add(__s, __l);
|
return get_catalogs()._M_add(__s, __l);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void
|
void
|
||||||
|
|
@ -199,7 +201,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
if (!__cat_info)
|
if (!__cat_info)
|
||||||
return __dfault;
|
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(),
|
__cat_info->_M_domain.c_str(),
|
||||||
__dfault.c_str());
|
__dfault.c_str());
|
||||||
}
|
}
|
||||||
|
|
@ -209,15 +211,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
typename messages<wchar_t>::catalog
|
typename messages<wchar_t>::catalog
|
||||||
messages<wchar_t>::do_open(const basic_string<char>& __s,
|
messages<wchar_t>::do_open(const basic_string<char>& __s,
|
||||||
const locale& __l) const
|
const locale& __l) const
|
||||||
{
|
{
|
||||||
typedef codecvt<wchar_t, char, mbstate_t> __codecvt_t;
|
typedef codecvt<wchar_t, char, mbstate_t> __codecvt_t;
|
||||||
const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
|
const __codecvt_t& __codecvt = use_facet<__codecvt_t>(__l);
|
||||||
|
|
||||||
bind_textdomain_codeset(__s.c_str(),
|
bind_textdomain_codeset(__s.c_str(),
|
||||||
__nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
|
__nl_langinfo_l(CODESET, __codecvt._M_c_locale_codecvt));
|
||||||
|
|
||||||
return get_catalogs()._M_add(__s, __l);
|
return get_catalogs()._M_add(__s, __l);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
void
|
void
|
||||||
|
|
@ -257,15 +259,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
|
||||||
// Make sure string passed to dgettext is \0 terminated.
|
// Make sure string passed to dgettext is \0 terminated.
|
||||||
*__dfault_next = '\0';
|
*__dfault_next = '\0';
|
||||||
__translation
|
__translation = get_glibc_msg(_M_c_locale_messages, _M_name_messages,
|
||||||
= get_glibc_msg(_M_c_locale_messages,
|
__cat_info->_M_domain.c_str(), __dfault);
|
||||||
__cat_info->_M_domain.c_str(), __dfault);
|
|
||||||
|
|
||||||
// If we end up getting default value back we can simply return original
|
// If we end up getting default value back we can simply return original
|
||||||
// default value.
|
// default value.
|
||||||
if (__translation == __dfault)
|
if (__translation == __dfault)
|
||||||
return __wdfault;
|
return __wdfault;
|
||||||
}
|
}
|
||||||
|
|
||||||
__builtin_memset(&__state, 0, sizeof(mbstate_t));
|
__builtin_memset(&__state, 0, sizeof(mbstate_t));
|
||||||
size_t __size = __builtin_strlen(__translation);
|
size_t __size = __builtin_strlen(__translation);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue