acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Change locale implementation from darwin to...
authorAndreas Tobler <andreast@gcc.gnu.org>
Sat, 14 Nov 2015 21:17:24 +0000 (22:17 +0100)
committerAndreas Tobler <andreast@gcc.gnu.org>
Sat, 14 Nov 2015 21:17:24 +0000 (22:17 +0100)
2015-11-14  Andreas Tobler  <andreast@gcc.gnu.org>

    * acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Change locale implementation
    from darwin to DragonFly.
    * configure: Regenerate.
    * config/os/bsd/freebsd/ctype_configure_char.cc: Improve locale
    support, do it the same as DragonFly.
    * config/os/bsd/freebsd/os_defines.h: Add fine grained C99 defines.

From-SVN: r230383

libstdc++-v3/ChangeLog
libstdc++-v3/acinclude.m4
libstdc++-v3/config/os/bsd/freebsd/ctype_configure_char.cc
libstdc++-v3/config/os/bsd/freebsd/os_defines.h
libstdc++-v3/configure

index 6f5ecebe3298496e782ce1ae5e58e0eb0d63e044..942e418b185f6933b1963069defb594f6713032a 100644 (file)
@@ -1,3 +1,12 @@
+2015-11-14  Andreas Tobler  <andreast@gcc.gnu.org>
+
+       * acinclude.m4 (GLIBCXX_ENABLE_CLOCALE): Change locale implementation
+       from darwin to DragonFly.
+       * configure: Regenerate.
+       * config/os/bsd/freebsd/ctype_configure_char.cc: Improve locale
+       support, do it the same as DragonFly.
+       * config/os/bsd/freebsd/os_defines.h: Add fine grained C99 defines.
+
 2015-11-14  Jonathan Wakely  <jwakely@redhat.com>
 
        * testsuite/21_strings/basic_string/capacity/char/18654.cc: Use
index deefa04155edbef7f987cd3f46b934fd76e79164..e6575eae678936cec7ae9fb8162f309037ffb0db 100644 (file)
@@ -2236,10 +2236,10 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
        enable_clocale_flag=gnu
        ;;
-      darwin* | freebsd*)
+      darwin*)
        enable_clocale_flag=darwin
        ;;
-      dragonfly*)
+      dragonfly* | freebsd*)
        enable_clocale_flag=dragonfly
        ;;
       openbsd*)
@@ -2318,7 +2318,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
       ;;
     darwin)
-      AC_MSG_RESULT(darwin or freebsd)
+      AC_MSG_RESULT(darwin)
 
       CLOCALE_H=config/locale/generic/c_locale.h
       CLOCALE_CC=config/locale/generic/c_locale.cc
