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