113925Sedward #ifndef lint 2*16231Sedward static char *sccsid = "@(#)wwinit.c 3.16 84/03/23"; 313925Sedward #endif 413925Sedward 513925Sedward #include "ww.h" 614649Sedward #include "tt.h" 716111Sedward #include <sys/signal.h> 816111Sedward #include <fcntl.h> 913925Sedward 1013925Sedward wwinit() 1113925Sedward { 1214407Sedward register i, j; 13*16231Sedward char *kp; 14*16231Sedward register char **p, **q; 15*16231Sedward char **env, **termcap; 16*16231Sedward extern char **environ; 1713962Sedward 1815361Sedward #ifndef O_4_1A 1914407Sedward wwdtablesize = getdtablesize(); 2015361Sedward #else 2115361Sedward #include <sys/param.h> 2215361Sedward wwdtablesize = NOFILE; 2315361Sedward #endif 24*16231Sedward wwhead.ww_forw = &wwhead; 25*16231Sedward wwhead.ww_back = &wwhead; 2616111Sedward 2716111Sedward if (signal(SIGIO, wwrint) == BADSIG) 2816111Sedward return -1; 2916111Sedward (void) sighold(SIGIO); 3016111Sedward 3113962Sedward if (wwgettty(0, &wwoldtty) < 0) 3213962Sedward return -1; 3314295Sedward wwwintty = wwoldtty; 3414295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 35*16231Sedward wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; 36*16231Sedward wwnewtty.ww_sgttyb.sg_erase = -1; 37*16231Sedward wwnewtty.ww_sgttyb.sg_kill = -1; 3813962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 3913972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 40*16231Sedward wwnewtty.ww_tchars.t_intrc = -1; 41*16231Sedward wwnewtty.ww_tchars.t_quitc = -1; 42*16231Sedward wwnewtty.ww_tchars.t_startc = -1; 43*16231Sedward wwnewtty.ww_tchars.t_stopc = -1; 44*16231Sedward wwnewtty.ww_tchars.t_eofc = -1; 45*16231Sedward wwnewtty.ww_tchars.t_brkc = -1; 46*16231Sedward wwnewtty.ww_ltchars.t_suspc = -1; 47*16231Sedward wwnewtty.ww_ltchars.t_dsuspc = -1; 48*16231Sedward wwnewtty.ww_ltchars.t_rprntc = -1; 49*16231Sedward wwnewtty.ww_ltchars.t_flushc = -1; 50*16231Sedward wwnewtty.ww_ltchars.t_werasc = -1; 51*16231Sedward wwnewtty.ww_ltchars.t_lnextc = -1; 52*16231Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; 53*16231Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 54*16231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 55*16231Sedward 5613962Sedward if (wwsettty(0, &wwnewtty) < 0) 5714407Sedward goto bad; 5814135Sedward 5914851Sedward if ((wwterm = getenv("TERM")) == 0) { 6014851Sedward wwerrno = WWE_BADTERM; 6114407Sedward goto bad; 6214851Sedward } 6314851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 6414851Sedward wwerrno = WWE_BADTERM; 6514407Sedward goto bad; 6614851Sedward } 6714407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 6814407Sedward 6914407Sedward if (ttinit() < 0) 7014407Sedward goto bad; 7114407Sedward wwnrow = tt.tt_nrow; 7214407Sedward wwncol = tt.tt_ncol; 7314684Sedward wwavailmodes = tt.tt_availmodes; 7414696Sedward wwwrap = tt.tt_wrap; 7514649Sedward (*tt.tt_init)(); 7614407Sedward 7714763Sedward if (wwavailmodes & WWM_REV) 7814763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 7914763Sedward else if (wwavailmodes & WWM_UL) 8014763Sedward wwcursormodes = WWM_UL; 8114763Sedward 8215870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 8315870Sedward goto bad; 8415870Sedward wwibe = wwib + 512; 8516111Sedward wwibq = wwibp = wwib; 8615870Sedward 8714985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 8814407Sedward goto bad; 8914407Sedward for (i = 0; i < wwnrow; i++) 9014407Sedward for (j = 0; j < wwncol; j++) 9114407Sedward wwsmap[i][j] = WWX_NOBODY; 9214591Sedward 9314407Sedward wwos = (union ww_char **) 9414985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 9514407Sedward if (wwos == 0) 9614407Sedward goto bad; 9714407Sedward for (i = 0; i < wwnrow; i++) 9814407Sedward for (j = 0; j < wwncol; j++) 9914407Sedward wwos[i][j].c_w = ' '; 10014407Sedward wwns = (union ww_char **) 10114985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 10214407Sedward if (wwns == 0) 10314407Sedward goto bad; 10414407Sedward for (i = 0; i < wwnrow; i++) 10514407Sedward for (j = 0; j < wwncol; j++) 10614407Sedward wwns[i][j].c_w = ' '; 10714407Sedward 10814662Sedward wwtouched = malloc((unsigned) wwnrow); 10914851Sedward if (wwtouched == 0) { 11014851Sedward wwerrno = WWE_NOMEM; 11114662Sedward goto bad; 11214851Sedward } 11314662Sedward for (i = 0; i < wwnrow; i++) 11414662Sedward wwtouched[i] = 0; 11514662Sedward 11614407Sedward wwindex[WWX_NOBODY] = &wwnobody; 11714407Sedward wwnobody.ww_order = NWW; 11814407Sedward 119*16231Sedward kp = wwkeys; 120*16231Sedward addcap("kb", &kp); 121*16231Sedward addcap("ku", &kp); 122*16231Sedward addcap("kd", &kp); 123*16231Sedward addcap("kl", &kp); 124*16231Sedward addcap("kr", &kp); 125*16231Sedward addcap("kh", &kp); 126*16231Sedward if ((j = tgetnum("kn")) >= 0) { 127*16231Sedward char cap[32]; 12814135Sedward int i; 12914135Sedward 130*16231Sedward (void) sprintf(kp, "kn#%d:", j); 13114135Sedward for (; *kp; kp++) 13214135Sedward ; 133*16231Sedward for (i = 1; i <= j; i++) { 13414407Sedward (void) sprintf(cap, "k%d", i); 135*16231Sedward addcap(cap, &kp); 13614135Sedward cap[0] = 'l'; 137*16231Sedward addcap(cap, &kp); 13814135Sedward } 13914135Sedward } 140*16231Sedward for (i = 0, p = environ; *p++; i++) 141*16231Sedward ; 142*16231Sedward if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0) 143*16231Sedward goto bad; 144*16231Sedward for (p = environ, q = env; *p; p++, q++) { 145*16231Sedward if (strncmp(*p, "TERM=", 5) == 0) 146*16231Sedward *q = WWT_TERM; 147*16231Sedward else if (strncmp(*p, "TERMCAP=", 8) == 0) 148*16231Sedward termcap = q; 149*16231Sedward else 150*16231Sedward *q = *p; 151*16231Sedward } 152*16231Sedward *(termcap ? termcap : q++) = wwwintermcap; 153*16231Sedward *q = 0; 154*16231Sedward environ = env; 155*16231Sedward 15616111Sedward (void) sigrelse(SIGIO); 15713962Sedward return 0; 15814407Sedward bad: 15914662Sedward /* 16014662Sedward * Don't bother to free storage. We're supposed 16114662Sedward * to exit when wwinit fails anyway. 16214662Sedward */ 16314407Sedward (void) wwsettty(0, &wwoldtty); 16416111Sedward (void) signal(SIGIO, SIG_DFL); 16516111Sedward (void) sigrelse(SIGIO); 16614407Sedward return -1; 16713925Sedward } 16814135Sedward 16914407Sedward static 170*16231Sedward addcap(cap, kp) 17114135Sedward register char *cap; 172*16231Sedward register char **kp; 17314135Sedward { 17414407Sedward char tbuf[512]; 17514407Sedward char *tp = tbuf; 17614287Sedward register char *str, *p; 17714135Sedward 17814135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 179*16231Sedward while (*(*kp)++ = *cap++) 18014135Sedward ; 181*16231Sedward (*kp)[-1] = '='; 18214287Sedward while (*str) { 183*16231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 18414287Sedward ; 185*16231Sedward (*kp)--; 18614287Sedward } 187*16231Sedward *(*kp)++ = ':'; 188*16231Sedward **kp = 0; 18914135Sedward } 19014135Sedward } 191