summaryrefslogtreecommitdiffstats
path: root/contrib/libstdc++/config/locale/generic/ctype_members.cc
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/libstdc++/config/locale/generic/ctype_members.cc')
-rw-r--r--contrib/libstdc++/config/locale/generic/ctype_members.cc115
1 files changed, 78 insertions, 37 deletions
diff --git a/contrib/libstdc++/config/locale/generic/ctype_members.cc b/contrib/libstdc++/config/locale/generic/ctype_members.cc
index 71e810a..af994cb 100644
--- a/contrib/libstdc++/config/locale/generic/ctype_members.cc
+++ b/contrib/libstdc++/config/locale/generic/ctype_members.cc
@@ -1,6 +1,6 @@
// std::ctype implementation details, generic version -*- C++ -*-
-// Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc.
+// Copyright (C) 2001, 2002, 2003, 2004 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
@@ -43,11 +43,14 @@ namespace std
ctype_byname<char>::ctype_byname(const char* __s, size_t __refs)
: ctype<char>(0, false, __refs)
{
- _S_destroy_c_locale(_M_c_locale_ctype);
- _S_create_c_locale(_M_c_locale_ctype, __s);
+ if (std::strcmp(__s, "C") != 0 && std::strcmp(__s, "POSIX") != 0)
+ {
+ this->_S_destroy_c_locale(this->_M_c_locale_ctype);
+ this->_S_create_c_locale(this->_M_c_locale_ctype, __s);
+ }
}
-#ifdef _GLIBCPP_USE_WCHAR_T
+#ifdef _GLIBCXX_USE_WCHAR_T
ctype<wchar_t>::__wmask_type
ctype<wchar_t>::_M_convert_to_wmask(const mask __m) const
{
@@ -128,13 +131,16 @@ namespace std
do_is(mask __m, char_type __c) const
{
bool __ret = false;
- const size_t __bitmasksize = 10;
+ // Generically, 15 (instead of 10) since we don't know the numerical
+ // encoding of the various categories in /usr/include/ctype.h.
+ const size_t __bitmasksize = 15;
for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
- {
- const mask __bit = static_cast<mask>(1 << __bitcur);
- if (__m & __bit)
- __ret |= iswctype(__c, _M_convert_to_wmask(__bit));
- }
+ if (__m & _M_bit[__bitcur]
+ && iswctype(__c, _M_wmask[__bitcur]))
+ {
+ __ret = true;
+ break;
+ }
return __ret;
}
@@ -144,14 +150,13 @@ namespace std
{
for (;__lo < __hi; ++__vec, ++__lo)
{
- const size_t __bitmasksize = 10;
+ // Generically, 15 (instead of 10) since we don't know the numerical
+ // encoding of the various categories in /usr/include/ctype.h.
+ const size_t __bitmasksize = 15;
mask __m = 0;
for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur)
- {
- const mask __bit = static_cast<mask>(1 << __bitcur);
- if (iswctype(*__lo, _M_convert_to_wmask(__bit)))
- __m |= __bit;
- }
+ if (iswctype(*__lo, _M_wmask[__bitcur]))
+ __m |= _M_bit[__bitcur];
*__vec = __m;
}
return __hi;
@@ -178,15 +183,18 @@ namespace std
wchar_t
ctype<wchar_t>::
do_widen(char __c) const
- { return btowc(__c); }
+ { return _M_widen[static_cast<unsigned char>(__c)]; }
const char*
ctype<wchar_t>::
do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const
{
- mbstate_t __state;
- memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t));
- mbsrtowcs(__dest, &__lo, __hi - __lo, &__state);
+ while (__lo < __hi)
+ {
+ *__dest = _M_widen[static_cast<unsigned char>(*__lo)];
+ ++__lo;
+ ++__dest;
+ }
return __hi;
}
@@ -194,7 +202,9 @@ namespace std
ctype<wchar_t>::
do_narrow(wchar_t __wc, char __dfault) const
{
- int __c = wctob(__wc);
+ if (__wc >= 0 && __wc < 128 && _M_narrow_ok)
+ return _M_narrow[__wc];
+ const int __c = wctob(__wc);
return (__c == EOF ? __dfault : static_cast<char>(__c));
}
@@ -203,24 +213,55 @@ namespace std
do_narrow(const wchar_t* __lo, const wchar_t* __hi, char __dfault,
char* __dest) const
{
- size_t __offset = 0;
- while (true)
+ if (_M_narrow_ok)
+ while (__lo < __hi)
+ {
+ if (*__lo >= 0 && *__lo < 128)
+ *__dest = _M_narrow[*__lo];
+ else
+ {
+ const int __c = wctob(*__lo);
+ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
+ }
+ ++__lo;
+ ++__dest;
+ }
+ else
+ while (__lo < __hi)
+ {
+ const int __c = wctob(*__lo);
+ *__dest = (__c == EOF ? __dfault : static_cast<char>(__c));
+ ++__lo;
+ ++__dest;
+ }
+ return __hi;
+ }
+
+ void
+ ctype<wchar_t>::_M_initialize_ctype()
+ {
+ wint_t __i;
+ for (__i = 0; __i < 128; ++__i)
{
- const wchar_t* __start = __lo + __offset;
- size_t __len = __hi - __start;
-
- mbstate_t __state;
- memset(static_cast<void*>(&__state), 0, sizeof(mbstate_t));
- size_t __con = wcsrtombs(__dest + __offset, &__start, __len, &__state);
- if (__con != __len && __start != 0)
- {
- __offset = __start - __lo;
- __dest[__offset++] = __dfault;
- }
- else
+ const int __c = wctob(__i);
+ if (__c == EOF)
break;
+ else
+ _M_narrow[__i] = static_cast<char>(__c);
}
- return __hi;
+ if (__i == 128)
+ _M_narrow_ok = true;
+ else
+ _M_narrow_ok = false;
+ for (size_t __i = 0;
+ __i < sizeof(_M_widen) / sizeof(wint_t); ++__i)
+ _M_widen[__i] = btowc(__i);
+
+ for (size_t __i = 0; __i <= 15; ++__i)
+ {
+ _M_bit[__i] = static_cast<mask>(1 << __i);
+ _M_wmask[__i] = _M_convert_to_wmask(_M_bit[__i]);
+ }
}
-#endif // _GLIBCPP_USE_WCHAR_T
+#endif // _GLIBCXX_USE_WCHAR_T
}
OpenPOWER on IntegriCloud