X-Git-Url: https://oss.titaniummirror.com/gitweb?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Fconfig%2Flocale%2Fgnu%2Fctype_members.cc;h=546f878259b860558b1755def2be31d0a0f18408;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=3b78c60405a155b2b94ce08536fb6e42a2a5862c;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/config/locale/gnu/ctype_members.cc b/libstdc++-v3/config/locale/gnu/ctype_members.cc index 3b78c604..546f8782 100644 --- a/libstdc++-v3/config/locale/gnu/ctype_members.cc +++ b/libstdc++-v3/config/locale/gnu/ctype_members.cc @@ -1,11 +1,12 @@ // std::ctype implementation details, GNU version -*- C++ -*- -// Copyright (C) 2001, 2002 Free Software Foundation, Inc. +// Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 +// 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 // terms of the GNU General Public License as published by the -// Free Software Foundation; either version 2, or (at your option) +// Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, @@ -13,19 +14,14 @@ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// You should have received a copy of the GNU General Public License along -// with this library; see the file COPYING. If not, write to the Free -// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, -// USA. +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. -// As a special exception, you may use this file as part of a free software -// library without restriction. Specifically, if other files instantiate -// templates or use macros or inline functions from this file, or you compile -// this file and link it with other files to produce an executable, this -// file does not by itself cause the resulting executable to be covered by -// the GNU General Public License. This exception does not however -// invalidate any other reasons why the executable file might be covered by -// the GNU General Public License. +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . // // ISO C++ 14882: 22.2.1.1.2 ctype virtual functions. @@ -34,24 +30,30 @@ // Written by Benjamin Kosnik #include -#include "c++locale_internal.h" +#include +#include + +_GLIBCXX_BEGIN_NAMESPACE(std) -namespace std -{ // NB: The other ctype specializations are in src/locale.cc and // various /config/os/* files. - template<> - ctype_byname::ctype_byname(const char* __s, size_t __refs) - : ctype(0, false, __refs) - { - _S_destroy_c_locale(_M_c_locale_ctype); - _S_create_c_locale(_M_c_locale_ctype, __s); - _M_toupper = _M_c_locale_ctype->__ctype_toupper; - _M_tolower = _M_c_locale_ctype->__ctype_tolower; - _M_table = _M_c_locale_ctype->__ctype_b; - } - -#ifdef _GLIBCPP_USE_WCHAR_T + ctype_byname::ctype_byname(const char* __s, size_t __refs) + : ctype(0, false, __refs) + { + 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); + this->_M_toupper = this->_M_c_locale_ctype->__ctype_toupper; + this->_M_tolower = this->_M_c_locale_ctype->__ctype_tolower; + this->_M_table = this->_M_c_locale_ctype->__ctype_b; + } + } + + ctype_byname::~ctype_byname() + { } + +#ifdef _GLIBCXX_USE_WCHAR_T ctype::__wmask_type ctype::_M_convert_to_wmask(const mask __m) const { @@ -92,10 +94,10 @@ namespace std __ret = __wctype_l("graph", _M_c_locale_ctype); break; default: - __ret = 0; + __ret = __wmask_type(); } return __ret; - }; + } wchar_t ctype::do_toupper(wchar_t __c) const @@ -129,19 +131,52 @@ namespace std bool ctype:: - do_is(mask __m, char_type __c) const + do_is(mask __m, wchar_t __c) const { - return static_cast(__iswctype_l(__c, _M_convert_to_wmask(__m), - _M_c_locale_ctype)); + // The case of __m == ctype_base::space is particularly important, + // due to its use in many istream functions. Therefore we deal with + // it first, exploiting the knowledge that on GNU systems _M_bit[5] + // is the mask corresponding to ctype_base::space. NB: an encoding + // change would not affect correctness! + bool __ret = false; + if (__m == _M_bit[5]) + __ret = __iswctype_l(__c, _M_wmask[5], _M_c_locale_ctype); + else + { + // Highest bitmask in ctype_base == 10, but extra in "C" + // library for blank. + const size_t __bitmasksize = 11; + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) + if (__m & _M_bit[__bitcur]) + { + if (__iswctype_l(__c, _M_wmask[__bitcur], _M_c_locale_ctype)) + { + __ret = true; + break; + } + else if (__m == _M_bit[__bitcur]) + break; + } + } + return __ret; } - + const wchar_t* ctype:: - do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __m) const + do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const { - while (__lo < __hi && !this->do_is(*__m, *__lo)) - ++__lo; - return __lo; + for (; __lo < __hi; ++__vec, ++__lo) + { + // Highest bitmask in ctype_base == 10, but extra in "C" + // library for blank. + const size_t __bitmasksize = 11; + mask __m = 0; + for (size_t __bitcur = 0; __bitcur <= __bitmasksize; ++__bitcur) + if (__iswctype_l(*__lo, _M_wmask[__bitcur], _M_c_locale_ctype)) + __m |= _M_bit[__bitcur]; + *__vec = __m; + } + return __hi; } const wchar_t* @@ -165,41 +200,31 @@ namespace std wchar_t ctype:: do_widen(char __c) const - { -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) - __c_locale __old = __uselocale(_M_c_locale_ctype); -#endif - wchar_t __ret = btowc(__c); -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) - __uselocale(__old); -#endif - return __ret; - } + { return _M_widen[static_cast(__c)]; } const char* ctype:: do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const { -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) - __c_locale __old = __uselocale(_M_c_locale_ctype); -#endif - mbstate_t __state; - memset(static_cast(&__state), 0, sizeof(mbstate_t)); - mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); -#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) - __uselocale(__old); -#endif + while (__lo < __hi) + { + *__dest = _M_widen[static_cast(*__lo)]; + ++__lo; + ++__dest; + } return __hi; } char ctype:: do_narrow(wchar_t __wc, char __dfault) const - { + { + if (__wc >= 0 && __wc < 128 && _M_narrow_ok) + return _M_narrow[__wc]; #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __c_locale __old = __uselocale(_M_c_locale_ctype); #endif - int __c = wctob(__wc); + const int __c = wctob(__wc); #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __uselocale(__old); #endif @@ -214,27 +239,65 @@ namespace std #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __c_locale __old = __uselocale(_M_c_locale_ctype); #endif - 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(__c)); + } + ++__lo; + ++__dest; + } + else + while (__lo < __hi) + { + const int __c = wctob(*__lo); + *__dest = (__c == EOF ? __dfault : static_cast(__c)); + ++__lo; + ++__dest; + } +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __uselocale(__old); +#endif + return __hi; + } + + void + ctype::_M_initialize_ctype() + { +#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) + __c_locale __old = __uselocale(_M_c_locale_ctype); +#endif + 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(&__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(__c); + } + if (__i == 128) + _M_narrow_ok = true; + else + _M_narrow_ok = false; + for (size_t __j = 0; + __j < sizeof(_M_widen) / sizeof(wint_t); ++__j) + _M_widen[__j] = btowc(__j); + + for (size_t __k = 0; __k <= 11; ++__k) + { + _M_bit[__k] = static_cast(_ISbit(__k)); + _M_wmask[__k] = _M_convert_to_wmask(_M_bit[__k]); } #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) __uselocale(__old); #endif - return __hi; } -#endif // _GLIBCPP_USE_WCHAR_T -} +#endif // _GLIBCXX_USE_WCHAR_T + +_GLIBCXX_END_NAMESPACE