113925Sedward #ifndef lint 2*14662Sedward static char *sccsid = "@(#)wwinit.c 3.4 83/08/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); 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 3414407Sedward if ((wwterm = getenv("TERM")) == 0) 3514407Sedward goto bad; 3614407Sedward if (tgetent(wwtermcap, wwterm) != 1) 3714407Sedward goto bad; 3814407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 3914407Sedward 4014407Sedward if (ttinit() < 0) 4114407Sedward goto bad; 4214407Sedward wwnrow = tt.tt_nrow; 4314407Sedward wwncol = tt.tt_ncol; 4414649Sedward (*tt.tt_init)(); 4514407Sedward 4614407Sedward if ((wwsmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0) 4714407Sedward goto bad; 4814407Sedward for (i = 0; i < wwnrow; i++) 4914407Sedward for (j = 0; j < wwncol; j++) 5014407Sedward wwsmap[i][j] = WWX_NOBODY; 5114591Sedward if ((wwfmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0) 5214591Sedward goto bad; 5314591Sedward for (i = 0; i < wwnrow; i++) 5414591Sedward for (j = 0; j < wwncol; j++) 5514591Sedward wwfmap[i][j] = 0; 5614591Sedward 5714407Sedward wwos = (union ww_char **) 5814407Sedward wwalloc(wwnrow, wwncol, sizeof (union ww_char)); 5914407Sedward if (wwos == 0) 6014407Sedward goto bad; 6114407Sedward for (i = 0; i < wwnrow; i++) 6214407Sedward for (j = 0; j < wwncol; j++) 6314407Sedward wwos[i][j].c_w = ' '; 6414407Sedward wwns = (union ww_char **) 6514407Sedward wwalloc(wwnrow, wwncol, sizeof (union ww_char)); 6614407Sedward if (wwns == 0) 6714407Sedward goto bad; 6814407Sedward for (i = 0; i < wwnrow; i++) 6914407Sedward for (j = 0; j < wwncol; j++) 7014407Sedward wwns[i][j].c_w = ' '; 7114407Sedward 72*14662Sedward wwtouched = malloc((unsigned) wwnrow); 73*14662Sedward if (wwtouched == 0) 74*14662Sedward goto bad; 75*14662Sedward for (i = 0; i < wwnrow; i++) 76*14662Sedward wwtouched[i] = 0; 77*14662Sedward 7814407Sedward wwindex[WWX_NOBODY] = &wwnobody; 7914407Sedward wwnobody.ww_order = NWW; 8014407Sedward 8114135Sedward addcap("kb"); 8214135Sedward addcap("ku"); 8314135Sedward addcap("kd"); 8414135Sedward addcap("kl"); 8514135Sedward addcap("kr"); 8614135Sedward addcap("kh"); 8714135Sedward if ((kn = tgetnum("kn")) >= 0) { 8814135Sedward char cap[5]; 8914135Sedward int i; 9014135Sedward 9114407Sedward (void) sprintf(kp, "kn#%d:", kn); 9214135Sedward for (; *kp; kp++) 9314135Sedward ; 9414135Sedward for (i = 1; i <= kn; i++) { 9514407Sedward (void) sprintf(cap, "k%d", i); 9614135Sedward addcap(cap); 9714135Sedward cap[0] = 'l'; 9814135Sedward addcap(cap); 9914135Sedward } 10014135Sedward } 10113962Sedward return 0; 10214407Sedward bad: 103*14662Sedward /* 104*14662Sedward * Don't bother to free storage. We're supposed 105*14662Sedward * to exit when wwinit fails anyway. 106*14662Sedward */ 10714407Sedward (void) wwsettty(0, &wwoldtty); 10814407Sedward return -1; 10913925Sedward } 11014135Sedward 11114407Sedward static 11214135Sedward addcap(cap) 11314135Sedward register char *cap; 11414135Sedward { 11514407Sedward char tbuf[512]; 11614407Sedward char *tp = tbuf; 11714287Sedward register char *str, *p; 11814135Sedward 11914135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 12014135Sedward while (*kp++ = *cap++) 12114135Sedward ; 12214135Sedward kp[-1] = '='; 12314287Sedward while (*str) { 12414287Sedward for (p = unctrl(*str++); *kp++ = *p++;) 12514287Sedward ; 12614287Sedward kp--; 12714287Sedward } 12814287Sedward *kp++ = ':'; 12914135Sedward *kp = 0; 13014135Sedward } 13114135Sedward } 132