/* Written by James M. Rogers, 27 January 1999 */
/* This program is released to the public domain. */

/*
   An example of a C cgi program
   This program will produce html output to represent characters by their 
   group membership in the ctype library.
*/


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

#define UPPER	255
#define LOWER	0

main (){

    int i;

    /* print the content tag */
    printf("Content-type: text/html\n\n");

    /* print the html header */
    printf("<html>\n<head>\n<title>Class Membership by Character</title>\n</head>\n<body>\n");

    /* begin the table */
    printf("<table border cellspacing=01 rowspacing=2>\n");

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* print the headings for the rows */
    printf("<tr> <td></td> <td>value</td><td>hex</td><td>char</td><td></td><td>lower</td><td>upper</td><td>alpha</td><td>digit</td><td>xdigit</td><td>alnum</td><td>punct</td><td>graph</td><td>print</td><td>space</td><td>cntrl</td><td></td></tr>");

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* go thru the characters one at a time
       from lowest to highest */
    for (i=LOWER;i<=UPPER;i++) {

        /* begin the next row */
	printf("<tr> <td></td>");

        /* begin the next entry */
	printf("<td>");

	printf("%d ", i);

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	printf("%X ", i);

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if(isprint(i)) {
	    printf("%c ", i);
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* print a blank column */
	printf("<td></td>");

        /* begin the next entry */
	printf("<td>");

	if (islower(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isupper(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isalpha(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isdigit(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isxdigit(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isalnum(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (ispunct(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isgraph(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isprint(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (isspace(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* begin the next entry */
	printf("<td>");

	if (iscntrl(i)) {
	    printf("*");
	} else {
	    printf("&nbsp;");
	}

        /* end entry */
	printf("</td>");

        /* end row */
	printf("<td></td></tr>\n");

    } /* end for */

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* print a pretty blank row */
    printf("<tr></tr>");

    /* close the table, body and html document, we are done */
    printf("</table>\n</body>\n</html>\n");

}  /* end main */
