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