[alt.sources] Terminfo/Termcap checker

tchrist@convex.COM (Tom Christiansen) (12/14/89)

In article <317@gtenmc.UUCP> stumpf@gtenmc.UUCP (stumpf) writes:
>I am looking for a simple program to tell me the name
>of the key that is pressed until EOF.  This is something
>similar to the keycaps function on the MAC.

Here is a brief program to do what you want.  Hit the same char
3 times to exit.

--tom

/*
 * Ascii reads characters from the keyboard in raw mode and writes the
 * numerical equvalent in octal and decimal as well as its standard mnemonic.
 *
 * Originally written on 4.1 by J. Goodman (I think). 
 * Rewritten by Dave Cohrs <dave@cs.wisc.edu>
 *  
 *
 *	Modified 1/19/86 by David Parter to also show hex.
 */

char	*cval[128] = {
	"nul   ^@,null",
	"soh   ^a",
	"stx   ^b",
	"etx   ^c",
	"eot   ^d",
	"enq   ^e",
	"ack   ^f",
	"bel   ^g",
	"bs    ^h",
	"ht    ^i",
	"nl    ^j",
	"vt    ^k",
	"np    ^l",
	"cr    ^m",
	"so    ^n",
	"si    ^o",
	"dle   ^p",
	"dc1   ^q",
	"dc2   ^r",
	"dc3   ^s",
	"dc4   ^t",
	"nak   ^u",
	"syn   ^v",
	"etb   ^w",
	"can   ^x",
	"em    ^y",
	"sub   ^z",
	"esc   ^[",
	"fs    ^\\,^shL",
	"gs    ^],^shM",
	"rs    ^^,^shN",
	"us    ^_,^shO",
	"space",
	"!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-",
	".", "/", "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   ^?",
	};

#include <sys/ioctl.h>
#include <stdio.h>

main()
{
	struct sgttyb savp;
	struct sgttyb buf;
	register char csav = 0200, ccnt = 0;
	char c;

	printf("octal hex decimal char other\n");
	printf("----------------------------\n");
	fflush(stdout);

	ioctl(0, TIOCGETP, &savp);	/* save old state */
	ioctl(0, TIOCGETP, &buf);	/* get another copy to change */
	buf.sg_flags |= RAW;
	buf.sg_flags &= ~(ECHO|CRMOD);

	ioctl(0, TIOCSETP, &buf);

	for(;;) {
		read(0, &c, 1);
		c &= 127;
		printf("  %03o  %02X     %3d   %s\r\n", c, c, c, cval[c]);
		if (c == csav) {
			if(++ccnt == 2) {
				ioctl(0, TIOCSETP, &savp);
				exit(0);
			}
		} else
			ccnt = 0;
		csav = c;
	}
}

/* lint output:
ascii.c:
ioctl, arg. 3 used inconsistently	llib-lc(68)  ::  ascii.c(69)
ioctl, arg. 3 used inconsistently	llib-lc(68)  ::  ascii.c(70)
ioctl, arg. 3 used inconsistently	llib-lc(68)  ::  ascii.c(74)
ioctl, arg. 3 used inconsistently	llib-lc(68)  ::  ascii.c(82)
ioctl returns value which is always ignored
read returns value which is always ignored
fflush returns value which is always ignored
*/

    Tom Christiansen                       {uunet,uiucdcs,sun}!convex!tchrist 
    Convex Computer Corporation                            tchrist@convex.COM
		 "EMACS belongs in <sys/errno.h>: Editor too big!"