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

1.13    ! kjell       1: /*     $OpenBSD: cinfo.c,v 1.12 2005/06/14 18:14:40 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.6       mickey     22: const char cinfo[256] = {
1.10      vincent    23:        _MG_C, _MG_C, _MG_C, _MG_C,                                   /* 0x0X */
1.7       vincent    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,
1.10      vincent    27:        _MG_C, _MG_C, _MG_C, _MG_C,                                   /* 0x1X */
1.7       vincent    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,
1.10      vincent    31:        0, _MG_P, 0, 0,                                               /* 0x2X */
1.7       vincent    32:        _MG_W, _MG_W, 0, _MG_W,
                     33:        0, 0, 0, 0,
                     34:        0, 0, _MG_P, 0,
1.10      vincent    35:        _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W, _MG_D | _MG_W,   /* 0x3X */
1.7       vincent    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,
1.10      vincent    39:        0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,               /* 0x4X */
1.7       vincent    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,
1.10      vincent    43:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0x5X */
1.7       vincent    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,
1.10      vincent    47:        0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,               /* 0x6X */
1.7       vincent    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,
1.10      vincent    51:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0x7X */
1.7       vincent    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,
1.10      vincent    55:        0, 0, 0, 0,                                                   /* 0x8X */
1.2       millert    56:        0, 0, 0, 0,
                     57:        0, 0, 0, 0,
                     58:        0, 0, 0, 0,
1.10      vincent    59:        0, 0, 0, 0,                                                   /* 0x9X */
1.2       millert    60:        0, 0, 0, 0,
                     61:        0, 0, 0, 0,
                     62:        0, 0, 0, 0,
1.10      vincent    63:        0, 0, 0, 0,                                                   /* 0xAX */
1.2       millert    64:        0, 0, 0, 0,
                     65:        0, 0, 0, 0,
                     66:        0, 0, 0, 0,
1.10      vincent    67:        0, 0, 0, 0,                                                   /* 0xBX */
1.2       millert    68:        0, 0, 0, 0,
                     69:        0, 0, 0, 0,
                     70:        0, 0, 0, 0,
1.10      vincent    71:        _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,   /* 0xCX */
1.7       vincent    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,
1.10      vincent    75:        0, _MG_U | _MG_W, _MG_U | _MG_W, _MG_U | _MG_W,               /* 0xDX */
1.7       vincent    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,
1.10      vincent    79:        _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,   /* 0xEX */
1.7       vincent    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,
1.10      vincent    83:        0, _MG_L | _MG_W, _MG_L | _MG_W, _MG_L | _MG_W,               /* 0xFX */
1.7       vincent    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
1.1       deraadt    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
1.10      vincent    92:  * '\0'.  Returns NULL on failure.
1.1       deraadt    93:  */
1.2       millert    94: char *
1.8       vincent    95: keyname(char *cp, size_t len, int k)
1.1       deraadt    96: {
1.8       vincent    97:        const char  *np;
1.11      db         98:        size_t       copied;
1.1       deraadt    99:
1.2       millert   100:        if (k < 0)
1.11      db        101:                k = CHARMASK(k);        /* sign extended char */
1.2       millert   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('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;
1.1       deraadt   121:        default:
                    122: #ifdef FKEYS
1.2       millert   123:                if (k >= KFIRST && k <= KLAST &&
1.1       deraadt   124:                    (np = keystrings[k - KFIRST]) != NULL)
1.2       millert   125:                        break;
1.1       deraadt   126: #endif
1.2       millert   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';
1.11      db        133:                        return (cp);
1.10      vincent   134:                } else if (k < ' ') {
1.2       millert   135:                        *cp++ = 'C';
                    136:                        *cp++ = '-';
                    137:                        k = CCHR(k);
                    138:                        if (ISUPPER(k))
                    139:                                k = TOLOWER(k);
                    140:                }
                    141:                *cp++ = k;
1.1       deraadt   142:                *cp = '\0';
1.11      db        143:                return (cp);
1.2       millert   144:        }
1.9       deraadt   145:        copied = strlcpy(cp, np, len);
                    146:        if (copied >= len)
                    147:                copied = len - 1;
1.11      db        148:        return (cp + copied);
1.1       deraadt   149: }