Annotation of src/usr.bin/mg/cinfo.c, Revision 1.13
1.13 ! kjell 1: /* $OpenBSD: cinfo.c,v 1.12 2005/06/14 18:14:40 kjell Exp $ */
1.12 kjell 2:
3: /* This file is in the public domain. */
1.3 niklas 4:
1.1 deraadt 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: */
1.6 mickey 22: const char cinfo[256] = {
1.10 vincent 23: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x0X */
1.7 vincent 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,
1.10 vincent 27: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x1X */
1.7 vincent 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,
1.10 vincent 31: 0, _MG_P, 0, 0, /* 0x2X */
1.7 vincent 32: _MG_W, _MG_W, 0, _MG_W,
33: 0, 0, 0, 0,
34: 0, 0, _MG_P, 0,
1.10 vincent 35: _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, /* 0x3X */
1.7 vincent 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,
1.10 vincent 39: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x4X */
1.7 vincent 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,
1.10 vincent 43: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x5X */
1.7 vincent 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,
1.10 vincent 47: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x6X */
1.7 vincent 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,
1.10 vincent 51: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x7X */
1.7 vincent 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,
1.10 vincent 55: 0, 0, 0, 0, /* 0x8X */
1.2 millert 56: 0, 0, 0, 0,
57: 0, 0, 0, 0,
58: 0, 0, 0, 0,
1.10 vincent 59: 0, 0, 0, 0, /* 0x9X */
1.2 millert 60: 0, 0, 0, 0,
61: 0, 0, 0, 0,
62: 0, 0, 0, 0,
1.10 vincent 63: 0, 0, 0, 0, /* 0xAX */
1.2 millert 64: 0, 0, 0, 0,
65: 0, 0, 0, 0,
66: 0, 0, 0, 0,
1.10 vincent 67: 0, 0, 0, 0, /* 0xBX */
1.2 millert 68: 0, 0, 0, 0,
69: 0, 0, 0, 0,
70: 0, 0, 0, 0,
1.10 vincent 71: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xCX */
1.7 vincent 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,
1.10 vincent 75: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xDX */
1.7 vincent 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,
1.10 vincent 79: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xEX */
1.7 vincent 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,
1.10 vincent 83: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xFX */
1.7 vincent 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
1.1 deraadt 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
1.10 vincent 92: * '\0'. Returns NULL on failure.
1.1 deraadt 93: */
1.2 millert 94: char *
1.8 vincent 95: keyname(char *cp, size_t len, int k)
1.1 deraadt 96: {
1.8 vincent 97: const char *np;
1.11 db 98: size_t copied;
1.1 deraadt 99:
1.2 millert 100: if (k < 0)
1.11 db 101: k = CHARMASK(k); /* sign extended char */
1.2 millert 102: switch (k) {
103: case CCHR('@'):
1.4 art 104: np = "C-SPC";
1.2 millert 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;
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';
1.11 db 133: return (cp);
1.10 vincent 134: } else if (k < ' ') {
1.2 millert 135: *cp++ = 'C';
136: *cp++ = '-';
137: k = CCHR(k);
138: if (ISUPPER(k))
139: k = TOLOWER(k);
140: }
141: *cp++ = k;
1.1 deraadt 142: *cp = '\0';
1.11 db 143: return (cp);
1.2 millert 144: }
1.9 deraadt 145: copied = strlcpy(cp, np, len);
146: if (copied >= len)
147: copied = len - 1;
1.11 db 148: return (cp + copied);
1.1 deraadt 149: }