1/* Test of character handling in C locale. 2 Copyright (C) 2005, 2007 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#include <stdio.h> 25#include <stdlib.h> 26 27#define ASSERT(expr) \ 28 do \ 29 { \ 30 if (!(expr)) \ 31 { \ 32 fprintf (stderr, "%s:%d: assertion failed\n", __FILE__, __LINE__); \ 33 abort (); \ 34 } \ 35 } \ 36 while (0) 37 38static void 39test_all (void) 40{ 41 int c; 42 43 for (c = -0x80; c < 0x100; c++) 44 { 45 ASSERT (c_isascii (c) == (c >= 0 && c < 0x80)); 46 47 switch (c) 48 { 49 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 50 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 51 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 52 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 53 case 'Y': case 'Z': 54 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 55 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 56 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 57 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 58 case 'y': case 'z': 59 case '0': case '1': case '2': case '3': case '4': case '5': 60 case '6': case '7': case '8': case '9': 61 ASSERT (c_isalnum (c) == 1); 62 break; 63 default: 64 ASSERT (c_isalnum (c) == 0); 65 break; 66 } 67 68 switch (c) 69 { 70 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 71 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 72 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 73 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 74 case 'Y': case 'Z': 75 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 76 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 77 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 78 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 79 case 'y': case 'z': 80 ASSERT (c_isalpha (c) == 1); 81 break; 82 default: 83 ASSERT (c_isalpha (c) == 0); 84 break; 85 } 86 87 switch (c) 88 { 89 case '\t': case ' ': 90 ASSERT (c_isblank (c) == 1); 91 break; 92 default: 93 ASSERT (c_isblank (c) == 0); 94 break; 95 } 96 97 ASSERT (c_iscntrl (c) == ((c >= 0 && c < 0x20) || c == 0x7f)); 98 99 switch (c) 100 { 101 case '0': case '1': case '2': case '3': case '4': case '5': 102 case '6': case '7': case '8': case '9': 103 ASSERT (c_isdigit (c) == 1); 104 break; 105 default: 106 ASSERT (c_isdigit (c) == 0); 107 break; 108 } 109 110 switch (c) 111 { 112 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 113 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 114 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 115 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 116 case 'y': case 'z': 117 ASSERT (c_islower (c) == 1); 118 break; 119 default: 120 ASSERT (c_islower (c) == 0); 121 break; 122 } 123 124 ASSERT (c_isgraph (c) == ((c >= 0x20 && c < 0x7f) && c != ' ')); 125 126 ASSERT (c_isprint (c) == (c >= 0x20 && c < 0x7f)); 127 128 ASSERT (c_ispunct (c) == (c_isgraph (c) && !c_isalnum (c))); 129 130 switch (c) 131 { 132 case ' ': case '\t': case '\n': case '\v': case '\f': case '\r': 133 ASSERT (c_isspace (c) == 1); 134 break; 135 default: 136 ASSERT (c_isspace (c) == 0); 137 break; 138 } 139 140 switch (c) 141 { 142 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 143 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 144 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 145 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 146 case 'Y': case 'Z': 147 ASSERT (c_isupper (c) == 1); 148 break; 149 default: 150 ASSERT (c_isupper (c) == 0); 151 break; 152 } 153 154 switch (c) 155 { 156 case '0': case '1': case '2': case '3': case '4': case '5': 157 case '6': case '7': case '8': case '9': 158 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 159 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 160 ASSERT (c_isxdigit (c) == 1); 161 break; 162 default: 163 ASSERT (c_isxdigit (c) == 0); 164 break; 165 } 166 167 switch (c) 168 { 169 case 'A': 170 ASSERT (c_tolower (c) == 'a'); 171 ASSERT (c_toupper (c) == c); 172 break; 173 case 'B': 174 ASSERT (c_tolower (c) == 'b'); 175 ASSERT (c_toupper (c) == c); 176 break; 177 case 'C': 178 ASSERT (c_tolower (c) == 'c'); 179 ASSERT (c_toupper (c) == c); 180 break; 181 case 'D': 182 ASSERT (c_tolower (c) == 'd'); 183 ASSERT (c_toupper (c) == c); 184 break; 185 case 'E': 186 ASSERT (c_tolower (c) == 'e'); 187 ASSERT (c_toupper (c) == c); 188 break; 189 case 'F': 190 ASSERT (c_tolower (c) == 'f'); 191 ASSERT (c_toupper (c) == c); 192 break; 193 case 'G': 194 ASSERT (c_tolower (c) == 'g'); 195 ASSERT (c_toupper (c) == c); 196 break; 197 case 'H': 198 ASSERT (c_tolower (c) == 'h'); 199 ASSERT (c_toupper (c) == c); 200 break; 201 case 'I': 202 ASSERT (c_tolower (c) == 'i'); 203 ASSERT (c_toupper (c) == c); 204 break; 205 case 'J': 206 ASSERT (c_tolower (c) == 'j'); 207 ASSERT (c_toupper (c) == c); 208 break; 209 case 'K': 210 ASSERT (c_tolower (c) == 'k'); 211 ASSERT (c_toupper (c) == c); 212 break; 213 case 'L': 214 ASSERT (c_tolower (c) == 'l'); 215 ASSERT (c_toupper (c) == c); 216 break; 217 case 'M': 218 ASSERT (c_tolower (c) == 'm'); 219 ASSERT (c_toupper (c) == c); 220 break; 221 case 'N': 222 ASSERT (c_tolower (c) == 'n'); 223 ASSERT (c_toupper (c) == c); 224 break; 225 case 'O': 226 ASSERT (c_tolower (c) == 'o'); 227 ASSERT (c_toupper (c) == c); 228 break; 229 case 'P': 230 ASSERT (c_tolower (c) == 'p'); 231 ASSERT (c_toupper (c) == c); 232 break; 233 case 'Q': 234 ASSERT (c_tolower (c) == 'q'); 235 ASSERT (c_toupper (c) == c); 236 break; 237 case 'R': 238 ASSERT (c_tolower (c) == 'r'); 239 ASSERT (c_toupper (c) == c); 240 break; 241 case 'S': 242 ASSERT (c_tolower (c) == 's'); 243 ASSERT (c_toupper (c) == c); 244 break; 245 case 'T': 246 ASSERT (c_tolower (c) == 't'); 247 ASSERT (c_toupper (c) == c); 248 break; 249 case 'U': 250 ASSERT (c_tolower (c) == 'u'); 251 ASSERT (c_toupper (c) == c); 252 break; 253 case 'V': 254 ASSERT (c_tolower (c) == 'v'); 255 ASSERT (c_toupper (c) == c); 256 break; 257 case 'W': 258 ASSERT (c_tolower (c) == 'w'); 259 ASSERT (c_toupper (c) == c); 260 break; 261 case 'X': 262 ASSERT (c_tolower (c) == 'x'); 263 ASSERT (c_toupper (c) == c); 264 break; 265 case 'Y': 266 ASSERT (c_tolower (c) == 'y'); 267 ASSERT (c_toupper (c) == c); 268 break; 269 case 'Z': 270 ASSERT (c_tolower (c) == 'z'); 271 ASSERT (c_toupper (c) == c); 272 break; 273 case 'a': 274 ASSERT (c_tolower (c) == c); 275 ASSERT (c_toupper (c) == 'A'); 276 break; 277 case 'b': 278 ASSERT (c_tolower (c) == c); 279 ASSERT (c_toupper (c) == 'B'); 280 break; 281 case 'c': 282 ASSERT (c_tolower (c) == c); 283 ASSERT (c_toupper (c) == 'C'); 284 break; 285 case 'd': 286 ASSERT (c_tolower (c) == c); 287 ASSERT (c_toupper (c) == 'D'); 288 break; 289 case 'e': 290 ASSERT (c_tolower (c) == c); 291 ASSERT (c_toupper (c) == 'E'); 292 break; 293 case 'f': 294 ASSERT (c_tolower (c) == c); 295 ASSERT (c_toupper (c) == 'F'); 296 break; 297 case 'g': 298 ASSERT (c_tolower (c) == c); 299 ASSERT (c_toupper (c) == 'G'); 300 break; 301 case 'h': 302 ASSERT (c_tolower (c) == c); 303 ASSERT (c_toupper (c) == 'H'); 304 break; 305 case 'i': 306 ASSERT (c_tolower (c) == c); 307 ASSERT (c_toupper (c) == 'I'); 308 break; 309 case 'j': 310 ASSERT (c_tolower (c) == c); 311 ASSERT (c_toupper (c) == 'J'); 312 break; 313 case 'k': 314 ASSERT (c_tolower (c) == c); 315 ASSERT (c_toupper (c) == 'K'); 316 break; 317 case 'l': 318 ASSERT (c_tolower (c) == c); 319 ASSERT (c_toupper (c) == 'L'); 320 break; 321 case 'm': 322 ASSERT (c_tolower (c) == c); 323 ASSERT (c_toupper (c) == 'M'); 324 break; 325 case 'n': 326 ASSERT (c_tolower (c) == c); 327 ASSERT (c_toupper (c) == 'N'); 328 break; 329 case 'o': 330 ASSERT (c_tolower (c) == c); 331 ASSERT (c_toupper (c) == 'O'); 332 break; 333 case 'p': 334 ASSERT (c_tolower (c) == c); 335 ASSERT (c_toupper (c) == 'P'); 336 break; 337 case 'q': 338 ASSERT (c_tolower (c) == c); 339 ASSERT (c_toupper (c) == 'Q'); 340 break; 341 case 'r': 342 ASSERT (c_tolower (c) == c); 343 ASSERT (c_toupper (c) == 'R'); 344 break; 345 case 's': 346 ASSERT (c_tolower (c) == c); 347 ASSERT (c_toupper (c) == 'S'); 348 break; 349 case 't': 350 ASSERT (c_tolower (c) == c); 351 ASSERT (c_toupper (c) == 'T'); 352 break; 353 case 'u': 354 ASSERT (c_tolower (c) == c); 355 ASSERT (c_toupper (c) == 'U'); 356 break; 357 case 'v': 358 ASSERT (c_tolower (c) == c); 359 ASSERT (c_toupper (c) == 'V'); 360 break; 361 case 'w': 362 ASSERT (c_tolower (c) == c); 363 ASSERT (c_toupper (c) == 'W'); 364 break; 365 case 'x': 366 ASSERT (c_tolower (c) == c); 367 ASSERT (c_toupper (c) == 'X'); 368 break; 369 case 'y': 370 ASSERT (c_tolower (c) == c); 371 ASSERT (c_toupper (c) == 'Y'); 372 break; 373 case 'z': 374 ASSERT (c_tolower (c) == c); 375 ASSERT (c_toupper (c) == 'Z'); 376 break; 377 default: 378 ASSERT (c_tolower (c) == c); 379 ASSERT (c_toupper (c) == c); 380 break; 381 } 382 } 383} 384 385int 386main () 387{ 388 test_all (); 389 390 setlocale (LC_ALL, "de_DE"); 391 test_all (); 392 393 setlocale (LC_ALL, "ja_JP.EUC-JP"); 394 test_all (); 395 396 return 0; 397} 398