#include #include #include /* Define a typedef for use in our struct. */ typedef int (*isfunc_t) (int); /* Define a macro to initialize the elements of the struct. */ #define F(x) {x, #x} struct iser { isfunc_t f; const char * name; } isers[] = { F (isalnum), F (isalpha), F (isascii), F (isblank), F (iscntrl), F (isdigit), F (isgraph), F (islower), F (isnumber), F (isprint), F (ispunct), F (isspace), F (isupper), F (isxdigit), }; #define n_isers (sizeof (isers)/sizeof (struct iser)) /* Print a header for the table, going vertically. */ static void print_header () { int i; int max_len = 0; int l[n_isers]; const char * spacer = " "; for (i = 0; i < n_isers; i++) { l[i] = strlen (isers[i].name); if (l[i] > max_len) { max_len = l[i]; } } for (i = 0; i < max_len; i++) { int j; printf ("%s|", spacer); for (j = 0; j < n_isers; j++) { if (i < l[j]) { printf ("%c|", isers[j].name[i]); } else { printf (" |"); } } printf ("\n"); } } static void print_types () { int c; for (c = 0; c < 128; c++) { int i; printf ("%02X %03o ", c, c); if (isprint (c)) { printf ("%c ", c); } else { printf ("-- "); } printf ("|"); for (i = 0; i < n_isers; i++) { int ok; ok = isers[i].f (c); if (ok) { printf ("O"); } else { printf ("X"); } printf ("|"); } printf ("\n"); } } int main () { print_header (); print_types (); return 0; }