Annotation of src/usr.bin/mg/cinfo.c, Revision 1.8
1.8 ! vincent 1: /* $OpenBSD: cinfo.c,v 1.7 2002/02/14 02:50:10 vincent Exp $ */
1.3 niklas 2:
1.1 deraadt 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: */
1.6 mickey 20: const char cinfo[256] = {
1.7 vincent 21: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x0X */
22: _MG_C, _MG_C, _MG_C, _MG_C,
23: _MG_C, _MG_C, _MG_C, _MG_C,
24: _MG_C, _MG_C, _MG_C, _MG_C,
25: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x1X */
26: _MG_C, _MG_C, _MG_C, _MG_C,
27: _MG_C, _MG_C, _MG_C, _MG_C,
28: _MG_C, _MG_C, _MG_C, _MG_C,
29: 0, _MG_P, 0, 0, /* 0x2X */
30: _MG_W, _MG_W, 0, _MG_W,
31: 0, 0, 0, 0,
32: 0, 0, _MG_P, 0,
33: _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, /* 0x3X */
34: _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,
35: _MG_D | _MG_W, _MG_D | _MG_W, 0, 0,
36: 0, 0, 0, _MG_P,
37: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x4X */
38: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
39: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
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, /* 0x5X */
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, 0,
44: 0, 0, 0, 0,
45: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x6X */
46: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
47: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
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, /* 0x7X */
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, 0,
52: 0, 0, 0, _MG_C,
1.2 millert 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,
1.7 vincent 69: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xCX */
70: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
71: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
72: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
73: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xDX */
74: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
75: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
76: _MG_U | _MG_W, _MG_U | _MG_W, 0, _MG_W,
77: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xEX */
78: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
79: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
80: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
81: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xFX */
82: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
83: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
84: _MG_L | _MG_W, _MG_L | _MG_W, 0, 0
1.1 deraadt 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: */
1.2 millert 92: char *
1.8 ! vincent 93: keyname(char *cp, size_t len, int k)
1.1 deraadt 94: {
1.8 ! vincent 95: const char *np;
1.1 deraadt 96:
1.2 millert 97: if (k < 0)
98: k = CHARMASK(k);/* sign extended char */
99: switch (k) {
100: case CCHR('@'):
1.4 art 101: np = "C-SPC";
1.2 millert 102: break;
103: case CCHR('I'):
104: np = "TAB";
105: break;
106: case CCHR('J'):
107: np = "LFD";
108: break; /* yuck, but that's what GNU calls it */
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;
1.1 deraadt 121: default:
122: #ifdef FKEYS
1.2 millert 123: if (k >= KFIRST && k <= KLAST &&
1.1 deraadt 124: (np = keystrings[k - KFIRST]) != NULL)
1.2 millert 125: break;
1.1 deraadt 126: #endif
1.2 millert 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: }
135: if (k < ' ') {
136: *cp++ = 'C';
137: *cp++ = '-';
138: k = CCHR(k);
139: if (ISUPPER(k))
140: k = TOLOWER(k);
141: }
142: *cp++ = k;
1.1 deraadt 143: *cp = '\0';
144: return cp;
1.2 millert 145: }
1.6 mickey 146: return cp + strlcpy(cp, np, len);
1.1 deraadt 147: }