re PR libstdc++/13631 (Problems in messages)
authorJonathan Wakely <jwakely@redhat.com>
Wed, 18 Mar 2015 16:17:47 +0000 (16:17 +0000)
committerJonathan Wakely <redi@gcc.gnu.org>
Wed, 18 Mar 2015 16:17:47 +0000 (16:17 +0000)
PR libstdc++/13631
* config/locale/gnu/messages_members.cc (get_glibc_msg): Fix fallback
implementation for old glibc. Fix whitespace.

From-SVN: r221494

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/gnu/messages_members.cc

index ae6445e3b864dd92f88b2c314e9b09ac6bb33850..534927fc92ab47466b8b657f7b0203ca89d5182b 100644 (file)
@@ -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>
            Torvald Riegel  <triegel@redhat.com>
 
index f115d5fe6f6ac9a8b3cc47bc30af1f63f4a7c20a..2e6122d2ea520fca9f44659b2b34d9c6f1fa1772 100644 (file)
@@ -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);