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
30 static void
print_char(unsigned char c)31 print_char (unsigned char c)
32 {
33 printf("%d/", (int) c);
34 if (isgraph(c))
35 printf("'%c'", c);
36 else
37 printf("'\\%.3o'", c);
38 }
39
40 int
main(int argc,char ** argv)41 main (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('\n');
81 }
82
83 fputs ("EOF", stdout);
84 if (tolower (EOF) != EOF)
85 {
86 ++lose;
87 printf (" tolower BOGUS %d;", tolower (EOF));
88 }
89 if (toupper (EOF) != EOF)
90 {
91 ++lose;
92 printf (" 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