Annotation of 43BSDTahoe/ucb/window/wwinit.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1983 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)wwinit.c   3.31 (Berkeley) 6/29/88";
                     20: #endif /* not lint */
                     21: 
                     22: #include "ww.h"
                     23: #include "tt.h"
                     24: #include <sys/signal.h>
                     25: #include <fcntl.h>
                     26: #include "char.h"
                     27: 
                     28: wwinit()
                     29: {
                     30:        register i, j;
                     31:        char *kp;
                     32:        int s;
                     33: 
                     34:        wwdtablesize = getdtablesize();
                     35:        wwhead.ww_forw = &wwhead;
                     36:        wwhead.ww_back = &wwhead;
                     37: 
                     38:        s = sigblock(sigmask(SIGIO));
                     39:        if (signal(SIGIO, wwrint) == BADSIG)
                     40:                return -1;
                     41: 
                     42:        if (wwgettty(0, &wwoldtty) < 0)
                     43:                return -1;
                     44:        wwwintty = wwoldtty;
                     45:        wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
                     46:        wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
                     47:        wwnewtty.ww_sgttyb.sg_erase = -1;
                     48:        wwnewtty.ww_sgttyb.sg_kill = -1;
                     49:        wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
                     50:        wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
                     51:        wwnewtty.ww_tchars.t_intrc = -1;
                     52:        wwnewtty.ww_tchars.t_quitc = -1;
                     53:        wwnewtty.ww_tchars.t_startc = -1;
                     54:        wwnewtty.ww_tchars.t_stopc = -1;
                     55:        wwnewtty.ww_tchars.t_eofc = -1;
                     56:        wwnewtty.ww_tchars.t_brkc = -1;
                     57:        wwnewtty.ww_ltchars.t_suspc = -1;
                     58:        wwnewtty.ww_ltchars.t_dsuspc = -1;
                     59:        wwnewtty.ww_ltchars.t_rprntc = -1;
                     60:        wwnewtty.ww_ltchars.t_flushc = -1;
                     61:        wwnewtty.ww_ltchars.t_werasc = -1;
                     62:        wwnewtty.ww_ltchars.t_lnextc = -1;
                     63:        wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
                     64:        wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
                     65:        wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
                     66:        if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
                     67:                goto bad;
                     68: 
                     69:        if ((wwterm = getenv("TERM")) == 0) {
                     70:                wwerrno = WWE_BADTERM;
                     71:                goto bad;
                     72:        }
                     73:        if (tgetent(wwtermcap, wwterm) != 1) {
                     74:                wwerrno = WWE_BADTERM;
                     75:                goto bad;
                     76:        }
                     77:        wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
                     78: 
                     79:        if (ttinit() < 0)
                     80:                goto bad;
                     81:        wwnrow = tt.tt_nrow;
                     82:        wwncol = tt.tt_ncol;
                     83:        wwavailmodes = tt.tt_availmodes;
                     84:        wwwrap = tt.tt_wrap;
                     85:        (*tt.tt_init)();
                     86: 
                     87:        if (wwavailmodes & WWM_REV)
                     88:                wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
                     89:        else if (wwavailmodes & WWM_UL)
                     90:                wwcursormodes = WWM_UL;
                     91: 
                     92:        if ((wwib = malloc((unsigned) 512)) == 0)
                     93:                goto bad;
                     94:        wwibe = wwib + 512;
                     95:        wwibq = wwibp = wwib;
                     96: 
                     97:        if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
                     98:                goto bad;
                     99:        for (i = 0; i < wwnrow; i++)
                    100:                for (j = 0; j < wwncol; j++)
                    101:                        wwsmap[i][j] = WWX_NOBODY;
                    102: 
                    103:        wwos = (union ww_char **)
                    104:                wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
                    105:        if (wwos == 0)
                    106:                goto bad;
                    107:        for (i = 0; i < wwnrow; i++)
                    108:                for (j = 0; j < wwncol; j++)
                    109:                        wwos[i][j].c_w = ' ';
                    110:        wwns = (union ww_char **)
                    111:                wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
                    112:        if (wwns == 0)
                    113:                goto bad;
                    114:        for (i = 0; i < wwnrow; i++)
                    115:                for (j = 0; j < wwncol; j++)
                    116:                        wwns[i][j].c_w = ' ';
                    117: 
                    118:        wwtouched = malloc((unsigned) wwnrow);
                    119:        if (wwtouched == 0) {
                    120:                wwerrno = WWE_NOMEM;
                    121:                goto bad;
                    122:        }
                    123:        for (i = 0; i < wwnrow; i++)
                    124:                wwtouched[i] = 0;
                    125: 
                    126:        wwindex[WWX_NOBODY] = &wwnobody;
                    127:        wwnobody.ww_order = NWW;
                    128: 
                    129:        kp = wwwintermcap;
                    130:        if (wwavailmodes & WWM_REV)
                    131:                wwaddcap1(WWT_REV, &kp);
                    132:        if (wwavailmodes & WWM_BLK)
                    133:                wwaddcap1(WWT_BLK, &kp);
                    134:        if (wwavailmodes & WWM_UL)
                    135:                wwaddcap1(WWT_UL, &kp);
                    136:        if (wwavailmodes & WWM_GRP)
                    137:                wwaddcap1(WWT_GRP, &kp);
                    138:        if (wwavailmodes & WWM_DIM)
                    139:                wwaddcap1(WWT_DIM, &kp);
                    140:        if (wwavailmodes & WWM_USR)
                    141:                wwaddcap1(WWT_USR, &kp);
                    142:        if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll)
                    143:                wwaddcap1(WWT_ALDL, &kp);
                    144:        if (tt.tt_hasinsert)
                    145:                wwaddcap1(WWT_IMEI, &kp);
                    146:        if (tt.tt_delchar)
                    147:                wwaddcap1(WWT_DC, &kp);
                    148:        wwaddcap("kb", &kp);
                    149:        wwaddcap("ku", &kp);
                    150:        wwaddcap("kd", &kp);
                    151:        wwaddcap("kl", &kp);
                    152:        wwaddcap("kr", &kp);
                    153:        wwaddcap("kh", &kp);
                    154:        if ((j = tgetnum("kn")) >= 0) {
                    155:                char cap[32];
                    156: 
                    157:                (void) sprintf(kp, "kn#%d:", j);
                    158:                for (; *kp; kp++)
                    159:                        ;
                    160:                for (i = 1; i <= j; i++) {
                    161:                        (void) sprintf(cap, "k%d", i);
                    162:                        wwaddcap(cap, &kp);
                    163:                        cap[0] = 'l';
                    164:                        wwaddcap(cap, &kp);
                    165:                }
                    166:        }
                    167:        /*
                    168:         * It's ok to do this here even if setenv() is destructive
                    169:         * since tt_init() has already made its own copy of it and
                    170:         * wwterm now points to the copy.
                    171:         */
                    172:        (void) setenv("TERM", WWT_TERM, 1);
                    173: 
                    174:        (void) signal(SIGPIPE, SIG_IGN);
                    175:        (void) sigsetmask(s);
                    176:        return 0;
                    177: bad:
                    178:        /*
                    179:         * Don't bother to free storage.  We're supposed
                    180:         * to exit when wwinit fails anyway.
                    181:         */
                    182:        (void) wwsettty(0, &wwoldtty, &wwnewtty);
                    183:        (void) signal(SIGIO, SIG_DFL);
                    184:        (void) sigsetmask(s);
                    185:        return -1;
                    186: }
                    187: 
                    188: wwaddcap(cap, kp)
                    189:        register char *cap;
                    190:        register char **kp;
                    191: {
                    192:        char tbuf[512];
                    193:        char *tp = tbuf;
                    194:        register char *str, *p;
                    195: 
                    196:        if ((str = tgetstr(cap, &tp)) != 0) {
                    197:                while (*(*kp)++ = *cap++)
                    198:                        ;
                    199:                (*kp)[-1] = '=';
                    200:                while (*str) {
                    201:                        for (p = unctrl(*str++); *(*kp)++ = *p++;)
                    202:                                ;
                    203:                        (*kp)--;
                    204:                }
                    205:                *(*kp)++ = ':';
                    206:                **kp = 0;
                    207:        }
                    208: }
                    209: 
                    210: wwaddcap1(cap, kp)
                    211:        register char *cap;
                    212:        register char **kp;
                    213: {
                    214:        while (*(*kp)++ = *cap++)
                    215:                ;
                    216:        (*kp)--;
                    217: }

unix.superglobalmegacorp.com

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