1// 2002-05-10 ghazi 2 3// Copyright (C) 2002-2015 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20 21// { dg-do run } 22 23#include <locale> 24#include <testsuite_hooks.h> 25 26typedef char char_type; 27typedef std::char_traits<char_type> traits_type; 28class gnu_ctype: public std::ctype<char_type> { }; 29 30// These two macros take a ctype mask, a string and a pointer within 31// the string that the scan function should return, usually either the 32// first or last character if the string contains identical values as 33// below. 34#define VERIFY_SCAN_IS(MASK, STRING, EXPECTED) \ 35 VERIFY(gctype.scan_is((MASK), (STRING), \ 36 (STRING) + traits_type::length(STRING)) == (EXPECTED)) 37#define VERIFY_SCAN_NOT(MASK, STRING, EXPECTED) \ 38 VERIFY(gctype.scan_not((MASK), (STRING), \ 39 (STRING) + traits_type::length(STRING)) == (EXPECTED)) 40 41// Sanity check scan_is() and scan_not(). 42void test01() 43{ 44 bool test __attribute__((unused)) = true; 45 46 const char_type *const ca = "aaaaa"; 47 const char_type *const cz = "zzzzz"; 48 const char_type *const cA = "AAAAA"; 49 const char_type *const cZ = "ZZZZZ"; 50 const char_type *const c0 = "00000"; 51 const char_type *const c9 = "99999"; 52 const char_type *const cs = " "; 53 const char_type *const xf = "fffff"; 54 const char_type *const xF = "FFFFF"; 55 const char_type *const p1 = "!!!!!"; 56 const char_type *const p2 = "/////"; 57 58 gnu_ctype gctype; 59 60 // 'a' 61 VERIFY_SCAN_IS (std::ctype_base::alnum, ca, ca); 62 VERIFY_SCAN_IS (std::ctype_base::alpha, ca, ca); 63 VERIFY_SCAN_IS (std::ctype_base::cntrl, ca, ca+5); 64 VERIFY_SCAN_IS (std::ctype_base::digit, ca, ca+5); 65 VERIFY_SCAN_IS (std::ctype_base::graph, ca, ca); 66 VERIFY_SCAN_IS (std::ctype_base::lower, ca, ca); 67 VERIFY_SCAN_IS (std::ctype_base::print, ca, ca); 68 VERIFY_SCAN_IS (std::ctype_base::punct, ca, ca+5); 69 VERIFY_SCAN_IS (std::ctype_base::space, ca, ca+5); 70 VERIFY_SCAN_IS (std::ctype_base::upper, ca, ca+5); 71 VERIFY_SCAN_IS (std::ctype_base::xdigit, ca, ca); 72 73 VERIFY_SCAN_NOT (std::ctype_base::alnum, ca, ca+5); 74 VERIFY_SCAN_NOT (std::ctype_base::alpha, ca, ca+5); 75 VERIFY_SCAN_NOT (std::ctype_base::cntrl, ca, ca); 76 VERIFY_SCAN_NOT (std::ctype_base::digit, ca, ca); 77 VERIFY_SCAN_NOT (std::ctype_base::graph, ca, ca+5); 78 VERIFY_SCAN_NOT (std::ctype_base::lower, ca, ca+5); 79 VERIFY_SCAN_NOT (std::ctype_base::print, ca, ca+5); 80 VERIFY_SCAN_NOT (std::ctype_base::punct, ca, ca); 81 VERIFY_SCAN_NOT (std::ctype_base::space, ca, ca); 82 VERIFY_SCAN_NOT (std::ctype_base::upper, ca, ca); 83 VERIFY_SCAN_NOT (std::ctype_base::xdigit, ca, ca+5); 84 85 // 'z' 86 VERIFY_SCAN_IS (std::ctype_base::alnum, cz, cz); 87 VERIFY_SCAN_IS (std::ctype_base::alpha, cz, cz); 88 VERIFY_SCAN_IS (std::ctype_base::cntrl, cz, cz+5); 89 VERIFY_SCAN_IS (std::ctype_base::digit, cz, cz+5); 90 VERIFY_SCAN_IS (std::ctype_base::graph, cz, cz); 91 VERIFY_SCAN_IS (std::ctype_base::lower, cz, cz); 92 VERIFY_SCAN_IS (std::ctype_base::print, cz, cz); 93 VERIFY_SCAN_IS (std::ctype_base::punct, cz, cz+5); 94 VERIFY_SCAN_IS (std::ctype_base::space, cz, cz+5); 95 VERIFY_SCAN_IS (std::ctype_base::upper, cz, cz+5); 96 VERIFY_SCAN_IS (std::ctype_base::xdigit, cz, cz+5); 97 98 VERIFY_SCAN_NOT (std::ctype_base::alnum, cz, cz+5); 99 VERIFY_SCAN_NOT (std::ctype_base::alpha, cz, cz+5); 100 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cz, cz); 101 VERIFY_SCAN_NOT (std::ctype_base::digit, cz, cz); 102 VERIFY_SCAN_NOT (std::ctype_base::graph, cz, cz+5); 103 VERIFY_SCAN_NOT (std::ctype_base::lower, cz, cz+5); 104 VERIFY_SCAN_NOT (std::ctype_base::print, cz, cz+5); 105 VERIFY_SCAN_NOT (std::ctype_base::punct, cz, cz); 106 VERIFY_SCAN_NOT (std::ctype_base::space, cz, cz); 107 VERIFY_SCAN_NOT (std::ctype_base::upper, cz, cz); 108 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cz, cz); 109 110 // 'A' 111 VERIFY_SCAN_IS (std::ctype_base::alnum, cA, cA); 112 VERIFY_SCAN_IS (std::ctype_base::alpha, cA, cA); 113 VERIFY_SCAN_IS (std::ctype_base::cntrl, cA, cA+5); 114 VERIFY_SCAN_IS (std::ctype_base::digit, cA, cA+5); 115 VERIFY_SCAN_IS (std::ctype_base::graph, cA, cA); 116 VERIFY_SCAN_IS (std::ctype_base::lower, cA, cA+5); 117 VERIFY_SCAN_IS (std::ctype_base::print, cA, cA); 118 VERIFY_SCAN_IS (std::ctype_base::punct, cA, cA+5); 119 VERIFY_SCAN_IS (std::ctype_base::space, cA, cA+5); 120 VERIFY_SCAN_IS (std::ctype_base::upper, cA, cA); 121 VERIFY_SCAN_IS (std::ctype_base::xdigit, cA, cA); 122 123 VERIFY_SCAN_NOT (std::ctype_base::alnum, cA, cA+5); 124 VERIFY_SCAN_NOT (std::ctype_base::alpha, cA, cA+5); 125 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cA, cA); 126 VERIFY_SCAN_NOT (std::ctype_base::digit, cA, cA); 127 VERIFY_SCAN_NOT (std::ctype_base::graph, cA, cA+5); 128 VERIFY_SCAN_NOT (std::ctype_base::lower, cA, cA); 129 VERIFY_SCAN_NOT (std::ctype_base::print, cA, cA+5); 130 VERIFY_SCAN_NOT (std::ctype_base::punct, cA, cA); 131 VERIFY_SCAN_NOT (std::ctype_base::space, cA, cA); 132 VERIFY_SCAN_NOT (std::ctype_base::upper, cA, cA+5); 133 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cA, cA+5); 134 135 // 'Z' 136 VERIFY_SCAN_IS (std::ctype_base::alnum, cZ, cZ); 137 VERIFY_SCAN_IS (std::ctype_base::alpha, cZ, cZ); 138 VERIFY_SCAN_IS (std::ctype_base::cntrl, cZ, cZ+5); 139 VERIFY_SCAN_IS (std::ctype_base::digit, cZ, cZ+5); 140 VERIFY_SCAN_IS (std::ctype_base::graph, cZ, cZ); 141 VERIFY_SCAN_IS (std::ctype_base::lower, cZ, cZ+5); 142 VERIFY_SCAN_IS (std::ctype_base::print, cZ, cZ); 143 VERIFY_SCAN_IS (std::ctype_base::punct, cZ, cZ+5); 144 VERIFY_SCAN_IS (std::ctype_base::space, cZ, cZ+5); 145 VERIFY_SCAN_IS (std::ctype_base::upper, cZ, cZ); 146 VERIFY_SCAN_IS (std::ctype_base::xdigit, cZ, cZ+5); 147 148 VERIFY_SCAN_NOT (std::ctype_base::alnum, cZ, cZ+5); 149 VERIFY_SCAN_NOT (std::ctype_base::alpha, cZ, cZ+5); 150 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cZ, cZ); 151 VERIFY_SCAN_NOT (std::ctype_base::digit, cZ, cZ); 152 VERIFY_SCAN_NOT (std::ctype_base::graph, cZ, cZ+5); 153 VERIFY_SCAN_NOT (std::ctype_base::lower, cZ, cZ); 154 VERIFY_SCAN_NOT (std::ctype_base::print, cZ, cZ+5); 155 VERIFY_SCAN_NOT (std::ctype_base::punct, cZ, cZ); 156 VERIFY_SCAN_NOT (std::ctype_base::space, cZ, cZ); 157 VERIFY_SCAN_NOT (std::ctype_base::upper, cZ, cZ+5); 158 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cZ, cZ); 159 160 // '0' 161 VERIFY_SCAN_IS (std::ctype_base::alnum, c0, c0); 162 VERIFY_SCAN_IS (std::ctype_base::alpha, c0, c0+5); 163 VERIFY_SCAN_IS (std::ctype_base::cntrl, c0, c0+5); 164 VERIFY_SCAN_IS (std::ctype_base::digit, c0, c0); 165 VERIFY_SCAN_IS (std::ctype_base::graph, c0, c0); 166 VERIFY_SCAN_IS (std::ctype_base::lower, c0, c0+5); 167 VERIFY_SCAN_IS (std::ctype_base::print, c0, c0); 168 VERIFY_SCAN_IS (std::ctype_base::punct, c0, c0+5); 169 VERIFY_SCAN_IS (std::ctype_base::space, c0, c0+5); 170 VERIFY_SCAN_IS (std::ctype_base::upper, c0, c0+5); 171 VERIFY_SCAN_IS (std::ctype_base::xdigit, c0, c0); 172 173 VERIFY_SCAN_NOT (std::ctype_base::alnum, c0, c0+5); 174 VERIFY_SCAN_NOT (std::ctype_base::alpha, c0, c0); 175 VERIFY_SCAN_NOT (std::ctype_base::cntrl, c0, c0); 176 VERIFY_SCAN_NOT (std::ctype_base::digit, c0, c0+5); 177 VERIFY_SCAN_NOT (std::ctype_base::graph, c0, c0+5); 178 VERIFY_SCAN_NOT (std::ctype_base::lower, c0, c0); 179 VERIFY_SCAN_NOT (std::ctype_base::print, c0, c0+5); 180 VERIFY_SCAN_NOT (std::ctype_base::punct, c0, c0); 181 VERIFY_SCAN_NOT (std::ctype_base::space, c0, c0); 182 VERIFY_SCAN_NOT (std::ctype_base::upper, c0, c0); 183 VERIFY_SCAN_NOT (std::ctype_base::xdigit, c0, c0+5); 184 185 // '9' 186 VERIFY_SCAN_IS (std::ctype_base::alnum, c9, c9); 187 VERIFY_SCAN_IS (std::ctype_base::alpha, c9, c9+5); 188 VERIFY_SCAN_IS (std::ctype_base::cntrl, c9, c9+5); 189 VERIFY_SCAN_IS (std::ctype_base::digit, c9, c9); 190 VERIFY_SCAN_IS (std::ctype_base::graph, c9, c9); 191 VERIFY_SCAN_IS (std::ctype_base::lower, c9, c9+5); 192 VERIFY_SCAN_IS (std::ctype_base::print, c9, c9); 193 VERIFY_SCAN_IS (std::ctype_base::punct, c9, c9+5); 194 VERIFY_SCAN_IS (std::ctype_base::space, c9, c9+5); 195 VERIFY_SCAN_IS (std::ctype_base::upper, c9, c9+5); 196 VERIFY_SCAN_IS (std::ctype_base::xdigit, c9, c9); 197 198 VERIFY_SCAN_NOT (std::ctype_base::alnum, c9, c9+5); 199 VERIFY_SCAN_NOT (std::ctype_base::alpha, c9, c9); 200 VERIFY_SCAN_NOT (std::ctype_base::cntrl, c9, c9); 201 VERIFY_SCAN_NOT (std::ctype_base::digit, c9, c9+5); 202 VERIFY_SCAN_NOT (std::ctype_base::graph, c9, c9+5); 203 VERIFY_SCAN_NOT (std::ctype_base::lower, c9, c9); 204 VERIFY_SCAN_NOT (std::ctype_base::print, c9, c9+5); 205 VERIFY_SCAN_NOT (std::ctype_base::punct, c9, c9); 206 VERIFY_SCAN_NOT (std::ctype_base::space, c9, c9); 207 VERIFY_SCAN_NOT (std::ctype_base::upper, c9, c9); 208 VERIFY_SCAN_NOT (std::ctype_base::xdigit, c9, c9+5); 209 210 // ' ' 211 VERIFY_SCAN_IS (std::ctype_base::alnum, cs, cs+5); 212 VERIFY_SCAN_IS (std::ctype_base::alpha, cs, cs+5); 213 VERIFY_SCAN_IS (std::ctype_base::cntrl, cs, cs+5); 214 VERIFY_SCAN_IS (std::ctype_base::digit, cs, cs+5); 215 VERIFY_SCAN_IS (std::ctype_base::graph, cs, cs+5); 216 VERIFY_SCAN_IS (std::ctype_base::lower, cs, cs+5); 217 VERIFY_SCAN_IS (std::ctype_base::print, cs, cs); 218 VERIFY_SCAN_IS (std::ctype_base::punct, cs, cs+5); 219 VERIFY_SCAN_IS (std::ctype_base::space, cs, cs); 220 VERIFY_SCAN_IS (std::ctype_base::upper, cs, cs+5); 221 VERIFY_SCAN_IS (std::ctype_base::xdigit, cs, cs+5); 222 223 VERIFY_SCAN_NOT (std::ctype_base::alnum, cs, cs); 224 VERIFY_SCAN_NOT (std::ctype_base::alpha, cs, cs); 225 VERIFY_SCAN_NOT (std::ctype_base::cntrl, cs, cs); 226 VERIFY_SCAN_NOT (std::ctype_base::digit, cs, cs); 227 VERIFY_SCAN_NOT (std::ctype_base::graph, cs, cs); 228 VERIFY_SCAN_NOT (std::ctype_base::lower, cs, cs); 229 VERIFY_SCAN_NOT (std::ctype_base::print, cs, cs+5); 230 VERIFY_SCAN_NOT (std::ctype_base::punct, cs, cs); 231 VERIFY_SCAN_NOT (std::ctype_base::space, cs, cs+5); 232 VERIFY_SCAN_NOT (std::ctype_base::upper, cs, cs); 233 VERIFY_SCAN_NOT (std::ctype_base::xdigit, cs, cs); 234 235 // 'f' 236 VERIFY_SCAN_IS (std::ctype_base::alnum, xf, xf); 237 VERIFY_SCAN_IS (std::ctype_base::alpha, xf, xf); 238 VERIFY_SCAN_IS (std::ctype_base::cntrl, xf, xf+5); 239 VERIFY_SCAN_IS (std::ctype_base::digit, xf, xf+5); 240 VERIFY_SCAN_IS (std::ctype_base::graph, xf, xf); 241 VERIFY_SCAN_IS (std::ctype_base::lower, xf, xf); 242 VERIFY_SCAN_IS (std::ctype_base::print, xf, xf); 243 VERIFY_SCAN_IS (std::ctype_base::punct, xf, xf+5); 244 VERIFY_SCAN_IS (std::ctype_base::space, xf, xf+5); 245 VERIFY_SCAN_IS (std::ctype_base::upper, xf, xf+5); 246 VERIFY_SCAN_IS (std::ctype_base::xdigit, xf, xf); 247 248 VERIFY_SCAN_NOT (std::ctype_base::alnum, xf, xf+5); 249 VERIFY_SCAN_NOT (std::ctype_base::alpha, xf, xf+5); 250 VERIFY_SCAN_NOT (std::ctype_base::cntrl, xf, xf); 251 VERIFY_SCAN_NOT (std::ctype_base::digit, xf, xf); 252 VERIFY_SCAN_NOT (std::ctype_base::graph, xf, xf+5); 253 VERIFY_SCAN_NOT (std::ctype_base::lower, xf, xf+5); 254 VERIFY_SCAN_NOT (std::ctype_base::print, xf, xf+5); 255 VERIFY_SCAN_NOT (std::ctype_base::punct, xf, xf); 256 VERIFY_SCAN_NOT (std::ctype_base::space, xf, xf); 257 VERIFY_SCAN_NOT (std::ctype_base::upper, xf, xf); 258 VERIFY_SCAN_NOT (std::ctype_base::xdigit, xf, xf+5); 259 260 // 'F' 261 VERIFY_SCAN_IS (std::ctype_base::alnum, xF, xF); 262 VERIFY_SCAN_IS (std::ctype_base::alpha, xF, xF); 263 VERIFY_SCAN_IS (std::ctype_base::cntrl, xF, xF+5); 264 VERIFY_SCAN_IS (std::ctype_base::digit, xF, xF+5); 265 VERIFY_SCAN_IS (std::ctype_base::graph, xF, xF); 266 VERIFY_SCAN_IS (std::ctype_base::lower, xF, xF+5); 267 VERIFY_SCAN_IS (std::ctype_base::print, xF, xF); 268 VERIFY_SCAN_IS (std::ctype_base::punct, xF, xF+5); 269 VERIFY_SCAN_IS (std::ctype_base::space, xF, xF+5); 270 VERIFY_SCAN_IS (std::ctype_base::upper, xF, xF); 271 VERIFY_SCAN_IS (std::ctype_base::xdigit, xF, xF); 272 273 VERIFY_SCAN_NOT (std::ctype_base::alnum, xF, xF+5); 274 VERIFY_SCAN_NOT (std::ctype_base::alpha, xF, xF+5); 275 VERIFY_SCAN_NOT (std::ctype_base::cntrl, xF, xF); 276 VERIFY_SCAN_NOT (std::ctype_base::digit, xF, xF); 277 VERIFY_SCAN_NOT (std::ctype_base::graph, xF, xF+5); 278 VERIFY_SCAN_NOT (std::ctype_base::lower, xF, xF); 279 VERIFY_SCAN_NOT (std::ctype_base::print, xF, xF+5); 280 VERIFY_SCAN_NOT (std::ctype_base::punct, xF, xF); 281 VERIFY_SCAN_NOT (std::ctype_base::space, xF, xF); 282 VERIFY_SCAN_NOT (std::ctype_base::upper, xF, xF+5); 283 VERIFY_SCAN_NOT (std::ctype_base::xdigit, xF, xF+5); 284 285 // '!' 286 VERIFY_SCAN_IS (std::ctype_base::alnum, p1, p1+5); 287 VERIFY_SCAN_IS (std::ctype_base::alpha, p1, p1+5); 288 VERIFY_SCAN_IS (std::ctype_base::cntrl, p1, p1+5); 289 VERIFY_SCAN_IS (std::ctype_base::digit, p1, p1+5); 290 VERIFY_SCAN_IS (std::ctype_base::graph, p1, p1); 291 VERIFY_SCAN_IS (std::ctype_base::lower, p1, p1+5); 292 VERIFY_SCAN_IS (std::ctype_base::print, p1, p1); 293 VERIFY_SCAN_IS (std::ctype_base::punct, p1, p1); 294 VERIFY_SCAN_IS (std::ctype_base::space, p1, p1+5); 295 VERIFY_SCAN_IS (std::ctype_base::upper, p1, p1+5); 296 VERIFY_SCAN_IS (std::ctype_base::xdigit, p1, p1+5); 297 298 VERIFY_SCAN_NOT (std::ctype_base::alnum, p1, p1); 299 VERIFY_SCAN_NOT (std::ctype_base::alpha, p1, p1); 300 VERIFY_SCAN_NOT (std::ctype_base::cntrl, p1, p1); 301 VERIFY_SCAN_NOT (std::ctype_base::digit, p1, p1); 302 VERIFY_SCAN_NOT (std::ctype_base::lower, p1, p1); 303 VERIFY_SCAN_NOT (std::ctype_base::print, p1, p1+5); 304 VERIFY_SCAN_NOT (std::ctype_base::punct, p1, p1+5); 305 VERIFY_SCAN_NOT (std::ctype_base::space, p1, p1); 306 VERIFY_SCAN_NOT (std::ctype_base::upper, p1, p1); 307 VERIFY_SCAN_NOT (std::ctype_base::xdigit, p1, p1); 308 309 // '/' 310 VERIFY_SCAN_IS (std::ctype_base::alnum, p2, p2+5); 311 VERIFY_SCAN_IS (std::ctype_base::alpha, p2, p2+5); 312 VERIFY_SCAN_IS (std::ctype_base::cntrl, p2, p2+5); 313 VERIFY_SCAN_IS (std::ctype_base::digit, p2, p2+5); 314 VERIFY_SCAN_IS (std::ctype_base::graph, p2, p2); 315 VERIFY_SCAN_IS (std::ctype_base::lower, p2, p2+5); 316 VERIFY_SCAN_IS (std::ctype_base::print, p2, p2); 317 VERIFY_SCAN_IS (std::ctype_base::punct, p2, p2); 318 VERIFY_SCAN_IS (std::ctype_base::space, p2, p2+5); 319 VERIFY_SCAN_IS (std::ctype_base::upper, p2, p2+5); 320 VERIFY_SCAN_IS (std::ctype_base::xdigit, p2, p2+5); 321 322 VERIFY_SCAN_NOT (std::ctype_base::alnum, p2, p2); 323 VERIFY_SCAN_NOT (std::ctype_base::alpha, p2, p2); 324 VERIFY_SCAN_NOT (std::ctype_base::cntrl, p2, p2); 325 VERIFY_SCAN_NOT (std::ctype_base::digit, p2, p2); 326 VERIFY_SCAN_NOT (std::ctype_base::graph, p2, p2+5); 327 VERIFY_SCAN_NOT (std::ctype_base::lower, p2, p2); 328 VERIFY_SCAN_NOT (std::ctype_base::print, p2, p2+5); 329 VERIFY_SCAN_NOT (std::ctype_base::punct, p2, p2+5); 330 VERIFY_SCAN_NOT (std::ctype_base::space, p2, p2); 331 VERIFY_SCAN_NOT (std::ctype_base::upper, p2, p2); 332 VERIFY_SCAN_NOT (std::ctype_base::xdigit, p2, p2); 333} 334 335int main() 336{ 337 test01(); 338 return 0; 339} 340