Annotation of 43BSDTahoe/ucb/window/wwinit.c, revision 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.