113925Sedward #ifndef lint 2*15870Sedward static char *sccsid = "@(#)wwinit.c 3.14 84/01/16"; 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); 1715361Sedward #ifndef O_4_1A 1814407Sedward wwdtablesize = getdtablesize(); 1915361Sedward #else 2015361Sedward #include <sys/param.h> 2115361Sedward wwdtablesize = NOFILE; 2215361Sedward #endif 2313962Sedward if (wwgettty(0, &wwoldtty) < 0) 2413962Sedward return -1; 2514295Sedward wwwintty = wwoldtty; 2614295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 2713962Sedward wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags; 2813962Sedward wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed; 2913962Sedward wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed; 3013962Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode; 3113962Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 3213962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 3313972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 3413962Sedward wwnewtty.ww_lmode |= LLITOUT; 3513962Sedward if (wwsettty(0, &wwnewtty) < 0) 3614407Sedward goto bad; 3714135Sedward 3814851Sedward if ((wwterm = getenv("TERM")) == 0) { 3914851Sedward wwerrno = WWE_BADTERM; 4014407Sedward goto bad; 4114851Sedward } 4214851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 4314851Sedward wwerrno = WWE_BADTERM; 4414407Sedward goto bad; 4514851Sedward } 4614407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 4714407Sedward 4814407Sedward if (ttinit() < 0) 4914407Sedward goto bad; 5014407Sedward wwnrow = tt.tt_nrow; 5114407Sedward wwncol = tt.tt_ncol; 5214684Sedward wwavailmodes = tt.tt_availmodes; 5314696Sedward wwwrap = tt.tt_wrap; 5414649Sedward (*tt.tt_init)(); 5514407Sedward 5614763Sedward if (wwavailmodes & WWM_REV) 5714763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 5814763Sedward else if (wwavailmodes & WWM_UL) 5914763Sedward wwcursormodes = WWM_UL; 6014763Sedward 61*15870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 62*15870Sedward goto bad; 63*15870Sedward wwibe = wwib + 512; 64*15870Sedward wwibp = wwib; 65*15870Sedward wwibc = 0; 66*15870Sedward 6714985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 6814407Sedward goto bad; 6914407Sedward for (i = 0; i < wwnrow; i++) 7014407Sedward for (j = 0; j < wwncol; j++) 7114407Sedward wwsmap[i][j] = WWX_NOBODY; 7214591Sedward 7314407Sedward wwos = (union ww_char **) 7414985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 7514407Sedward if (wwos == 0) 7614407Sedward goto bad; 7714407Sedward for (i = 0; i < wwnrow; i++) 7814407Sedward for (j = 0; j < wwncol; j++) 7914407Sedward wwos[i][j].c_w = ' '; 8014407Sedward wwns = (union ww_char **) 8114985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 8214407Sedward if (wwns == 0) 8314407Sedward goto bad; 8414407Sedward for (i = 0; i < wwnrow; i++) 8514407Sedward for (j = 0; j < wwncol; j++) 8614407Sedward wwns[i][j].c_w = ' '; 8714407Sedward 8814662Sedward wwtouched = malloc((unsigned) wwnrow); 8914851Sedward if (wwtouched == 0) { 9014851Sedward wwerrno = WWE_NOMEM; 9114662Sedward goto bad; 9214851Sedward } 9314662Sedward for (i = 0; i < wwnrow; i++) 9414662Sedward wwtouched[i] = 0; 9514662Sedward 9614407Sedward wwindex[WWX_NOBODY] = &wwnobody; 9714407Sedward wwnobody.ww_order = NWW; 9814407Sedward 9914135Sedward addcap("kb"); 10014135Sedward addcap("ku"); 10114135Sedward addcap("kd"); 10214135Sedward addcap("kl"); 10314135Sedward addcap("kr"); 10414135Sedward addcap("kh"); 10514135Sedward if ((kn = tgetnum("kn")) >= 0) { 10614135Sedward char cap[5]; 10714135Sedward int i; 10814135Sedward 10914407Sedward (void) sprintf(kp, "kn#%d:", kn); 11014135Sedward for (; *kp; kp++) 11114135Sedward ; 11214135Sedward for (i = 1; i <= kn; i++) { 11314407Sedward (void) sprintf(cap, "k%d", i); 11414135Sedward addcap(cap); 11514135Sedward cap[0] = 'l'; 11614135Sedward addcap(cap); 11714135Sedward } 11814135Sedward } 11913962Sedward return 0; 12014407Sedward bad: 12114662Sedward /* 12214662Sedward * Don't bother to free storage. We're supposed 12314662Sedward * to exit when wwinit fails anyway. 12414662Sedward */ 12514407Sedward (void) wwsettty(0, &wwoldtty); 12614407Sedward return -1; 12713925Sedward } 12814135Sedward 12914407Sedward static 13014135Sedward addcap(cap) 13114135Sedward register char *cap; 13214135Sedward { 13314407Sedward char tbuf[512]; 13414407Sedward char *tp = tbuf; 13514287Sedward register char *str, *p; 13614135Sedward 13714135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 13814135Sedward while (*kp++ = *cap++) 13914135Sedward ; 14014135Sedward kp[-1] = '='; 14114287Sedward while (*str) { 14214287Sedward for (p = unctrl(*str++); *kp++ = *p++;) 14314287Sedward ; 14414287Sedward kp--; 14514287Sedward } 14614287Sedward *kp++ = ':'; 14714135Sedward *kp = 0; 14814135Sedward } 14914135Sedward } 150