113925Sedward #ifndef lint 2*17407Sedward static char sccsid[] = "@(#)wwinit.c 3.22 11/20/84"; 313925Sedward #endif 413925Sedward 513925Sedward #include "ww.h" 614649Sedward #include "tt.h" 716111Sedward #include <sys/signal.h> 816111Sedward #include <fcntl.h> 916309Sedward #include "char.h" 1013925Sedward 1113925Sedward wwinit() 1213925Sedward { 1314407Sedward register i, j; 1416231Sedward char *kp; 1516231Sedward register char **p, **q; 1617397Sedward char **env, **termcap = 0; 1716231Sedward extern char **environ; 1816398Sedward int s; 1913962Sedward 2014407Sedward wwdtablesize = getdtablesize(); 2116231Sedward wwhead.ww_forw = &wwhead; 2216231Sedward wwhead.ww_back = &wwhead; 2316111Sedward 2416398Sedward s = sigblock(sigmask(SIGIO)); 2516111Sedward if (signal(SIGIO, wwrint) == BADSIG) 2616111Sedward return -1; 2716111Sedward 2813962Sedward if (wwgettty(0, &wwoldtty) < 0) 2913962Sedward return -1; 3014295Sedward wwwintty = wwoldtty; 3114295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 3216231Sedward wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; 3316231Sedward wwnewtty.ww_sgttyb.sg_erase = -1; 3416231Sedward wwnewtty.ww_sgttyb.sg_kill = -1; 3513962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 3613972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 3716231Sedward wwnewtty.ww_tchars.t_intrc = -1; 3816231Sedward wwnewtty.ww_tchars.t_quitc = -1; 3916231Sedward wwnewtty.ww_tchars.t_startc = -1; 4016231Sedward wwnewtty.ww_tchars.t_stopc = -1; 4116231Sedward wwnewtty.ww_tchars.t_eofc = -1; 4216231Sedward wwnewtty.ww_tchars.t_brkc = -1; 4316231Sedward wwnewtty.ww_ltchars.t_suspc = -1; 4416231Sedward wwnewtty.ww_ltchars.t_dsuspc = -1; 4516231Sedward wwnewtty.ww_ltchars.t_rprntc = -1; 4616231Sedward wwnewtty.ww_ltchars.t_flushc = -1; 4716231Sedward wwnewtty.ww_ltchars.t_werasc = -1; 4816231Sedward wwnewtty.ww_ltchars.t_lnextc = -1; 4916231Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; 5016231Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 5116231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 52*17407Sedward if (wwsettty(0, &wwnewtty, &wwoldtty) < 0) 5314407Sedward goto bad; 5414135Sedward 5514851Sedward if ((wwterm = getenv("TERM")) == 0) { 5614851Sedward wwerrno = WWE_BADTERM; 5714407Sedward goto bad; 5814851Sedward } 5914851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 6014851Sedward wwerrno = WWE_BADTERM; 6114407Sedward goto bad; 6214851Sedward } 6314407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 6414407Sedward 6514407Sedward if (ttinit() < 0) 6614407Sedward goto bad; 6714407Sedward wwnrow = tt.tt_nrow; 6814407Sedward wwncol = tt.tt_ncol; 6914684Sedward wwavailmodes = tt.tt_availmodes; 7014696Sedward wwwrap = tt.tt_wrap; 7114649Sedward (*tt.tt_init)(); 7214407Sedward 7314763Sedward if (wwavailmodes & WWM_REV) 7414763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 7514763Sedward else if (wwavailmodes & WWM_UL) 7614763Sedward wwcursormodes = WWM_UL; 7714763Sedward 7815870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 7915870Sedward goto bad; 8015870Sedward wwibe = wwib + 512; 8116111Sedward wwibq = wwibp = wwib; 8215870Sedward 8314985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 8414407Sedward goto bad; 8514407Sedward for (i = 0; i < wwnrow; i++) 8614407Sedward for (j = 0; j < wwncol; j++) 8714407Sedward wwsmap[i][j] = WWX_NOBODY; 8814591Sedward 8914407Sedward wwos = (union ww_char **) 9014985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 9114407Sedward if (wwos == 0) 9214407Sedward goto bad; 9314407Sedward for (i = 0; i < wwnrow; i++) 9414407Sedward for (j = 0; j < wwncol; j++) 9514407Sedward wwos[i][j].c_w = ' '; 9614407Sedward wwns = (union ww_char **) 9714985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 9814407Sedward if (wwns == 0) 9914407Sedward goto bad; 10014407Sedward for (i = 0; i < wwnrow; i++) 10114407Sedward for (j = 0; j < wwncol; j++) 10214407Sedward wwns[i][j].c_w = ' '; 10314407Sedward 10414662Sedward wwtouched = malloc((unsigned) wwnrow); 10514851Sedward if (wwtouched == 0) { 10614851Sedward wwerrno = WWE_NOMEM; 10714662Sedward goto bad; 10814851Sedward } 10914662Sedward for (i = 0; i < wwnrow; i++) 11014662Sedward wwtouched[i] = 0; 11114662Sedward 11214407Sedward wwindex[WWX_NOBODY] = &wwnobody; 11314407Sedward wwnobody.ww_order = NWW; 11414407Sedward 11516231Sedward kp = wwkeys; 11616494Sedward wwaddcap("kb", &kp); 11716494Sedward wwaddcap("ku", &kp); 11816494Sedward wwaddcap("kd", &kp); 11916494Sedward wwaddcap("kl", &kp); 12016494Sedward wwaddcap("kr", &kp); 12116494Sedward wwaddcap("kh", &kp); 12216231Sedward if ((j = tgetnum("kn")) >= 0) { 12316231Sedward char cap[32]; 12414135Sedward int i; 12514135Sedward 12616231Sedward (void) sprintf(kp, "kn#%d:", j); 12714135Sedward for (; *kp; kp++) 12814135Sedward ; 12916231Sedward for (i = 1; i <= j; i++) { 13014407Sedward (void) sprintf(cap, "k%d", i); 13116494Sedward wwaddcap(cap, &kp); 13214135Sedward cap[0] = 'l'; 13316494Sedward wwaddcap(cap, &kp); 13414135Sedward } 13514135Sedward } 13616231Sedward for (i = 0, p = environ; *p++; i++) 13716231Sedward ; 13816231Sedward if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0) 13916231Sedward goto bad; 14016231Sedward for (p = environ, q = env; *p; p++, q++) { 14116231Sedward if (strncmp(*p, "TERM=", 5) == 0) 14216231Sedward *q = WWT_TERM; 14316231Sedward else if (strncmp(*p, "TERMCAP=", 8) == 0) 14416231Sedward termcap = q; 14516231Sedward else 14616231Sedward *q = *p; 14716231Sedward } 14816231Sedward *(termcap ? termcap : q++) = wwwintermcap; 14916231Sedward *q = 0; 15016231Sedward environ = env; 15116231Sedward 15216494Sedward (void) signal(SIGPIPE, SIG_IGN); 15316398Sedward (void) sigsetmask(s); 15413962Sedward return 0; 15514407Sedward bad: 15614662Sedward /* 15714662Sedward * Don't bother to free storage. We're supposed 15814662Sedward * to exit when wwinit fails anyway. 15914662Sedward */ 160*17407Sedward (void) wwsettty(0, &wwoldtty, &wwnewtty); 16116111Sedward (void) signal(SIGIO, SIG_DFL); 16216398Sedward (void) sigsetmask(s); 16314407Sedward return -1; 16413925Sedward } 16514135Sedward 16616494Sedward wwaddcap(cap, kp) 16714135Sedward register char *cap; 16816231Sedward register char **kp; 16914135Sedward { 17014407Sedward char tbuf[512]; 17114407Sedward char *tp = tbuf; 17214287Sedward register char *str, *p; 17314135Sedward 17414135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 17516231Sedward while (*(*kp)++ = *cap++) 17614135Sedward ; 17716231Sedward (*kp)[-1] = '='; 17814287Sedward while (*str) { 17916231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 18014287Sedward ; 18116231Sedward (*kp)--; 18214287Sedward } 18316231Sedward *(*kp)++ = ':'; 18416231Sedward **kp = 0; 18514135Sedward } 18614135Sedward } 187