[comp.sources.misc] v03i068: print an ASCII table the way I want it

mcgrath%rosemary.Berkeley.EDU@ucbvax.Berkeley.EDU (Roland McGrath) (06/30/88)

Posting-number: Volume 3, Issue 68
Submitted-by: "Roland McGrath" <mcgrath%rosemary.Berkeley.EDU@ucbvax.Berkeley.EDU>
Archive-name: ascii

This prints an ASCII table.  I'm posting it as source for two reasons:
     1) so no stupid mailers can munge the spacing
     2) so it really belongs in a sources group!

Don't me misled by the title.  It is a literal statement: it prints an
ASCII table the way I want it.  If YOU want it some different way,
tough.

Dissatisfied with /usr/pub/ascii and other such tables that aren't
quite right, I wrote this today.  Besides, the ASCII table fell off my
wall a while ago and disappeared among the power cords behind the
desk.

This table has some advantages over others:
     * It gives ASCII characters, using the ^ convention for control
     chars and the ASCII names for same plus the decimal, hexadecimal
     and octal representations all at once.
     * It has enough whitespace to be easily readable.
     * It fits on one printed page (barely -- it's 65 lines long).

This is meant to be printed out and taped to the wall behind your
terminal.  Any other use is allowed but is obviously a sign of
inferior working conditions. ;-)

Here's a handmade sharchive:
: sh me
echo x - ascii.c
cat > ascii.c <<eof
#include <ctype.h>
#include <stdio.h>

int main()
{
	void printone();
	register int i;

	puts("\
      char   | dec | hex | oct    ||     char   | dec | hex | oct\
");

	for (i = 0; i < 64; ++i) {
		fputs("    ", stdout);	
		printone(i);
		fputs("    ||   ", stdout);
		printone(i + 64);
		putchar('\n');
	}

	exit(0);
}


void
printone(i)
int i;
{
	if (isprint(i)) printf("%-8c", i);
	else {
		char *desc;
		switch (i) {
			case 0x00: desc = "NUL"; break;
			case 0x01: desc = "SOH"; break;
			case 0x02: desc = "STX"; break;
			case 0x03: desc = "ETX"; break;
			case 0x04: desc = "EOT"; break;
			case 0x05: desc = "ENQ"; break;
			case 0x06: desc = "ACK"; break;
			case 0x07: desc = "BEL"; break;
			case 0x08: desc = "BS"; break;
			case 0x09: desc = "HT"; break;
			case 0x0a: desc = "LF"; break;
			case 0x0b: desc = "VT"; break;
			case 0x0c: desc = "FF"; break;
			case 0x0d: desc = "CR"; break;
			case 0x0e: desc = "SO"; break;
			case 0x0f: desc = "SI"; break;
			case 0x10: desc = "DLE"; break;
			case 0x11: desc = "DC1"; break;
			case 0x12: desc = "DC2"; break;
			case 0x13: desc = "DC3"; break;
			case 0x14: desc = "DC4"; break;
			case 0x15: desc = "NAK"; break;
			case 0x16: desc = "SYN"; break;
			case 0x17: desc = "ETB"; break;
			case 0x18: desc = "CAN"; break;
			case 0x19: desc = "EM"; break;
			case 0x1A: desc = "SUB"; break;
			case 0x1B: desc = "ESC"; break;
			case 0x1c: desc = "FS";break;
			case 0x1d: desc = "GS"; break;
			case 0x1e: desc = "RS"; break;
			case 0x1f: desc = "US"; break;
			case 0x7F: desc = "DEL"; break;
		}
		printf("^%c (%s)", i == 0x7f ? '?' : i + '@', desc);
		if (!desc[2]) putchar(' ');
	}
	printf(" | %3d | %3.2x | %3.3o", i, i, i);
}
eof
	Roland McGrath

roland@wheaties.ai.mit.edu, mit-eddie!wheaties.ai.mit.edu!roland