#include <stdio.h>
#include <ctype.h>

#define MAXFUNCNAME 8
#define NFUNC 12
static char is_functions[NFUNC][MAXFUNCNAME + 1] =
{
    "isalnum ", "isalpha ", "isascii ", "iscntrl ", "isdigit ", "isgraph ",
    "islower ", "isprint ", "ispunct ", "isspace ", "isupper ", "isxdigit"
    };

char* char_names[] = {
    "nul", "soh", "stx", "etx", "eot", "enq", "ack", "bel",
    "bs ", "ht ", "nl ", "vt ", "np ", "cr ", "so ", "si ",
    "dle", "dc1", "dc2", "dc3", "dc4", "nak", "syn", "etb",
    "can", "em ", "sub", "esc", "fs ", "gs ", "rs ", "us ",
    "sp ", " ! ", " \" ", " # ", " $ ", " % ", " & ", " ' ",
    " ( ", " ) ", " * ", " + ", " , ", " - ", " . ", " / ",
    " 0 ", " 1 ", " 2 ", " 3 ", " 4 ", " 5 ", " 6 ", " 7 ",
    " 8 ", " 9 ", " : ", " ; ", " < ", " = ", " > ", " ? ",
    " @ ", " A ", " B ", " C ", " D ", " E ", " F ", " G ",
    " H ", " I ", " J ", " K ", " L ", " M ", " N ", " O ",
    " P ", " Q ", " R ", " S ", " T ", " U ", " V ", " W ",
    " X ", " Y ", " Z ", " [ ", " \\ ", " ] ", " ^ ", " _ ",
    " ` ", " a ", " b ", " c ", " d ", " e ", " f ", " g ",
    " h ", " i ", " j ", " k ", " l ", " m ", " n ", " o ",
    " p ", " q ", " r ", " s ", " t ", " u ", " v ", " w ",
    " x ", " y ", " z ", " { ", " | ", " } ", " ~ ", "del"
    };

void print_header(void)
{
    const int left_margin = 11;
    int i, j;

    for(i = 0; i < MAXFUNCNAME; i++)
    {
	for(j = 0; j < left_margin; j++)
	    putchar(' ');
	for(j = 0; j < NFUNC; j++)
	{
	    putchar(is_functions[j][i]);
	    putchar(' ');
	    putchar(' ');
	}
	putchar('\n');
    }
    for(j = 0; j < left_margin; j++)
	putchar(' ');
    for(j = 0; j < NFUNC - 1; j++)
    {
	putchar('+');
	putchar('-');
	putchar('-');
    }
    putchar('+');
    putchar('\n');
}

int main(int argc, char** argv)
{
    int i, j, opt8;
    int status[NFUNC];

    if(argc == 2 &&
       argv[1][0] == '-' &&
       argv[1][1] == '8' &&
       argv[1][2] == '\0')
	opt8 = 1;
    else
	opt8 = 0;

    print_header();
    for(i = 0; i <= 127; i++)
    {
	printf("0x%02x(%s) ", i, char_names[i]);

	for(j = 0; j < NFUNC; j++)
	    status[j] = 0;
	j = 0;
	status[j++] = isalnum(i);
	status[j++] = isalpha(i);
	status[j++] = isascii(i);
	status[j++] = iscntrl(i);
	status[j++] = isdigit(i);
	status[j++] = isgraph(i);
	status[j++] = islower(i);
	status[j++] = isprint(i);
	status[j++] = ispunct(i);
	status[j++] = isspace(i);
	status[j++] = isupper(i);
	status[j++] = isxdigit(i);

	putchar(' ');
	for(j = 0; j < NFUNC; j++)
	{
	    if(status[j])
		putchar('T');
	    else
		putchar('.');
	    putchar(' ');
	    putchar(' ');
	}
	putchar('\n');
    }

    if(opt8)
    {
	for(; i <= 255; i++)
	{
	    printf("0x%02x(...) ", i);

	    for(j = 0; j < NFUNC; j++)
		status[j] = 0;
	    j = 0;
	    status[j++] = isalnum(i);
	    status[j++] = isalpha(i);
	    status[j++] = isascii(i);
	    status[j++] = iscntrl(i);
	    status[j++] = isdigit(i);
	    status[j++] = isgraph(i);
	    status[j++] = islower(i);
	    status[j++] = isprint(i);
	    status[j++] = ispunct(i);
	    status[j++] = isspace(i);
	    status[j++] = isupper(i);
	    status[j++] = isxdigit(i);

	    putchar(' ');
	    for(j = 0; j < NFUNC; j++)
	    {
		if(status[j])
		    putchar('T');
		else
		    putchar('.');
		putchar(' ');
		putchar(' ');
	    }
	    putchar('\n');
	}
    }
    return 0;
}
