X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=libstdc%2B%2B-v3%2Fconfig%2Flocale%2Fgeneric%2Fctype_members.cc;fp=libstdc%2B%2B-v3%2Fconfig%2Flocale%2Fgeneric%2Fctype_members.cc;h=39671f631ebe039300b22c801fc8bffc0640f74a;hb=6fed43773c9b0ce596dca5686f37ac3fc0fa11c0;hp=f147983c6a2a33d4218dfff02b143efb30f8ac04;hpb=27b11d56b743098deb193d510b337ba22dc52e5c;p=msp430-gcc.git diff --git a/libstdc++-v3/config/locale/generic/ctype_members.cc b/libstdc++-v3/config/locale/generic/ctype_members.cc index f147983c..39671f63 100644 --- a/libstdc++-v3/config/locale/generic/ctype_members.cc +++ b/libstdc++-v3/config/locale/generic/ctype_members.cc @@ -1,11 +1,12 @@ // std::ctype implementation details, generic 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,20 +30,28 @@ // Written by Benjamin Kosnik #include +#include +#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); - } - -#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); + } + } + + ctype_byname::~ctype_byname() + { } + +#ifdef _GLIBCXX_USE_WCHAR_T ctype::__wmask_type ctype::_M_convert_to_wmask(const mask __m) const { @@ -88,7 +92,7 @@ namespace std __ret = wctype("graph"); break; default: - __ret = 0; + __ret = __wmask_type(); } return __ret; }; @@ -126,15 +130,37 @@ namespace std bool ctype:: do_is(mask __m, char_type __c) const - { return static_cast(iswctype(__c, _M_convert_to_wmask(__m))); } + { + bool __ret = false; + // 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) + if (__m & _M_bit[__bitcur] + && iswctype(__c, _M_wmask[__bitcur])) + { + __ret = true; + 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) + { + // 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) + if (iswctype(*__lo, _M_wmask[__bitcur])) + __m |= _M_bit[__bitcur]; + *__vec = __m; + } + return __hi; } const wchar_t* @@ -158,15 +184,18 @@ namespace std wchar_t ctype:: do_widen(char __c) const - { return btowc(__c); } + { return _M_widen[static_cast(__c)]; } const char* ctype:: do_widen(const char* __lo, const char* __hi, wchar_t* __dest) const { - mbstate_t __state; - memset(static_cast(&__state), 0, sizeof(mbstate_t)); - mbsrtowcs(__dest, &__lo, __hi - __lo, &__state); + while (__lo < __hi) + { + *__dest = _M_widen[static_cast(*__lo)]; + ++__lo; + ++__dest; + } return __hi; } @@ -174,7 +203,9 @@ namespace std ctype:: 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(__c)); } @@ -183,24 +214,56 @@ 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(__c)); + } + ++__lo; + ++__dest; + } + else + while (__lo < __hi) + { + const int __c = wctob(*__lo); + *__dest = (__c == EOF ? __dfault : static_cast(__c)); + ++__lo; + ++__dest; + } + return __hi; + } + + void + ctype::_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(&__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); } - 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(1 << __i); + _M_wmask[__i] = _M_convert_to_wmask(_M_bit[__i]); + } } -#endif // _GLIBCPP_USE_WCHAR_T -} +#endif // _GLIBCXX_USE_WCHAR_T + +_GLIBCXX_END_NAMESPACE