xref: /openbsd-src/usr.bin/mg/cinfo.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: cinfo.c,v 1.6 2001/05/23 23:29:47 mickey Exp $	*/
2 
3 /*
4  *		Character class tables.
5  * Do it yourself character classification
6  * macros, that understand the multinational character set,
7  * and let me ask some questions the standard macros (in
8  * ctype.h) don't let you ask.
9  */
10 #include	"def.h"
11 
12 /*
13  * This table, indexed by a character drawn
14  * from the 256 member character set, is used by my
15  * own character type macros to answer questions about the
16  * type of a character. It handles the full multinational
17  * character set, and lets me ask some questions that the
18  * standard "ctype" macros cannot ask.
19  */
20 const char cinfo[256] = {
21 	_C, _C, _C, _C,		/* 0x0X */
22 	_C, _C, _C, _C,
23 	_C, _C, _C, _C,
24 	_C, _C, _C, _C,
25 	_C, _C, _C, _C,		/* 0x1X */
26 	_C, _C, _C, _C,
27 	_C, _C, _C, _C,
28 	_C, _C, _C, _C,
29 	0, _P, 0, 0,		/* 0x2X */
30 	_W, _W, 0, _W,
31 	0, 0, 0, 0,
32 	0, 0, _P, 0,
33 	_D | _W, _D | _W, _D | _W, _D | _W,	/* 0x3X */
34 	_D | _W, _D | _W, _D | _W, _D | _W,
35 	_D | _W, _D | _W, 0, 0,
36 	0, 0, 0, _P,
37 	0, _U | _W, _U | _W, _U | _W,	/* 0x4X */
38 	_U | _W, _U | _W, _U | _W, _U | _W,
39 	_U | _W, _U | _W, _U | _W, _U | _W,
40 	_U | _W, _U | _W, _U | _W, _U | _W,
41 	_U | _W, _U | _W, _U | _W, _U | _W,	/* 0x5X */
42 	_U | _W, _U | _W, _U | _W, _U | _W,
43 	_U | _W, _U | _W, _U | _W, 0,
44 	0, 0, 0, 0,
45 	0, _L | _W, _L | _W, _L | _W,	/* 0x6X */
46 	_L | _W, _L | _W, _L | _W, _L | _W,
47 	_L | _W, _L | _W, _L | _W, _L | _W,
48 	_L | _W, _L | _W, _L | _W, _L | _W,
49 	_L | _W, _L | _W, _L | _W, _L | _W,	/* 0x7X */
50 	_L | _W, _L | _W, _L | _W, _L | _W,
51 	_L | _W, _L | _W, _L | _W, 0,
52 	0, 0, 0, _C,
53 	0, 0, 0, 0,		/* 0x8X */
54 	0, 0, 0, 0,
55 	0, 0, 0, 0,
56 	0, 0, 0, 0,
57 	0, 0, 0, 0,		/* 0x9X */
58 	0, 0, 0, 0,
59 	0, 0, 0, 0,
60 	0, 0, 0, 0,
61 	0, 0, 0, 0,		/* 0xAX */
62 	0, 0, 0, 0,
63 	0, 0, 0, 0,
64 	0, 0, 0, 0,
65 	0, 0, 0, 0,		/* 0xBX */
66 	0, 0, 0, 0,
67 	0, 0, 0, 0,
68 	0, 0, 0, 0,
69 	_U | _W, _U | _W, _U | _W, _U | _W,	/* 0xCX */
70 	_U | _W, _U | _W, _U | _W, _U | _W,
71 	_U | _W, _U | _W, _U | _W, _U | _W,
72 	_U | _W, _U | _W, _U | _W, _U | _W,
73 	0, _U | _W, _U | _W, _U | _W,	/* 0xDX */
74 	_U | _W, _U | _W, _U | _W, _U | _W,
75 	_U | _W, _U | _W, _U | _W, _U | _W,
76 	_U | _W, _U | _W, 0, _W,
77 	_L | _W, _L | _W, _L | _W, _L | _W,	/* 0xEX */
78 	_L | _W, _L | _W, _L | _W, _L | _W,
79 	_L | _W, _L | _W, _L | _W, _L | _W,
80 	_L | _W, _L | _W, _L | _W, _L | _W,
81 	0, _L | _W, _L | _W, _L | _W,	/* 0xFX */
82 	_L | _W, _L | _W, _L | _W, _L | _W,
83 	_L | _W, _L | _W, _L | _W, _L | _W,
84 	_L | _W, _L | _W, 0, 0
85 };
86 
87 /*
88  * Find the name of a keystroke.  Needs to be changed to handle 8-bit printing
89  * characters and function keys better.	 Returns a pointer to the terminating
90  * '\0'.
91  */
92 char *
93 keyname(cp, len, k)
94 	char	*cp;
95 	size_t	len;
96 	int	k;
97 {
98 	char  *np;
99 
100 	if (k < 0)
101 		k = CHARMASK(k);/* sign extended char */
102 	switch (k) {
103 	case CCHR('@'):
104 		np = "C-SPC";
105 		break;
106 	case CCHR('I'):
107 		np = "TAB";
108 		break;
109 	case CCHR('J'):
110 		np = "LFD";
111 		break;		/* yuck, but that's what GNU calls it */
112 	case CCHR('M'):
113 		np = "RET";
114 		break;
115 	case CCHR('['):
116 		np = "ESC";
117 		break;
118 	case ' ':
119 		np = "SPC";
120 		break;		/* yuck again */
121 	case CCHR('?'):
122 		np = "DEL";
123 		break;
124 	default:
125 #ifdef	FKEYS
126 		if (k >= KFIRST && k <= KLAST &&
127 		    (np = keystrings[k - KFIRST]) != NULL)
128 			break;
129 #endif
130 		if (k > CCHR('?')) {
131 			*cp++ = '0';
132 			*cp++ = ((k >> 6) & 7) + '0';
133 			*cp++ = ((k >> 3) & 7) + '0';
134 			*cp++ = (k & 7) + '0';
135 			*cp = '\0';
136 			return cp;
137 		}
138 		if (k < ' ') {
139 			*cp++ = 'C';
140 			*cp++ = '-';
141 			k = CCHR(k);
142 			if (ISUPPER(k))
143 				k = TOLOWER(k);
144 		}
145 		*cp++ = k;
146 		*cp = '\0';
147 		return cp;
148 	}
149 	return cp + strlcpy(cp, np, len);
150 }
151