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 { 46 if (_M_table) 47 return _M_table[static_cast<unsigned char>(__c)] & __m; 48 else 49 #ifdef _CTYPE_S 50 return __istype(__c, __m); 51 #else 52 return __libc_ctype_ [__c + 1] & __m; 53 #endif 54 } 55 56 const char* 57 ctype<char>:: 58 is(const char* __low, const char* __high, mask* __vec) const 59 { 60 if (_M_table) 61 while (__low < __high) 62 *__vec++ = _M_table[static_cast<unsigned char>(*__low++)]; 63 else 64 for (;__low < __high; ++__vec, ++__low) 65 { 66 #ifdef _CTYPE_S 67 *__vec = __maskrune (*__low, upper | lower | alpha | digit | xdigit 68 | space | print | graph | cntrl | punct | alnum); 69 #else 70 mask __m = 0; 71 if (this->is(upper, *__low)) __m |= upper; 72 if (this->is(lower, *__low)) __m |= lower; 73 if (this->is(alpha, *__low)) __m |= alpha; 74 if (this->is(digit, *__low)) __m |= digit; 75 if (this->is(xdigit, *__low)) __m |= xdigit; 76 if (this->is(space, *__low)) __m |= space; 77 if (this->is(print, *__low)) __m |= print; 78 if (this->is(graph, *__low)) __m |= graph; 79 if (this->is(cntrl, *__low)) __m |= cntrl; 80 if (this->is(punct, *__low)) __m |= punct; 81 // Do not include explicit line for alnum mask since it is a 82 // pure composite of masks on DragonFly. 83 *__vec = __m; 84 #endif 85 } 86 return __high; 87 } 88 89 const char* 90 ctype<char>:: 91 scan_is(mask __m, const char* __low, const char* __high) const 92 { 93 if (_M_table) 94 while (__low < __high 95 && !(_M_table[static_cast<unsigned char>(*__low)] & __m)) 96 ++__low; 97 else 98 while (__low < __high && !this->is(__m, *__low)) 99 ++__low; 100 return __low; 101 } 102 103 const char* 104 ctype<char>:: 105 scan_not(mask __m, const char* __low, const char* __high) const 106 { 107 if (_M_table) 108 while (__low < __high 109 && (_M_table[static_cast<unsigned char>(*__low)] & __m) != 0) 110 ++__low; 111 else 112 while (__low < __high && this->is(__m, *__low) != 0) 113 ++__low; 114 return __low; 115 } 116 117 #ifdef _GLIBCXX_USE_WCHAR_T 118 inline bool 119 ctype<wchar_t>:: 120 do_is(mask __m, wchar_t __c) const 121 { 122 #ifdef _CTYPE_S 123 return __istype (__c, __m); 124 #else 125 return __libc_ctype_ [__c + 1] & __m; 126 #endif 127 } 128 129 inline const wchar_t* 130 ctype<wchar_t>:: 131 do_is(const wchar_t* __lo, const wchar_t* __hi, mask* __vec) const 132 { 133 for (; __lo < __hi; ++__vec, ++__lo) 134 #ifdef _CTYPE_S 135 *__vec = __maskrune (*__lo, upper | lower | alpha | digit | xdigit 136 | space | print | graph | cntrl | punct | alnum); 137 #else 138 { 139 mask __m = 0; 140 if (isupper (*__lo)) __m |= _CTYPEMASK_U; 141 if (islower (*__lo)) __m |= _CTYPEMASK_L; 142 if (isdigit (*__lo)) __m |= _CTYPEMASK_D; 143 if (isspace (*__lo)) __m |= _CTYPEMASK_S; 144 if (ispunct (*__lo)) __m |= _CTYPEMASK_P; 145 if (isblank (*__lo)) __m |= _CTYPEMASK_B; 146 if (iscntrl (*__lo)) __m |= _CTYPEMASK_C; 147 if (isalpha (*__lo)) __m |= _CTYPEMASK_A; 148 if (isgraph (*__lo)) __m |= _CTYPEMASK_G; 149 if (isprint (*__lo)) __m |= _CTYPEMASK_R; 150 if (isxdigit(*__lo)) __m |= _CTYPEMASK_X; 151 /* alnum already covered = alpha | digit */ 152 153 *__vec = __m; 154 } 155 #endif 156 return __hi; 157 } 158 159 inline const wchar_t* 160 ctype<wchar_t>:: 161 do_scan_is(mask __m, const wchar_t* __lo, const wchar_t* __hi) const 162 { 163 #ifdef _CTYPE_S 164 while (__lo < __hi && ! __istype (*__lo, __m)) 165 #else 166 while (__lo < __hi && !(__libc_ctype_ [*__lo + 1] & __m)) 167 #endif 168 ++__lo; 169 return __lo; 170 } 171 172 inline const wchar_t* 173 ctype<wchar_t>:: 174 do_scan_not(mask __m, const char_type* __lo, const char_type* __hi) const 175 { 176 #ifdef _CTYPE_S 177 while (__lo < __hi && __istype (*__lo, __m)) 178 #else 179 while (__lo < __hi && (__libc_ctype_ [*__lo + 1] & __m)) 180 #endif 181 ++__lo; 182 return __lo; 183 } 184 #endif 185 186 _GLIBCXX_END_NAMESPACE_VERSION 187 } // namespace 188