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