[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.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: }