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