diff options
author | John Marino <gnugcc@marino.st> | 2015-08-27 12:12:41 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2015-08-27 12:12:41 +0000 |
commit | eca38e8d9e57664d31b591771df9f529f3bcae3f (patch) | |
tree | 329a40068557be978e05678346e2bd98819dc11b /libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc | |
parent | d7cd1855606286552b50763b279317ce5a236087 (diff) |
Provide nearly complete std::locale support for DragonFly
2015-08-27 John Marino <gnugcc@marino.st>
* acinclude.m4 (*-*-dragonfly*): Change 7 locale support files
from generic to new DragonFly versions.
* configure: Regenerate.
* config/locale/dragonfly/c_locale.cc: Improve locale support.
* config/locale/dragonfly/ctype_members.cc: Likewise.
* config/os/bsd/dragonfly/ctype_configure_char.cc: Likewise.
* config/os/bsd/dragonfly/os_defines.h: Define _GLIBCXX_USE_C99.
* config/locale/dragonfly/c_locale.h: New.
* config/locale/dragonfly/codecvt_members.cc: New.
* config/locale/dragonfly/collate_members.cc: New.
* config/locale/dragonfly/monetary_members.cc: New.
* config/locale/dragonfly/numeric_members.cc: New.
* config/locale/dragonfly/time_members.cc: New.
* config/locale/dragonfly/time_members.h: New.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@227257 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc')
-rw-r--r-- | libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc | 66 |
1 files changed, 47 insertions, 19 deletions
diff --git a/libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc b/libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc index 043d1365b39..b1c24a2e1a5 100644 --- a/libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc +++ b/libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc @@ -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) |