1/* Copyright (C) 1991-2022 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3
4 The GNU C Library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
8
9 The GNU C Library 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 GNU
12 Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with the GNU C Library; if not, see
16 <https://www.gnu.org/licenses/>. */
17
18#include <limits.h>
19#include <ctype.h>
20#include <stdio.h>
21#include <stdlib.h>
22
23#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
24#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
25#define XOR(e,f) (((e) && !(f)) || (!(e) && (f)))
26
27#ifdef __GNUC__
28__inline
29#endif
30static void
31print_char (unsigned char c)
32{
33 printf(format: "%d/", (int) c);
34 if (isgraph(c))
35 printf(format: "'%c'", c);
36 else
37 printf(format: "'\\%.3o'", c);
38}
39
40int
41main (int argc, char **argv)
42{
43 unsigned short int c;
44 int lose = 0;
45
46#define TRYEM do { \
47 TRY (isascii); \
48 TRY (isalnum); \
49 TRY (isalpha); \
50 TRY (iscntrl); \
51 TRY (isdigit); \
52 TRY (isgraph); \
53 TRY (islower); \
54 TRY (isprint); \
55 TRY (ispunct); \
56 TRY (isspace); \
57 TRY (isupper); \
58 TRY (isxdigit); \
59 TRY (isblank); \
60 } while (0)
61
62 for (c = 0; c <= UCHAR_MAX; ++c)
63 {
64 print_char (c);
65
66 if (XOR (islower (c), ISLOWER (c)) || toupper (c) != TOUPPER (c))
67 {
68 fputs (" BOGUS", stdout);
69 ++lose;
70 }
71
72#define TRY(isfoo) if (isfoo (c)) fputs (" " #isfoo, stdout)
73 TRYEM;
74#undef TRY
75
76 fputs("; lower = ", stdout);
77 print_char(tolower(c));
78 fputs("; upper = ", stdout);
79 print_char(toupper(c));
80 putchar(c: '\n');
81 }
82
83 fputs ("EOF", stdout);
84 if (tolower (EOF) != EOF)
85 {
86 ++lose;
87 printf (format: " tolower BOGUS %d;", tolower (EOF));
88 }
89 if (toupper (EOF) != EOF)
90 {
91 ++lose;
92 printf (format: " toupper BOGUS %d;", toupper (EOF));
93 }
94
95#define TRY(isfoo) if (isfoo (EOF)) fputs (" " #isfoo, stdout), ++lose
96 TRYEM;
97#undef TRY
98
99 return lose ? EXIT_FAILURE : EXIT_SUCCESS;
100}
101

source code of glibc/ctype/test_ctype.c