aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc
diff options
context:
space:
mode:
authorJohn Marino <gnugcc@marino.st>2015-08-27 12:12:41 +0000
committerJonathan Wakely <jwakely@redhat.com>2015-08-27 12:12:41 +0000
commiteca38e8d9e57664d31b591771df9f529f3bcae3f (patch)
tree329a40068557be978e05678346e2bd98819dc11b /libstdc++-v3/config/os/bsd/dragonfly/ctype_configure_char.cc
parentd7cd1855606286552b50763b279317ce5a236087 (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.cc66
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)