@@ -2335,7 +2335,7 @@ AC_DEFUN([GLIBCXX_ENABLE_CLOCALE], [
       ;;
 
     dragonfly)
-      AC_MSG_RESULT(dragonfly)
+      AC_MSG_RESULT(dragonfly or freebsd)
 
       CLOCALE_H=config/locale/dragonfly/c_locale.h
       CLOCALE_CC=config/locale/dragonfly/c_locale.cc
index 9a57abe1c85776f5a8a8f97848b840d7bc44bf8d..b1c24a2e1a53bedf44c4912336745790e6838f8d 100644 (file)
@@ -1,6 +1,6 @@
 // Locale support -*- C++ -*-
 
-// Copyright (C) 2011-2015 Free Software Foundation, Inc.
+// Copyright (C) 2014-2015 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -37,32 +37,60 @@ namespace std _GLIBCXX_VISIBILITY(default)
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
 // Information as gleaned from /usr/include/ctype.h
-  
+
   const ctype_base::mask*
   ctype<char>::classic_table() throw()
-  { return 0; }
-
-  ctype<char>::ctype(__c_locale, const mask* __table, bool __del, 
-                    size_t __refs) 
-  : facet(__refs), _M_del(__table != 0 && __del), 
-  _M_toupper(NULL), _M_tolower(NULL), 
-  _M_table(__table ? __table : classic_table()) 
-  { 
+  { return NULL; }
+
+  ctype<char>::ctype(__c_locale, const mask* __table, bool __del,
+                    size_t __refs)
+  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()),
+  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
+  {
+    char* __old = setlocale(LC_CTYPE, NULL);
+    char* __sav = NULL;
+    if (strcmp(__old, "C"))
+      {
+       const size_t __len = strlen(__old) + 1;
+       __sav = new char[__len];
+       memcpy(__sav, __old, __len);
+       setlocale(LC_CTYPE, "C");
+      }
+    _M_toupper = NULL;
+    _M_tolower = NULL;
+    _M_table = __table ? __table : classic_table();
+    if (__sav)
+      {
+       setlocale(LC_CTYPE, __sav);
+       delete [] __sav;
+      }
     memset(_M_widen, 0, sizeof(_M_widen));
-    _M_widen_ok = 0;
     memset(_M_narrow, 0, sizeof(_M_narrow));
-    _M_narrow_ok = 0;
   }
 
-  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs) 
-  : facet(__refs), _M_del(__table != 0 && __del), 
-  _M_toupper(NULL), _M_tolower(NULL), 
-  _M_table(__table ? __table : classic_table()) 
-  { 
+  ctype<char>::ctype(const mask* __table, bool __del, size_t __refs)
+  : facet(__refs), _M_c_locale_ctype(_S_get_c_locale()),
+  _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
+  {
+    char* __old = setlocale(LC_CTYPE, NULL);
+    char* __sav = NULL;
+    if (strcmp(__old, "C"))
+      {
+       const size_t __len = strlen(__old) + 1;
+       __sav = new char[__len];
+       memcpy(__sav, __old, __len);
+       setlocale(LC_CTYPE, "C");
+      }
+    _M_toupper = NULL;
+    _M_tolower = NULL;
+    _M_table = __table ? __table : classic_table();
+    if (__sav)
+      {
+       setlocale(LC_CTYPE, __sav);
+       delete [] __sav;
+      }
     memset(_M_widen, 0, sizeof(_M_widen));
-    _M_widen_ok = 0;
     memset(_M_narrow, 0, sizeof(_M_narrow));
-    _M_narrow_ok = 0;
   }
 
   char
@@ -84,7 +112,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
   ctype<char>::do_tolower(char __c) const
   { return ::tolower((int) __c); }
 
-  const char* 
+  const char*
   ctype<char>::do_tolower(char* __low, const char* __high) const
   {
     while (__low < __high)
index 8b50e5fae54d97e465c774ef730beae9937a3372..9422d92cf05bdfb562fac6e350f3f37f81bb21d0 100644 (file)
 // System-specific #define, typedefs, corrections, etc, go here.  This
 // file will come before all others.
 
+#define _GLIBCXX_USE_C99_STDIO 1
+#define _GLIBCXX_USE_C99_STDLIB 1
+#define _GLIBCXX_USE_C99_WCHAR 1
+
 #define _GLIBCXX_USE_C99_CHECK 1
 #define _GLIBCXX_USE_C99_DYNAMIC (!(__ISO_C_VISIBLE >= 1999))
 #define _GLIBCXX_USE_C99_LONG_LONG_CHECK 1
index 991818b3707d03b68b0a3bb928cdc5eeeac9eb0c..3e02b9eabcf3cb911e4c84faeb109beacc2a8021 100755 (executable)
       linux* | gnu* | kfreebsd*-gnu | knetbsd*-gnu)
        enable_clocale_flag=gnu
        ;;
-      darwin* | freebsd*)
+      darwin*)
        enable_clocale_flag=darwin
        ;;
-      dragonfly*)
+      dragonfly* | freebsd*)
        enable_clocale_flag=dragonfly
        ;;
       openbsd*)
@@ -15965,8 +15965,8 @@ $as_echo "generic" >&6; }
       CLOCALE_INTERNAL_H=config/locale/generic/c++locale_internal.h
       ;;
     darwin)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: darwin or freebsd" >&5
-$as_echo "darwin or freebsd" >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: darwin" >&5
+$as_echo "darwin" >&6; }
 
       CLOCALE_H=config/locale/generic/c_locale.h
       CLOCALE_CC=config/locale/generic/c_locale.cc
@@ -15983,8 +15983,8 @@ $as_echo "darwin or freebsd" >&6; }
       ;;
 
     dragonfly)
-      { $as_echo "$as_me:${as_lineno-$LINENO}: result: dragonfly" >&5
-$as_echo "dragonfly" >&6; }
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: dragonfly or freebsd" >&5
+$as_echo "dragonfly or freebsd" >&6; }
 
       CLOCALE_H=config/locale/dragonfly/c_locale.h
       CLOCALE_CC=config/locale/dragonfly/c_locale.cc