113925Sedward #ifndef lint 2*14851Sedward static char *sccsid = "@(#)wwinit.c 3.9 83/08/26"; 313925Sedward #endif 413925Sedward 513925Sedward #include "ww.h" 614649Sedward #include "tt.h" 713925Sedward 814407Sedward static char *kp = wwkeys; 914454Sedward extern char _sobuf[]; 1013925Sedward 1113925Sedward wwinit() 1213925Sedward { 1314407Sedward register i, j; 1414135Sedward int kn; 1513962Sedward 1614454Sedward setbuf(stdout, _sobuf); 1714407Sedward wwdtablesize = getdtablesize(); 1813962Sedward if (wwgettty(0, &wwoldtty) < 0) 1913962Sedward return -1; 2014295Sedward wwwintty = wwoldtty; 2114295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 2213962Sedward wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags; 2313962Sedward wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed; 2413962Sedward wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed; 2513962Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode; 2613962Sedward wwnewtty.ww_pgrp = wwoldtty.ww_pgrp; 2713962Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 2813962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 2913972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 3013962Sedward wwnewtty.ww_lmode |= LLITOUT; 3113962Sedward if (wwsettty(0, &wwnewtty) < 0) 3214407Sedward goto bad; 3314135Sedward 34*14851Sedward if ((wwterm = getenv("TERM")) == 0) { 35*14851Sedward wwerrno = WWE_BADTERM; 3614407Sedward goto bad; 37*14851Sedward } 38*14851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 39*14851Sedward wwerrno = WWE_BADTERM; 4014407Sedward goto bad; 41*14851Sedward } 4214407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 4314407Sedward 4414407Sedward if (ttinit() < 0) 4514407Sedward goto bad; 4614407Sedward wwnrow = tt.tt_nrow; 4714407Sedward wwncol = tt.tt_ncol; 4814684Sedward wwavailmodes = tt.tt_availmodes; 4914696Sedward wwwrap = tt.tt_wrap; 5014649Sedward (*tt.tt_init)(); 5114407Sedward 5214763Sedward if (wwavailmodes & WWM_REV) 5314763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 5414763Sedward else if (wwavailmodes & WWM_UL) 5514763Sedward wwcursormodes = WWM_UL; 5614763Sedward 5714407Sedward if ((wwsmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0) 5814407Sedward goto bad; 5914407Sedward for (i = 0; i < wwnrow; i++) 6014407Sedward for (j = 0; j < wwncol; j++) 6114407Sedward wwsmap[i][j] = WWX_NOBODY; 6214591Sedward 6314407Sedward wwos = (union ww_char **) 6414407Sedward wwalloc(wwnrow, wwncol, sizeof (union ww_char)); 6514407Sedward if (wwos == 0) 6614407Sedward goto bad; 6714407Sedward for (i = 0; i < wwnrow; i++) 6814407Sedward for (j = 0; j < wwncol; j++) 6914407Sedward wwos[i][j].c_w = ' '; 7014407Sedward wwns = (union ww_char **) 7114407Sedward wwalloc(wwnrow, wwncol, sizeof (union ww_char)); 7214407Sedward if (wwns == 0) 7314407Sedward goto bad; 7414407Sedward for (i = 0; i < wwnrow; i++) 7514407Sedward for (j = 0; j < wwncol; j++) 7614407Sedward wwns[i][j].c_w = ' '; 7714407Sedward 7814662Sedward wwtouched = malloc((unsigned) wwnrow); 79*14851Sedward if (wwtouched == 0) { 80*14851Sedward wwerrno = WWE_NOMEM; 8114662Sedward goto bad; 82*14851Sedward } 8314662Sedward for (i = 0; i < wwnrow; i++) 8414662Sedward wwtouched[i] = 0; 8514662Sedward 8614407Sedward wwindex[WWX_NOBODY] = &wwnobody; 8714407Sedward wwnobody.ww_order = NWW; 8814407Sedward 8914135Sedward addcap("kb"); 9014135Sedward addcap("ku"); 9114135Sedward addcap("kd"); 9214135Sedward addcap("kl"); 9314135Sedward addcap("kr"); 9414135Sedward addcap("kh"); 9514135Sedward if ((kn = tgetnum("kn")) >= 0) { 9614135Sedward char cap[5]; 9714135Sedward int i; 9814135Sedward 9914407Sedward (void) sprintf(kp, "kn#%d:", kn); 10014135Sedward for (; *kp; kp++) 10114135Sedward ; 10214135Sedward for (i = 1; i <= kn; i++) { 10314407Sedward (void) sprintf(cap, "k%d", i); 10414135Sedward addcap(cap); 10514135Sedward cap[0] = 'l'; 10614135Sedward addcap(cap); 10714135Sedward } 10814135Sedward } 10913962Sedward return 0; 11014407Sedward bad: 11114662Sedward /* 11214662Sedward * Don't bother to free storage. We're supposed 11314662Sedward * to exit when wwinit fails anyway. 11414662Sedward */ 11514407Sedward (void) wwsettty(0, &wwoldtty); 11614407Sedward return -1; 11713925Sedward } 11814135Sedward 11914407Sedward static 12014135Sedward addcap(cap) 12114135Sedward register char *cap; 12214135Sedward { 12314407Sedward char tbuf[512]; 12414407Sedward char *tp = tbuf; 12514287Sedward register char *str, *p; 12614135Sedward 12714135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 12814135Sedward while (*kp++ = *cap++) 12914135Sedward ; 13014135Sedward kp[-1] = '='; 13114287Sedward while (*str) { 13214287Sedward for (p = unctrl(*str++); *kp++ = *p++;) 13314287Sedward ; 13414287Sedward kp--; 13514287Sedward } 13614287Sedward *kp++ = ':'; 13714135Sedward *kp = 0; 13814135Sedward } 13914135Sedward } 140