[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.9

1.9     ! deraadt     1: /*     $OpenBSD: cinfo.c,v 1.8 2002/03/11 13:02:56 vincent 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.7       vincent    21:        _MG_C, _MG_C, _MG_C, _MG_C,             /* 0x0X */
                     22:        _MG_C, _MG_C, _MG_C, _MG_C,
                     23:        _MG_C, _MG_C, _MG_C, _MG_C,
                     24:        _MG_C, _MG_C, _MG_C, _MG_C,
                     25:        _MG_C, _MG_C, _MG_C, _MG_C,             /* 0x1X */
                     26:        _MG_C, _MG_C, _MG_C, _MG_C,
                     27:        _MG_C, _MG_C, _MG_C, _MG_C,
                     28:        _MG_C, _MG_C, _MG_C, _MG_C,
                     29:        0, _MG_P, 0, 0,         /* 0x2X */
                     30:        _MG_W, _MG_W, 0, _MG_W,
                     31:        0, 0, 0, 0,
                     32:        0, 0, _MG_P, 0,
                     33:        _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,     /* 0x3X */
                     34:        _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,
                     35:        _MG_D | _MG_W, _MG_D | _MG_W, 0, 0,
                     36:        0, 0, 0, _MG_P,
                     37:        0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0x4X */
                     38:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     39:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     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,     /* 0x5X */
                     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, 0,
                     44:        0, 0, 0, 0,
                     45:        0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0x6X */
                     46:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     47:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     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,     /* 0x7X */
                     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, 0,
                     52:        0, 0, 0, _MG_C,
1.2       millert    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,
1.7       vincent    69:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,     /* 0xCX */
                     70:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     71:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     72:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     73:        0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, /* 0xDX */
                     74:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     75:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,
                     76:        _MG_U | _MG_W, _MG_U | _MG_W, 0, _MG_W,
                     77:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,     /* 0xEX */
                     78:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     79:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     80:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     81:        0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, /* 0xFX */
                     82:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     83:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,
                     84:        _MG_L | _MG_W, _MG_L | _MG_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.8       vincent    93: keyname(char *cp, size_t len, int k)
1.1       deraadt    94: {
1.8       vincent    95:        const char  *np;
1.9     ! deraadt    96:        size_t copied;
1.1       deraadt    97:
1.2       millert    98:        if (k < 0)
                     99:                k = CHARMASK(k);/* sign extended char */
                    100:        switch (k) {
                    101:        case CCHR('@'):
1.4       art       102:                np = "C-SPC";
1.2       millert   103:                break;
                    104:        case CCHR('I'):
                    105:                np = "TAB";
                    106:                break;
                    107:        case CCHR('J'):
                    108:                np = "LFD";
                    109:                break;          /* yuck, but that's what GNU calls it */
                    110:        case CCHR('M'):
                    111:                np = "RET";
                    112:                break;
                    113:        case CCHR('['):
                    114:                np = "ESC";
                    115:                break;
                    116:        case ' ':
                    117:                np = "SPC";
                    118:                break;          /* yuck again */
                    119:        case CCHR('?'):
                    120:                np = "DEL";
                    121:                break;
1.1       deraadt   122:        default:
                    123: #ifdef FKEYS
1.2       millert   124:                if (k >= KFIRST && k <= KLAST &&
1.1       deraadt   125:                    (np = keystrings[k - KFIRST]) != NULL)
1.2       millert   126:                        break;
1.1       deraadt   127: #endif
1.2       millert   128:                if (k > CCHR('?')) {
                    129:                        *cp++ = '0';
                    130:                        *cp++ = ((k >> 6) & 7) + '0';
                    131:                        *cp++ = ((k >> 3) & 7) + '0';
                    132:                        *cp++ = (k & 7) + '0';
                    133:                        *cp = '\0';
                    134:                        return cp;
                    135:                }
                    136:                if (k < ' ') {
                    137:                        *cp++ = 'C';
                    138:                        *cp++ = '-';
                    139:                        k = CCHR(k);
                    140:                        if (ISUPPER(k))
                    141:                                k = TOLOWER(k);
                    142:                }
                    143:                *cp++ = k;
1.1       deraadt   144:                *cp = '\0';
                    145:                return cp;
1.2       millert   146:        }
1.9     ! deraadt   147:        copied = strlcpy(cp, np, len);
        !           148:        if (copied >= len)
        !           149:                copied = len - 1;
        !           150:        return cp + copied;
1.1       deraadt   151: }