Annotation of 3BSD/cmd/ex/ex_tty.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: #include "ex.h"
                      3: #include "ex_tty.h"
                      4: 
                      5: /*
                      6:  * Terminal type initialization routines,
                      7:  * and calculation of flags at entry or after
                      8:  * a shell escape which may change them.
                      9:  */
                     10: short  ospeed = -1;
                     11: 
                     12: gettmode()
                     13: {
                     14: 
                     15:        if (gtty(1, &tty) < 0)
                     16:                return;
                     17:        if (ospeed != tty.sg_ospeed)
                     18:                value(SLOWOPEN) = tty.sg_ospeed < B1200;
                     19:        ospeed = tty.sg_ospeed;
                     20:        normf = tty.sg_flags;
                     21:        UPPERCASE = (tty.sg_flags & LCASE) != 0;
                     22:        GT = (tty.sg_flags & XTABS) != XTABS && !XT;
                     23:        NONL = (tty.sg_flags & CRMOD) == 0;
                     24: }
                     25: 
                     26: char *xPC;
                     27: char **sstrs[] = {
                     28:        &AL, &BC, &BT, &CD, &CE, &CL, &CM, &DC, &DL, &DM, &DO, &ED, &EI,
                     29:        &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9,
                     30:        &HO, &IC, &IM, &IP, &KD, &KE, &KH, &KL, &KR, &KS, &KU, &LL,
                     31:        &ND, &xPC, &SE, &SF, &SO, &SR, &TA, &TE, &TI, &UP, &VB, &VS, &VE
                     32: };
                     33: bool *sflags[] = {
                     34:        &AM, &BS, &DA, &DB, &EO, &HC, &HZ, &IN, &MI, &NC, &OS, &UL, &XN, &XT
                     35: };
                     36: char **fkeys[10] = {
                     37:        &F0, &F1, &F2, &F3, &F4, &F5, &F6, &F7, &F8, &F9
                     38: };
                     39: setterm(type)
                     40:        char *type;
                     41: {
                     42:        char *cgoto();
                     43:        register int unknown, i;
                     44:        register int l;
                     45:        char ltcbuf[TCBUFSIZE];
                     46: 
                     47:        if (type[0] == 0)
                     48:                type = "xx";
                     49:        unknown = 0;
                     50:        putpad(TE);
                     51:        if (tgetent(ltcbuf, type) != 1) {
                     52:                unknown++;
                     53:                CP(genbuf, "xx|dumb:");
                     54:        }
                     55:        i = LINES = tgetnum("li");
                     56:        if (LINES <= 5)
                     57:                LINES = 24;
                     58:        if (LINES > 48)
                     59:                LINES = 48;
                     60:        l = LINES;
                     61:        if (ospeed < B1200)
                     62:                l /= 2;
                     63:        else if (ospeed < B2400)
                     64:                l = (l * 2) / 3;
                     65:        aoftspace = tspace;
                     66:        zap();
                     67:        /*
                     68:         * Initialize keypad arrow keys.
                     69:         */
                     70:        arrows[0].cap = KU; arrows[0].mapto = "k"; arrows[0].descr = "up";
                     71:        arrows[1].cap = KD; arrows[1].mapto = "j"; arrows[1].descr = "down";
                     72:        arrows[2].cap = KL; arrows[2].mapto = "h"; arrows[2].descr = "left";
                     73:        arrows[3].cap = KR; arrows[3].mapto = "l"; arrows[3].descr = "right";
                     74:        arrows[4].cap = KH; arrows[4].mapto = "H"; arrows[4].descr = "home";
                     75: 
                     76:        options[WINDOW].ovalue = options[WINDOW].odefault = l - 1;
                     77:        if (defwind) options[WINDOW].ovalue = defwind;
                     78:        options[SCROLL].ovalue = options[SCROLL].odefault = HC ? 11 : ((l-1) / 2);
                     79:        COLUMNS = tgetnum("co");
                     80:        if (COLUMNS <= 20)
                     81:                COLUMNS = 1000;
                     82:        if (cgoto()[0] == 'O')  /* OOPS */
                     83:                CA = 0, CM = 0;
                     84:        else
                     85:                CA = 1, costCM = strlen(tgoto(CM, 8, 10));
                     86:        PC = xPC ? xPC[0] : 0;
                     87:        aoftspace = tspace;
                     88:        CP(ttytype, longname(genbuf, type));
                     89:        if (i <= 0)
                     90:                LINES = 2;
                     91:        /* proper strings to change tty type */
                     92: #ifdef notdef
                     93:        /* Taken out because we don't allow it. See ex_set.c for reasons. */
                     94:        if (inopen)
                     95:                putpad(VE);
                     96: #endif
                     97:        termreset();
                     98:        gettmode();
                     99:        value(REDRAW) = AL && DL;
                    100:        value(OPTIMIZE) = !CA && !GT;
                    101:        if (unknown)
                    102:                serror("%s: Unknown terminal type", type);
                    103: }
                    104: 
                    105: zap()
                    106: {
                    107:        register char *namp;
                    108:        register bool **fp;
                    109:        register char ***sp;
                    110: 
                    111:        namp = "ambsdadbeohchzinmincosulxnxt";
                    112:        fp = sflags;
                    113:        do {
                    114:                *(*fp++) = tgetflag(namp);
                    115:                namp += 2;
                    116:        } while (*namp);
                    117:        namp = "albcbtcdceclcmdcdldmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullndpcsesfsosrtatetiupvbvsve";
                    118:        sp = sstrs;
                    119:        do {
                    120:                *(*sp++) = tgetstr(namp, &aoftspace);
                    121:                namp += 2;
                    122:        } while (*namp);
                    123: }
                    124: 
                    125: char *
                    126: longname(bp, def)
                    127:        register char *bp;
                    128:        char *def;
                    129: {
                    130:        register char *cp;
                    131: 
                    132:        while (*bp && *bp != ':' && *bp != '|')
                    133:                bp++;
                    134:        if (*bp == '|') {
                    135:                bp++;
                    136:                cp = bp;
                    137:                while (*cp && *cp != ':' && *cp != '|')
                    138:                        cp++;
                    139:                *cp = 0;
                    140:                return (bp);
                    141:        }
                    142:        return (def);
                    143: }
                    144: 
                    145: char *
                    146: fkey(i)
                    147:        int i;
                    148: {
                    149:        if (0 <= i && i <= 9)
                    150:                return(*fkeys[i]);
                    151:        else
                    152:                return(NOSTR);
                    153: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.