1 // Locale support -*- C++ -*- 2 3 // Copyright (C) 2000, 2003, 2004, 2005, 2009, 2010 4 // Free Software Foundation, Inc. 5 // 6 // This file is part of the GNU ISO C++ Library. This library is free 7 // software; you can redistribute it and/or modify it under the 8 // terms of the GNU General Public License as published by the 9 // Free Software Foundation; either version 3, or (at your option) 10 // any later version. 11 12 // This library is distributed in the hope that it will be useful, 13 // but WITHOUT ANY WARRANTY; without even the implied warranty of 14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 // GNU General Public License for more details. 16 17 // Under Section 7 of GPL version 3, you are granted additional 18 // permissions described in the GCC Runtime Library Exception, version 19 // 3.1, as published by the Free Software Foundation. 20 21 // You should have received a copy of the GNU General Public License and 22 // a copy of the GCC Runtime Library Exception along with this program; 23 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24 // <http://www.gnu.org/licenses/>. 25 26 /** @file bits/ctype_inline.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{locale} 29 */ 30 31 // 32 // ISO C++ 14882: 22.1 Locales 33 // 34 35 // ctype bits to be inlined go here. Non-inlinable (ie virtual do_*) 36 // functions go in ctype.cc 37 38 namespace std _GLIBCXX_VISIBILITY(default) 39 { 40 _GLIBCXX_BEGIN_NAMESPACE_VERSION 41 42 bool 43 ctype<char>:: 44 is(mask __m, char __c) const 45 { return _M_table[(unsigned char)(__c)] & __m; } 46 47 const char* 48 ctype<char>:: 49 is(const char* __low, const char* __high, mask* __vec) const 50 { 51 while (__low < __high) 52 *__vec++ = _M_table[*__low++]; 53 return __high; 54 } 55 56 const char* 57 ctype<char>:: 58 scan_is(mask __m, const char* __low, const char* __high) const 59 { 60 while (__low < __high && !this->is(__m, *__low)) 61 ++__low; 62 return __low; 63 } 64 65 const char* 66 ctype<char>:: 67 scan_not(mask __m, const char* __low, const char* __high) const 68 { 69 while (__low < __high && this->is(__m, *__low) != 0) 70 ++__low; 71 return __low; 72 } 73 74 #ifdef _GLIBCXX_USE_WCHAR_T 75 inline bool 76 ctype<wchar_t>:: 77 do_is(mask __m, wchar_t __c) const 78 { 79 return __libc_ctype_ [__c + 1] & __m; 80 } 81 82 inline const wchar_t* 83 ctype<wchar_t>:: 84 do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const 85 { 86 for (; __lo < __hi; ++__vec, ++__lo) 87 { 88 mask __m = 0; 89 if (isupper (*__lo)) __m |= _CTYPEMASK_U; 90 if (islower (*__lo)) __m |= _CTYPEMASK_L; 91 if (isdigit (*__lo)) __m |= _CTYPEMASK_D; 92 if (isspace (*__lo)) __m |= _CTYPEMASK_S; 93 if (ispunct (*__lo)) __m |= _CTYPEMASK_P; 94 if (isblank (*__lo)) __m |= _CTYPEMASK_B; 95 if (iscntrl (*__lo)) __m |= _CTYPEMASK_C; 96 if (isalpha (*__lo)) __m |= _CTYPEMASK_A; 97 if (isgraph (*__lo)) __m |= _CTYPEMASK_G; 98 if (isprint (*__lo)) __m |= _CTYPEMASK_R; 99 if (isxdigit(*__lo)) __m |= _CTYPEMASK_X; 100 /* alnum already covered = alpha | digit */ 101 102 *__vec = __m; 103 } 104 return __hi; 105 } 106 107 inline const wchar_t* 108 ctype<wchar_t>:: 109 do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const 110 { 111 while (__lo < __hi && !(__libc_ctype_ [*__lo + 1] & __m)) 112 ++__lo; 113 return __lo; 114 } 115 116 inline const wchar_t* 117 ctype<wchar_t>:: 118 do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const 119 { 120 while (__lo < __hi && (__libc_ctype_ [*__lo + 1] & __m)) 121 ++__lo; 122 return __lo; 123 } 124 #endif 125 126 _GLIBCXX_END_NAMESPACE_VERSION 127 } // namespace 128