Tested x86_64-linux. Pushed to trunk.

-- >8 --

For the C locale we know the encoding is ASCII, so we can avoid using
newlocale and nl_langinfo_l. Similarly, for an unnamed locale, we aren't
going to get a useful answer, so we can just use a default-constrcuted
std::text_encoding representing an unknown encoding.

libstdc++-v3/ChangeLog:

        * src/c++26/text_encoding.cc (__locale_encoding): Add to unnamed
        namespace.
        (std::locale::encoding): Optimize for "C" and "*" names.
---
 libstdc++-v3/src/c++26/text_encoding.cc | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/libstdc++-v3/src/c++26/text_encoding.cc 
b/libstdc++-v3/src/c++26/text_encoding.cc
index b9a50ef1a00..efe2997562a 100644
--- a/libstdc++-v3/src/c++26/text_encoding.cc
+++ b/libstdc++-v3/src/c++26/text_encoding.cc
@@ -36,7 +36,9 @@
 namespace std
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
-
+namespace
+{
+// Attempt to determine the text_encoding used by the named locale.
 text_encoding
 __locale_encoding(const char* name)
 {
@@ -54,6 +56,7 @@ __locale_encoding(const char* name)
   return enc;
 }
 
+} // namespace
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
@@ -87,8 +90,15 @@ std::text_encoding::_M_is_environment() const
 std::text_encoding
 std::locale::encoding() const
 {
-  return std::__locale_encoding(name().c_str());
+  string name = this->name();
+  if (name.length() == 1)
+    {
+      if (name[0] == 'C')
+       return text_encoding(text_encoding::ASCII);
+      if (name[0] == '*')
+       return {};
+    }
+  return __locale_encoding(name.c_str());
 }
 #endif // CHAR_BIT == 8
-
 #endif // _GLIBCXX_USE_NL_LANGINFO_L
-- 
2.45.2

Reply via email to