1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19: #include <limits.h>
20: #include <ctype.h>
21: #include <stdio.h>
22: #include <stdlib.h>
23:
24: #define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
25: #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
26: #define XOR(e,f) (((e) && !(f)) || (!(e) && (f)))
27:
28: #ifdef __GNUC__
29: __inline
30: #endif
31: static void
32: print_char (unsigned char c)
33: {
34: printf("%d/", (int) c);
35: if (isgraph(c))
36: printf("'%c'", c);
37: else
38: printf("'\\%.3o'", c);
39: }
40:
41: int
42: main (int argc, char **argv)
43: {
44: unsigned short int c;
45: int lose = 0;
46:
47: #define TRYEM do { \
48: TRY (isascii); \
49: TRY (isalnum); \
50: TRY (isalpha); \
51: TRY (iscntrl); \
52: TRY (isdigit); \
53: TRY (isgraph); \
54: TRY (islower); \
55: TRY (isprint); \
56: TRY (ispunct); \
57: TRY (isspace); \
58: TRY (isupper); \
59: TRY (isxdigit); \
60: TRY (isblank); \
61: } while (0)
62:
63: for (c = 0; c <= UCHAR_MAX; ++c)
64: {
65: print_char (c);
66:
67: if (XOR (islower (c), ISLOWER (c)) || toupper (c) != TOUPPER (c))
68: {
69: fputs (" BOGUS", stdout);
70: ++lose;
71: }
72:
73: #define TRY(isfoo) if (isfoo (c)) fputs (" " #isfoo, stdout)
74: TRYEM;
75: #undef TRY
76:
77: fputs("; lower = ", stdout);
78: print_char(tolower(c));
79: fputs("; upper = ", stdout);
80: print_char(toupper(c));
81: putchar('\n');
82: }
83:
84: fputs ("EOF", stdout);
85: if (tolower (EOF) != EOF)
86: {
87: ++lose;
88: printf (" tolower BOGUS %d;", tolower (EOF));
89: }
90: if (toupper (EOF) != EOF)
91: {
92: ++lose;
93: printf (" toupper BOGUS %d;", toupper (EOF));
94: }
95:
96: #define TRY(isfoo) if (isfoo (EOF)) fputs (" " #isfoo, stdout), ++lose
97: TRYEM;
98: #undef TRY
99:
100: return lose ? EXIT_FAILURE : EXIT_SUCCESS;
101: }