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