Annotation of src/usr.bin/mg/cinfo.c, Revision 1.16
1.16 ! lum 1: /* $OpenBSD: cinfo.c,v 1.15 2005/12/13 06:01:27 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.16 ! lum 22: /*
! 23: * Due to incompatible behaviour between "standard" emacs and
! 24: * ctags word traversing, '_' character's value is changed on
! 25: * the fly in ctags mode, hence non-const.
! 26: */
! 27: char cinfo[256] = {
1.10 vincent 28: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x0X */
1.7 vincent 29: _MG_C, _MG_C, _MG_C, _MG_C,
30: _MG_C, _MG_C, _MG_C, _MG_C,
31: _MG_C, _MG_C, _MG_C, _MG_C,
1.10 vincent 32: _MG_C, _MG_C, _MG_C, _MG_C, /* 0x1X */
1.7 vincent 33: _MG_C, _MG_C, _MG_C, _MG_C,
34: _MG_C, _MG_C, _MG_C, _MG_C,
35: _MG_C, _MG_C, _MG_C, _MG_C,
1.10 vincent 36: 0, _MG_P, 0, 0, /* 0x2X */
1.7 vincent 37: _MG_W, _MG_W, 0, _MG_W,
38: 0, 0, 0, 0,
39: 0, 0, _MG_P, 0,
1.10 vincent 40: _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, /* 0x3X */
1.7 vincent 41: _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,
42: _MG_D | _MG_W, _MG_D | _MG_W, 0, 0,
43: 0, 0, 0, _MG_P,
1.10 vincent 44: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x4X */
1.7 vincent 45: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
46: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
47: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
1.10 vincent 48: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x5X */
1.7 vincent 49: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
50: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, 0,
51: 0, 0, 0, 0,
1.10 vincent 52: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x6X */
1.7 vincent 53: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
54: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
55: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
1.10 vincent 56: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x7X */
1.7 vincent 57: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
58: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, 0,
59: 0, 0, 0, _MG_C,
1.10 vincent 60: 0, 0, 0, 0, /* 0x8X */
1.2 millert 61: 0, 0, 0, 0,
62: 0, 0, 0, 0,
63: 0, 0, 0, 0,
1.10 vincent 64: 0, 0, 0, 0, /* 0x9X */
1.2 millert 65: 0, 0, 0, 0,
66: 0, 0, 0, 0,
67: 0, 0, 0, 0,
1.10 vincent 68: 0, 0, 0, 0, /* 0xAX */
1.2 millert 69: 0, 0, 0, 0,
70: 0, 0, 0, 0,
71: 0, 0, 0, 0,
1.10 vincent 72: 0, 0, 0, 0, /* 0xBX */
1.2 millert 73: 0, 0, 0, 0,
74: 0, 0, 0, 0,
75: 0, 0, 0, 0,
1.10 vincent 76: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xCX */
1.7 vincent 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, _MG_U | _MG_W, _MG_U | _MG_W,
79: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
1.10 vincent 80: 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xDX */
1.7 vincent 81: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
82: _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
83: _MG_U | _MG_W, _MG_U | _MG_W, 0, _MG_W,
1.10 vincent 84: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xEX */
1.7 vincent 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, _MG_L | _MG_W, _MG_L | _MG_W,
87: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
1.10 vincent 88: 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xFX */
1.7 vincent 89: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
90: _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
91: _MG_L | _MG_W, _MG_L | _MG_W, 0, 0
1.1 deraadt 92: };
93:
94: /*
95: * Find the name of a keystroke. Needs to be changed to handle 8-bit printing
96: * characters and function keys better. Returns a pointer to the terminating
1.10 vincent 97: * '\0'. Returns NULL on failure.
1.1 deraadt 98: */
1.2 millert 99: char *
1.15 kjell 100: getkeyname(char *cp, size_t len, int k)
1.1 deraadt 101: {
1.14 deraadt 102: const char *np;
103: size_t copied;
1.1 deraadt 104:
1.2 millert 105: if (k < 0)
1.11 db 106: k = CHARMASK(k); /* sign extended char */
1.2 millert 107: switch (k) {
108: case CCHR('@'):
1.4 art 109: np = "C-SPC";
1.2 millert 110: break;
111: case CCHR('I'):
112: np = "TAB";
113: break;
114: case CCHR('M'):
115: np = "RET";
116: break;
117: case CCHR('['):
118: np = "ESC";
119: break;
120: case ' ':
121: np = "SPC";
122: break; /* yuck again */
123: case CCHR('?'):
124: np = "DEL";
125: break;
1.1 deraadt 126: default:
127: #ifdef FKEYS
1.2 millert 128: if (k >= KFIRST && k <= KLAST &&
1.1 deraadt 129: (np = keystrings[k - KFIRST]) != NULL)
1.2 millert 130: break;
1.1 deraadt 131: #endif
1.2 millert 132: if (k > CCHR('?')) {
133: *cp++ = '0';
134: *cp++ = ((k >> 6) & 7) + '0';
135: *cp++ = ((k >> 3) & 7) + '0';
136: *cp++ = (k & 7) + '0';
137: *cp = '\0';
1.11 db 138: return (cp);
1.10 vincent 139: } else if (k < ' ') {
1.2 millert 140: *cp++ = 'C';
141: *cp++ = '-';
142: k = CCHR(k);
143: if (ISUPPER(k))
144: k = TOLOWER(k);
145: }
146: *cp++ = k;
1.1 deraadt 147: *cp = '\0';
1.11 db 148: return (cp);
1.2 millert 149: }
1.9 deraadt 150: copied = strlcpy(cp, np, len);
151: if (copied >= len)
152: copied = len - 1;
1.11 db 153: return (cp + copied);
1.1 deraadt 154: }