1: #ifndef lint
   2: static char sccsid[] = "@(#)wwinit.c	3.26 5/1/86";
   3: #endif
   4: 
   5: /*
   6:  * Copyright (c) 1983 Regents of the University of California,
   7:  * All rights reserved.  Redistribution permitted subject to
   8:  * the terms of the Berkeley Software License Agreement.
   9:  */
  10: 
  11: #include "ww.h"
  12: #include "tt.h"
  13: #include <sys/signal.h>
  14: #include <fcntl.h>
  15: #include "char.h"
  16: 
  17: wwinit()
  18: {
  19:     register i, j;
  20:     char *kp;
  21:     register char **p, **q;
  22:     char **env, **termcap = 0;
  23:     extern char **environ;
  24:     int s;
  25: 
  26:     wwdtablesize = getdtablesize();
  27:     wwhead.ww_forw = &wwhead;
  28:     wwhead.ww_back = &wwhead;
  29: 
  30:     s = sigblock(sigmask(SIGIO));
  31:     if (signal(SIGIO, wwrint) == BADSIG)
  32:         return -1;
  33: 
  34:     if (wwgettty(0, &wwoldtty) < 0)
  35:         return -1;
  36:     wwwintty = wwoldtty;
  37:     wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
  38:     wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
  39:     wwnewtty.ww_sgttyb.sg_erase = -1;
  40:     wwnewtty.ww_sgttyb.sg_kill = -1;
  41:     wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
  42:     wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
  43:     wwnewtty.ww_tchars.t_intrc = -1;
  44:     wwnewtty.ww_tchars.t_quitc = -1;
  45:     wwnewtty.ww_tchars.t_startc = -1;
  46:     wwnewtty.ww_tchars.t_stopc = -1;
  47:     wwnewtty.ww_tchars.t_eofc = -1;
  48:     wwnewtty.ww_tchars.t_brkc = -1;
  49:     wwnewtty.ww_ltchars.t_suspc = -1;
  50:     wwnewtty.ww_ltchars.t_dsuspc = -1;
  51:     wwnewtty.ww_ltchars.t_rprntc = -1;
  52:     wwnewtty.ww_ltchars.t_flushc = -1;
  53:     wwnewtty.ww_ltchars.t_werasc = -1;
  54:     wwnewtty.ww_ltchars.t_lnextc = -1;
  55:     wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
  56:     wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
  57:     wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
  58:     if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
  59:         goto bad;
  60: 
  61:     if ((wwterm = getenv("TERM")) == 0) {
  62:         wwerrno = WWE_BADTERM;
  63:         goto bad;
  64:     }
  65:     if (tgetent(wwtermcap, wwterm) != 1) {
  66:         wwerrno = WWE_BADTERM;
  67:         goto bad;
  68:     }
  69:     wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
  70: 
  71:     if (ttinit() < 0)
  72:         goto bad;
  73:     wwnrow = tt.tt_nrow;
  74:     wwncol = tt.tt_ncol;
  75:     wwavailmodes = tt.tt_availmodes;
  76:     wwwrap = tt.tt_wrap;
  77:     (*tt.tt_init)();
  78: 
  79:     if (wwavailmodes & WWM_REV)
  80:         wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
  81:     else if (wwavailmodes & WWM_UL)
  82:         wwcursormodes = WWM_UL;
  83: 
  84:     if ((wwib = malloc((unsigned) 512)) == 0)
  85:         goto bad;
  86:     wwibe = wwib + 512;
  87:     wwibq = wwibp = wwib;
  88: 
  89:     if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
  90:         goto bad;
  91:     for (i = 0; i < wwnrow; i++)
  92:         for (j = 0; j < wwncol; j++)
  93:             wwsmap[i][j] = WWX_NOBODY;
  94: 
  95:     wwos = (union ww_char **)
  96:         wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
  97:     if (wwos == 0)
  98:         goto bad;
  99:     for (i = 0; i < wwnrow; i++)
 100:         for (j = 0; j < wwncol; j++)
 101:             wwos[i][j].c_w = ' ';
 102:     wwns = (union ww_char **)
 103:         wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
 104:     if (wwns == 0)
 105:         goto bad;
 106:     for (i = 0; i < wwnrow; i++)
 107:         for (j = 0; j < wwncol; j++)
 108:             wwns[i][j].c_w = ' ';
 109: 
 110:     wwtouched = malloc((unsigned) wwnrow);
 111:     if (wwtouched == 0) {
 112:         wwerrno = WWE_NOMEM;
 113:         goto bad;
 114:     }
 115:     for (i = 0; i < wwnrow; i++)
 116:         wwtouched[i] = 0;
 117: 
 118:     wwindex[WWX_NOBODY] = &wwnobody;
 119:     wwnobody.ww_order = NWW;
 120: 
 121:     kp = wwkeys;
 122:     wwaddcap("kb", &kp);
 123:     wwaddcap("ku", &kp);
 124:     wwaddcap("kd", &kp);
 125:     wwaddcap("kl", &kp);
 126:     wwaddcap("kr", &kp);
 127:     wwaddcap("kh", &kp);
 128:     if ((j = tgetnum("kn")) >= 0) {
 129:         char cap[32];
 130: 
 131:         (void) sprintf(kp, "kn#%d:", j);
 132:         for (; *kp; kp++)
 133:             ;
 134:         for (i = 1; i <= j; i++) {
 135:             (void) sprintf(cap, "k%d", i);
 136:             wwaddcap(cap, &kp);
 137:             cap[0] = 'l';
 138:             wwaddcap(cap, &kp);
 139:         }
 140:     }
 141:     for (i = 0, p = environ; *p++; i++)
 142:         ;
 143:     if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
 144:         goto bad;
 145:     for (p = environ, q = env; *p; p++, q++) {
 146:         if (strncmp(*p, "TERM=", 5) == 0)
 147:             *q = WWT_TERM;
 148:         else if (strncmp(*p, "TERMCAP=", 8) == 0)
 149:             termcap = q;
 150:         else
 151:             *q = *p;
 152:     }
 153:     *(termcap ? termcap : q++) = wwwintermcap;
 154:     *q = 0;
 155:     environ = env;
 156: 
 157:     (void) signal(SIGPIPE, SIG_IGN);
 158:     (void) sigsetmask(s);
 159:     return 0;
 160: bad:
 161:     /*
 162: 	 * Don't bother to free storage.  We're supposed
 163: 	 * to exit when wwinit fails anyway.
 164: 	 */
 165:     (void) wwsettty(0, &wwoldtty, &wwnewtty);
 166:     (void) signal(SIGIO, SIG_DFL);
 167:     (void) sigsetmask(s);
 168:     return -1;
 169: }
 170: 
 171: wwaddcap(cap, kp)
 172: register char *cap;
 173: register char **kp;
 174: {
 175:     char tbuf[512];
 176:     char *tp = tbuf;
 177:     register char *str, *p;
 178: 
 179:     if ((str = tgetstr(cap, &tp)) != 0) {
 180:         while (*(*kp)++ = *cap++)
 181:             ;
 182:         (*kp)[-1] = '=';
 183:         while (*str) {
 184:             for (p = unctrl(*str++); *(*kp)++ = *p++;)
 185:                 ;
 186:             (*kp)--;
 187:         }
 188:         *(*kp)++ = ':';
 189:         **kp = 0;
 190:     }
 191: }

Defined functions

wwaddcap defined in line 171; used 8 times
wwinit defined in line 17; used 1 times

Defined variables

sccsid defined in line 2; never used
Last modified: 1986-05-02
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1341
Valid CSS Valid XHTML 1.0 Strict