diff options
Diffstat (limited to 'contrib/libstdc++/config/locale/generic/ctype_members.cc')
-rw-r--r-- | contrib/libstdc++/config/locale/generic/ctype_members.cc | 115 |
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 } |