# 2.11BSD#431 - /usr/src/ucb/window/wwinit.c

##### Functions

    wwaddcap          X
    wwinit            X

       1: #if !defined(lint) && defined(DOSCCS)
       2: static char sccsid[] = "@(#)wwinit.c	3.26.1 1996/3/22";
       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 = (char *)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 = (char *)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

- in line 122-127(6), 136-138(2)

wwinit defined in line 17; used 1 times

- in /usr/src/ucb/window/main.c line 102

#### Defined variables

sccsid defined in line 2; never used

Last modified: 1996-03-23 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 779 |