Annotation of src/usr.bin/mg/cinfo.c, Revision 1.3
1.3 ! niklas 1: /* $OpenBSD$ */
! 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.2 millert 20: 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
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 *
93: keyname(cp, k)
94: char *cp;
95: int k;
1.1 deraadt 96: {
1.2 millert 97: char *np;
1.1 deraadt 98:
1.2 millert 99: if (k < 0)
100: k = CHARMASK(k);/* sign extended char */
101: switch (k) {
102: case CCHR('@'):
103: np = "NUL";
104: break;
105: case CCHR('I'):
106: np = "TAB";
107: break;
108: case CCHR('J'):
109: np = "LFD";
110: break; /* yuck, but that's what GNU calls it */
111: case CCHR('M'):
112: np = "RET";
113: break;
114: case CCHR('['):
115: np = "ESC";
116: break;
117: case ' ':
118: np = "SPC";
119: break; /* yuck again */
120: case CCHR('?'):
121: np = "DEL";
122: break;
1.1 deraadt 123: default:
124: #ifdef FKEYS
1.2 millert 125: if (k >= KFIRST && k <= KLAST &&
1.1 deraadt 126: (np = keystrings[k - KFIRST]) != NULL)
1.2 millert 127: break;
1.1 deraadt 128: #endif
1.2 millert 129: if (k > CCHR('?')) {
130: *cp++ = '0';
131: *cp++ = ((k >> 6) & 7) + '0';
132: *cp++ = ((k >> 3) & 7) + '0';
133: *cp++ = (k & 7) + '0';
134: *cp = '\0';
135: return cp;
136: }
137: if (k < ' ') {
138: *cp++ = 'C';
139: *cp++ = '-';
140: k = CCHR(k);
141: if (ISUPPER(k))
142: k = TOLOWER(k);
143: }
144: *cp++ = k;
1.1 deraadt 145: *cp = '\0';
146: return cp;
1.2 millert 147: }
148: (VOID) strcpy(cp, np);
149: return cp + strlen(cp);
1.1 deraadt 150: }