[BACK]Return to cinfo.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / mg

Annotation of src/usr.bin/mg/cinfo.c, Revision 1.6

1.6     ! mickey      1: /*     $OpenBSD: cinfo.c,v 1.5 2001/05/23 22:20:35 art 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.2       millert    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
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.6     ! mickey     93: keyname(cp, len, k)
        !            94:        char    *cp;
        !            95:        size_t  len;
        !            96:        int     k;
1.1       deraadt    97: {
1.2       millert    98:        char  *np;
1.1       deraadt    99:
1.2       millert   100:        if (k < 0)
                    101:                k = CHARMASK(k);/* sign extended char */
                    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('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;
1.1       deraadt   124:        default:
                    125: #ifdef FKEYS
1.2       millert   126:                if (k >= KFIRST && k <= KLAST &&
1.1       deraadt   127:                    (np = keystrings[k - KFIRST]) != NULL)
1.2       millert   128:                        break;
1.1       deraadt   129: #endif
1.2       millert   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;
1.1       deraadt   146:                *cp = '\0';
                    147:                return cp;
1.2       millert   148:        }
1.6     ! mickey    149:        return cp + strlcpy(cp, np, len);
1.1       deraadt   150: }