/* ASC2LET */

/* Program to convert an inputted ASCII value to its ASCII character */
/* converts non-printable values to three letter codes + brief description */
/* Mike Richmond 1995 */

/* Devvelopment history: */
/* v1.00	Initial version */

#include <stdio.h>
#include <stdlib.h>				/* for atoi() function */

/* CONSTANTS (Error strings etc.) */

#define VERSION	"v1.00"		
#define DATE "(17/4/95)"			
#define INVALID_STRING "Argument must be a number between 1 and 255\n\n"
#define UNKNOWNCODE_STRING "Sorry, I do not know that ASCII code\n\n"
#define USAGE_STRING "A utility to display the character corresponding to a given ASCII code\n\nUsage: ASC2LET <ASCII code>\n\n" 


/* PROTOTYPES */

void displaycode(int number);


void main(int argc, char *argv[])
{
	int number;
	
	printf("\nASC2LET %s by Mike Richmond %s.\n",VERSION,DATE);
	
	if (argc !=2) {
		/* no arguments or too many arguments */
		printf(USAGE_STRING);
		exit(20);
	}

	if (number=atoi(argv[1])) {
		if (number >=0 && number <256) {
			if ((number >=32 && number <127) || (number >160 && number <256))
				/* number is a printable character */
				printf("\nASCII code %d is the \"%c\" character.\n\n",number,(unsigned char)number) ; 
			else displaycode(number);
		}
		else
			/* too large or too small */
			printf(INVALID_STRING) ; 
		
	}
	else
		/* not a number */
		printf(INVALID_STRING);
}	
	
void displaycode(int number)
{
	/* define codes */
	char code0[] = "NUL  (Ctrl-@)" ;			/* ASCII 0 */
	char code1[] = "SOH  (Ctrl-A)" ;	
	char code2[] = "STX  (Ctrl-B)" ;
	char code3[] = "ETX  (Ctrl-C)" ;
	char code4[] = "EOT  (Ctrl-D)" ;
	char code5[] = "ENG  (Ctrl-E)" ;			/* ASCII 5 */
	char code6[] = "ACK  (Ctrl-F)" ;			
	char code7[] = "BEL  (Ctrl-G - alert)" ;
	char code8[] = "BS  (Ctrl-H - backspace)"  ;
	char code9[] = "HT  (Ctrl-I - horizontal tab)"  ;
	char code10[] = "LF  (Ctrl-J - linefeed)"  ;			/* ASCII 10 */
	char code11[] = "VT  (Ctrl-K - vertical tab)"  ;			
	char code12[] = "FF  (Ctrl-L - form feed)"  ;
	char code13[] = "CR  (Ctrl-M - carriage return)"  ;
	char code14[] = "SO  (Ctrl-N - double width printer text on)"  ;
	char code15[] = "SI  (Ctrl-O - condensed printer text)"  ;			/* ASCII 15 */
	char code16[] = "DLE  (Ctrl-P)" ;			
	char code17[] = "DC1  (Ctrl-Q)" ;
	char code18[] = "DC2  (Ctrl-R - condensed printer text off)" ;
	char code19[] = "DC3  (Ctrl-S)" ;
	char code20[] = "DC4  (Ctrl-T - double width printer text off)" ;        	/* ASCII 20 */
	char code21[] = "NAK  (Ctrl-U)" ;			
	char code22[] = "SYN  (Ctrl-V)" ;
	char code23[] = "ETB  (Ctrl-W)" ;
	char code24[] = "CAN  (Ctrl-X - clear buffer)" ;
	char code25[] = "EM   (Ctrl-Y)"  ;			/* ASCII 25 */
	char code26[] = "SUB  (Ctrl-Z)" ;			
	char code27[] = "ESC  (Ctrl-[ - escape)" ;
	char code28[] = "FS  (Ctrl-\\)" ;
	char code29[] = "GS  (Ctrl-])"  ;
	char code30[] = "RS  (Ctrl-^)"  ;			/* ASCII 30 */
	char code31[] = "VS  (Ctrl-_)"  ;
	char code32[] = "SP  (space)"  ;

	char *ascode_p[32];				/* pointer to 32 ASCII codes */
	
	/* initialise pointer array */
	ascode_p[0]=&code0[0];
	ascode_p[1]=&code1[0];
	ascode_p[2]=&code2[0];
	ascode_p[3]=&code3[0];
	ascode_p[4]=&code4[0];
	ascode_p[5]=&code5[0];
	ascode_p[6]=&code6[0];
	ascode_p[7]=&code7[0];
	ascode_p[8]=&code8[0];
	ascode_p[9]=&code9[0];
	ascode_p[10]=&code10[0];
	ascode_p[11]=&code11[0];
	ascode_p[12]=&code12[0];
	ascode_p[13]=&code13[0];
	ascode_p[14]=&code14[0];
	ascode_p[15]=&code15[0];
	ascode_p[16]=&code16[0];
	ascode_p[17]=&code17[0];
	ascode_p[18]=&code18[0];
	ascode_p[19]=&code19[0];
	ascode_p[20]=&code20[0];
	ascode_p[21]=&code21[0];
	ascode_p[22]=&code22[0];
	ascode_p[23]=&code23[0];
	ascode_p[24]=&code24[0];
	ascode_p[25]=&code25[0];
	ascode_p[26]=&code26[0];
	ascode_p[27]=&code27[0];
	ascode_p[28]=&code28[0];
	ascode_p[29]=&code29[0];
	ascode_p[30]=&code30[0];
	ascode_p[31]=&code31[0];
	ascode_p[32]=&code32[0];

	if (number >127 && number <161)			/* unknown ASCII value */
		printf(UNKNOWNCODE_STRING);	
		
	else if (number==127)					/* DEL character */
		printf("\nASCII code 127 is the \"DEL\" character.\n\n");

	else printf("\nASCII code %d is the \"%s\" character.\n\n",number, ascode_p[number]);
	/* print out the string pointed to by ascode_p[number] */
}

