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