1 /* $OpenBSD: cinfo.c,v 1.15 2005/12/13 06:01:27 kjell Exp $ */ 2 3 /* This file is in the public domain. */ 4 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 */ 22 const char cinfo[256] = { 23 _MG_C, _MG_C, _MG_C, _MG_C, /* 0x0X */ 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, 27 _MG_C, _MG_C, _MG_C, _MG_C, /* 0x1X */ 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, 31 0, _MG_P, 0, 0, /* 0x2X */ 32 _MG_W, _MG_W, 0, _MG_W, 33 0, 0, 0, 0, 34 0, 0, _MG_P, 0, 35 _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, /* 0x3X */ 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, 39 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x4X */ 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, 43 _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x5X */ 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, 47 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x6X */ 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, 51 _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x7X */ 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, 55 0, 0, 0, 0, /* 0x8X */ 56 0, 0, 0, 0, 57 0, 0, 0, 0, 58 0, 0, 0, 0, 59 0, 0, 0, 0, /* 0x9X */ 60 0, 0, 0, 0, 61 0, 0, 0, 0, 62 0, 0, 0, 0, 63 0, 0, 0, 0, /* 0xAX */ 64 0, 0, 0, 0, 65 0, 0, 0, 0, 66 0, 0, 0, 0, 67 0, 0, 0, 0, /* 0xBX */ 68 0, 0, 0, 0, 69 0, 0, 0, 0, 70 0, 0, 0, 0, 71 _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xCX */ 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, 75 0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xDX */ 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, 79 _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xEX */ 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, 83 0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xFX */ 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 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 92 * '\0'. Returns NULL on failure. 93 */ 94 char * 95 getkeyname(char *cp, size_t len, int k) 96 { 97 const char *np; 98 size_t copied; 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('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; 121 default: 122 #ifdef FKEYS 123 if (k >= KFIRST && k <= KLAST && 124 (np = keystrings[k - KFIRST]) != NULL) 125 break; 126 #endif 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'; 133 return (cp); 134 } else if (k < ' ') { 135 *cp++ = 'C'; 136 *cp++ = '-'; 137 k = CCHR(k); 138 if (ISUPPER(k)) 139 k = TOLOWER(k); 140 } 141 *cp++ = k; 142 *cp = '\0'; 143 return (cp); 144 } 145 copied = strlcpy(cp, np, len); 146 if (copied >= len) 147 copied = len - 1; 148 return (cp + copied); 149 } 150