1/* Test of character handling in C locale. 2 Copyright (C) 2005, 2007-2010 Free Software Foundation, Inc. 3 4 This program is free software: you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 3 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17/* Written by Bruno Haible <bruno@clisp.org>, 2005. */ 18 19#include <config.h> 20 21#include "c-ctype.h" 22 23#include <locale.h> 24 25#include "macros.h" 26 27static void 28test_all (void) 29{ 30 int c; 31 32 for (c = -0x80; c < 0x100; c++) 33 { 34 ASSERT (c_isascii (c) == (c >= 0 && c < 0x80)); 35 36 switch (c) 37 { 38 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 39 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 40 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 41 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 42 case 'Y': case 'Z': 43 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 44 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 45 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 46 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 47 case 'y': case 'z': 48 case '0': case '1': case '2': case '3': case '4': case '5': 49 case '6': case '7': case '8': case '9': 50 ASSERT (c_isalnum (c) == 1); 51 break; 52 default: 53 ASSERT (c_isalnum (c) == 0); 54 break; 55 } 56 57 switch (c) 58 { 59 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 60 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 61 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 62 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 63 case 'Y': case 'Z': 64 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 65 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 66 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 67 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 68 case 'y': case 'z': 69 ASSERT (c_isalpha (c) == 1); 70 break; 71 default: 72 ASSERT (c_isalpha (c) == 0); 73 break; 74 } 75 76 switch (c) 77 { 78 case '\t': case ' ': 79 ASSERT (c_isblank (c) == 1); 80 break; 81 default: 82 ASSERT (c_isblank (c) == 0); 83 break; 84 } 85 86 ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f)); 87 88 switch (c) 89 { 90 case '0': case '1': case '2': case '3': case '4': case '5': 91 case '6': case '7': case '8': case '9': 92 ASSERT (c_isdigit (c) == 1); 93 break; 94 default: 95 ASSERT (c_isdigit (c) == 0); 96 break; 97 } 98 99 switch (c) 100 { 101 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 102 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 103 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 104 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 105 case 'y': case 'z': 106 ASSERT (c_islower (c) == 1); 107 break; 108 default: 109 ASSERT (c_islower (c) == 0); 110 break; 111 } 112 113 ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' ')); 114 115 ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f)); 116 117 ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c))); 118 119 switch (c) 120 { 121 case ' ': case '\t': case '\n': case '\v': case '\f': case '\r': 122 ASSERT (c_isspace (c) == 1); 123 break; 124 default: 125 ASSERT (c_isspace (c) == 0); 126 break; 127 } 128 129 switch (c) 130 { 131 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 132 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 133 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 134 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 135 case 'Y': case 'Z': 136 ASSERT (c_isupper (c) == 1); 137 break; 138 default: 139 ASSERT (c_isupper (c) == 0); 140 break; 141 } 142 143 switch (c) 144 { 145 case '0': case '1': case '2': case '3': case '4': case '5': 146 case '6': case '7': case '8': case '9': 147 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 148 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 149 ASSERT (c_isxdigit (c) == 1); 150 break; 151 default: 152 ASSERT (c_isxdigit (c) == 0); 153 break; 154 } 155 156 switch (c) 157 { 158 case 'A': 159 ASSERT (c_tolower (c) == 'a'); 160 ASSERT (c_toupper (c) == c); 161 break; 162 case 'B': 163 ASSERT (c_tolower (c) == 'b'); 164 ASSERT (c_toupper (c) == c); 165 break; 166 case 'C': 167 ASSERT (c_tolower (c) == 'c'); 168 ASSERT (c_toupper (c) == c); 169 break; 170 case 'D': 171 ASSERT (c_tolower (c) == 'd'); 172 ASSERT (c_toupper (c) == c); 173 break; 174 case 'E': 175 ASSERT (c_tolower (c) == 'e'); 176 ASSERT (c_toupper (c) == c); 177 break; 178 case 'F': 179 ASSERT (c_tolower (c) == 'f'); 180 ASSERT (c_toupper (c) == c); 181 break; 182 case 'G': 183 ASSERT (c_tolower (c) == 'g'); 184 ASSERT (c_toupper (c) == c); 185 break; 186 case 'H': 187 ASSERT (c_tolower (c) == 'h'); 188 ASSERT (c_toupper (c) == c); 189 break; 190 case 'I': 191 ASSERT (c_tolower (c) == 'i'); 192 ASSERT (c_toupper (c) == c); 193 break; 194 case 'J': 195 ASSERT (c_tolower (c) == 'j'); 196 ASSERT (c_toupper (c) == c); 197 break; 198 case 'K': 199 ASSERT (c_tolower (c) == 'k'); 200 ASSERT (c_toupper (c) == c); 201 break; 202 case 'L': 203 ASSERT (c_tolower (c) == 'l'); 204 ASSERT (c_toupper (c) == c); 205 break; 206 case 'M': 207 ASSERT (c_tolower (c) == 'm'); 208 ASSERT (c_toupper (c) == c); 209 break; 210 case 'N': 211 ASSERT (c_tolower (c) == 'n'); 212 ASSERT (c_toupper (c) == c); 213 break; 214 case 'O': 215 ASSERT (c_tolower (c) == 'o'); 216 ASSERT (c_toupper (c) == c); 217 break; 218 case 'P': 219 ASSERT (c_tolower (c) == 'p'); 220 ASSERT (c_toupper (c) == c); 221 break; 222 case 'Q': 223 ASSERT (c_tolower (c) == 'q'); 224 ASSERT (c_toupper (c) == c); 225 break; 226 case 'R': 227 ASSERT (c_tolower (c) == 'r'); 228 ASSERT (c_toupper (c) == c); 229 break; 230 case 'S': 231 ASSERT (c_tolower (c) == 's'); 232 ASSERT (c_toupper (c) == c); 233 break; 234 case 'T': 235 ASSERT (c_tolower (c) == 't'); 236 ASSERT (c_toupper (c) == c); 237 break; 238 case 'U': 239 ASSERT (c_tolower (c) == 'u'); 240 ASSERT (c_toupper (c) == c); 241 break; 242 case 'V': 243 ASSERT (c_tolower (c) == 'v'); 244 ASSERT (c_toupper (c) == c); 245 break; 246 case 'W': 247 ASSERT (c_tolower (c) == 'w'); 248 ASSERT (c_toupper (c) == c); 249 break; 250 case 'X': 251 ASSERT (c_tolower (c) == 'x'); 252 ASSERT (c_toupper (c) == c); 253 break; 254 case 'Y': 255 ASSERT (c_tolower (c) == 'y'); 256 ASSERT (c_toupper (c) == c); 257 break; 258 case 'Z': 259 ASSERT (c_tolower (c) == 'z'); 260 ASSERT (c_toupper (c) == c); 261 break; 262 case 'a': 263 ASSERT (c_tolower (c) == c); 264 ASSERT (c_toupper (c) == 'A'); 265 break; 266 case 'b': 267 ASSERT (c_tolower (c) == c); 268 ASSERT (c_toupper (c) == 'B'); 269 break; 270 case 'c': 271 ASSERT (c_tolower (c) == c); 272 ASSERT (c_toupper (c) == 'C'); 273 break; 274 case 'd': 275 ASSERT (c_tolower (c) == c); 276 ASSERT (c_toupper (c) == 'D'); 277 break; 278 case 'e': 279 ASSERT (c_tolower (c) == c); 280 ASSERT (c_toupper (c) == 'E'); 281 break; 282 case 'f': 283 ASSERT (c_tolower (c) == c); 284 ASSERT (c_toupper (c) == 'F'); 285 break; 286 case 'g': 287 ASSERT (c_tolower (c) == c); 288 ASSERT (c_toupper (c) == 'G'); 289 break; 290 case 'h': 291 ASSERT (c_tolower (c) == c); 292 ASSERT (c_toupper (c) == 'H'); 293 break; 294 case 'i': 295 ASSERT (c_tolower (c) == c); 296 ASSERT (c_toupper (c) == 'I'); 297 break; 298 case 'j': 299 ASSERT (c_tolower (c) == c); 300 ASSERT (c_toupper (c) == 'J'); 301 break; 302 case 'k': 303 ASSERT (c_tolower (c) == c); 304 ASSERT (c_toupper (c) == 'K'); 305 break; 306 case 'l': 307 ASSERT (c_tolower (c) == c); 308 ASSERT (c_toupper (c) == 'L'); 309 break; 310 case 'm': 311 ASSERT (c_tolower (c) == c); 312 ASSERT (c_toupper (c) == 'M'); 313 break; 314 case 'n': 315 ASSERT (c_tolower (c) == c); 316 ASSERT (c_toupper (c) == 'N'); 317 break; 318 case 'o': 319 ASSERT (c_tolower (c) == c); 320 ASSERT (c_toupper (c) == 'O'); 321 break; 322 case 'p': 323 ASSERT (c_tolower (c) == c); 324 ASSERT (c_toupper (c) == 'P'); 325 break; 326 case 'q': 327 ASSERT (c_tolower (c) == c); 328 ASSERT (c_toupper (c) == 'Q'); 329 break; 330 case 'r': 331 ASSERT (c_tolower (c) == c); 332 ASSERT (c_toupper (c) == 'R'); 333 break; 334 case 's': 335 ASSERT (c_tolower (c) == c); 336 ASSERT (c_toupper (c) == 'S'); 337 break; 338 case 't': 339 ASSERT (c_tolower (c) == c); 340 ASSERT (c_toupper (c) == 'T'); 341 break; 342 case 'u': 343 ASSERT (c_tolower (c) == c); 344 ASSERT (c_toupper (c) == 'U'); 345 break; 346 case 'v': 347 ASSERT (c_tolower (c) == c); 348 ASSERT (c_toupper (c) == 'V'); 349 break; 350 case 'w': 351 ASSERT (c_tolower (c) == c); 352 ASSERT (c_toupper (c) == 'W'); 353 break; 354 case 'x': 355 ASSERT (c_tolower (c) == c); 356 ASSERT (c_toupper (c) == 'X'); 357 break; 358 case 'y': 359 ASSERT (c_tolower (c) == c); 360 ASSERT (c_toupper (c) == 'Y'); 361 break; 362 case 'z': 363 ASSERT (c_tolower (c) == c); 364 ASSERT (c_toupper (c) == 'Z'); 365 break; 366 default: 367 ASSERT (c_tolower (c) == c); 368 ASSERT (c_toupper (c) == c); 369 break; 370 } 371 } 372} 373 374int 375main () 376{ 377 test_all (); 378 379 setlocale (LC_ALL, "de_DE"); 380 test_all (); 381 382 setlocale (LC_ALL, "ja_JP.EUC-JP"); 383 test_all (); 384 385 return 0; 386} 387