118727Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 533514Sbostic * Redistribution and use in source and binary forms are permitted 634909Sbostic * provided that the above copyright notice and this paragraph are 734909Sbostic * duplicated in all such forms and that any documentation, 834909Sbostic * advertising materials, and other materials related to such 934909Sbostic * distribution and use acknowledge that the software was developed 1034909Sbostic * by the University of California, Berkeley. The name of the 1134909Sbostic * University may not be used to endorse or promote products derived 1234909Sbostic * from this software without specific prior written permission. 1334909Sbostic * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1434909Sbostic * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1534909Sbostic * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1618727Sedward */ 1718727Sedward 1833514Sbostic #ifndef lint 19*39338Sedward static char sccsid[] = "@(#)wwinit.c 3.36 (Berkeley) 10/19/89"; 2033514Sbostic #endif /* not lint */ 2133514Sbostic 2213925Sedward #include "ww.h" 2314649Sedward #include "tt.h" 2416111Sedward #include <sys/signal.h> 2516111Sedward #include <fcntl.h> 2616309Sedward #include "char.h" 2713925Sedward 2813925Sedward wwinit() 2913925Sedward { 3014407Sedward register i, j; 3116231Sedward char *kp; 3216398Sedward int s; 3313962Sedward 3414407Sedward wwdtablesize = getdtablesize(); 3516231Sedward wwhead.ww_forw = &wwhead; 3616231Sedward wwhead.ww_back = &wwhead; 3716111Sedward 3816398Sedward s = sigblock(sigmask(SIGIO)); 3938563Sedward if (signal(SIGIO, wwrint) == BADSIG || 4038563Sedward signal(SIGCHLD, wwchild) == BADSIG || 4138563Sedward signal(SIGPIPE, SIG_IGN) == BADSIG) { 4238563Sedward wwerrno = WWE_SYS; 4316111Sedward return -1; 4438563Sedward } 4516111Sedward 4613962Sedward if (wwgettty(0, &wwoldtty) < 0) 4713962Sedward return -1; 4814295Sedward wwwintty = wwoldtty; 4914295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 5016231Sedward wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; 5116231Sedward wwnewtty.ww_sgttyb.sg_erase = -1; 5216231Sedward wwnewtty.ww_sgttyb.sg_kill = -1; 5313962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 5413972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 5516231Sedward wwnewtty.ww_tchars.t_intrc = -1; 5616231Sedward wwnewtty.ww_tchars.t_quitc = -1; 5716231Sedward wwnewtty.ww_tchars.t_startc = -1; 5816231Sedward wwnewtty.ww_tchars.t_stopc = -1; 5916231Sedward wwnewtty.ww_tchars.t_eofc = -1; 6016231Sedward wwnewtty.ww_tchars.t_brkc = -1; 6116231Sedward wwnewtty.ww_ltchars.t_suspc = -1; 6216231Sedward wwnewtty.ww_ltchars.t_dsuspc = -1; 6316231Sedward wwnewtty.ww_ltchars.t_rprntc = -1; 6416231Sedward wwnewtty.ww_ltchars.t_flushc = -1; 6516231Sedward wwnewtty.ww_ltchars.t_werasc = -1; 6616231Sedward wwnewtty.ww_ltchars.t_lnextc = -1; 6716231Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; 6816231Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 6916231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 7017407Sedward if (wwsettty(0, &wwnewtty, &wwoldtty) < 0) 7114407Sedward goto bad; 7214135Sedward 7314851Sedward if ((wwterm = getenv("TERM")) == 0) { 7414851Sedward wwerrno = WWE_BADTERM; 7514407Sedward goto bad; 7614851Sedward } 7714851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 7814851Sedward wwerrno = WWE_BADTERM; 7914407Sedward goto bad; 8014851Sedward } 8114407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 8214407Sedward 8338563Sedward if (xxinit() < 0) 8414407Sedward goto bad; 8514407Sedward wwnrow = tt.tt_nrow; 8614407Sedward wwncol = tt.tt_ncol; 8714684Sedward wwavailmodes = tt.tt_availmodes; 8814696Sedward wwwrap = tt.tt_wrap; 8914407Sedward 9014763Sedward if (wwavailmodes & WWM_REV) 9114763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 9214763Sedward else if (wwavailmodes & WWM_UL) 9314763Sedward wwcursormodes = WWM_UL; 9414763Sedward 9515870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 9615870Sedward goto bad; 9715870Sedward wwibe = wwib + 512; 9816111Sedward wwibq = wwibp = wwib; 9915870Sedward 10014985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 10114407Sedward goto bad; 10214407Sedward for (i = 0; i < wwnrow; i++) 10314407Sedward for (j = 0; j < wwncol; j++) 10414407Sedward wwsmap[i][j] = WWX_NOBODY; 10514591Sedward 10614407Sedward wwos = (union ww_char **) 10714985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 10814407Sedward if (wwos == 0) 10914407Sedward goto bad; 11014407Sedward for (i = 0; i < wwnrow; i++) 11114407Sedward for (j = 0; j < wwncol; j++) 11214407Sedward wwos[i][j].c_w = ' '; 11314407Sedward wwns = (union ww_char **) 11414985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 11514407Sedward if (wwns == 0) 11614407Sedward goto bad; 11714407Sedward for (i = 0; i < wwnrow; i++) 11814407Sedward for (j = 0; j < wwncol; j++) 11914407Sedward wwns[i][j].c_w = ' '; 12014407Sedward 12114662Sedward wwtouched = malloc((unsigned) wwnrow); 12214851Sedward if (wwtouched == 0) { 12314851Sedward wwerrno = WWE_NOMEM; 12414662Sedward goto bad; 12514851Sedward } 12614662Sedward for (i = 0; i < wwnrow; i++) 12714662Sedward wwtouched[i] = 0; 12814662Sedward 12935330Sedward wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd); 13035330Sedward if (wwupd == 0) { 13135330Sedward wwerrno = WWE_NOMEM; 13235330Sedward goto bad; 13335330Sedward } 13435330Sedward 13514407Sedward wwindex[WWX_NOBODY] = &wwnobody; 13614407Sedward wwnobody.ww_order = NWW; 13714407Sedward 13834803Sedward kp = wwwintermcap; 13934803Sedward if (wwavailmodes & WWM_REV) 14034803Sedward wwaddcap1(WWT_REV, &kp); 14134803Sedward if (wwavailmodes & WWM_BLK) 14234803Sedward wwaddcap1(WWT_BLK, &kp); 14334803Sedward if (wwavailmodes & WWM_UL) 14434803Sedward wwaddcap1(WWT_UL, &kp); 14534803Sedward if (wwavailmodes & WWM_GRP) 14634803Sedward wwaddcap1(WWT_GRP, &kp); 14734803Sedward if (wwavailmodes & WWM_DIM) 14834803Sedward wwaddcap1(WWT_DIM, &kp); 14934803Sedward if (wwavailmodes & WWM_USR) 15034803Sedward wwaddcap1(WWT_USR, &kp); 15134803Sedward if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll) 15234803Sedward wwaddcap1(WWT_ALDL, &kp); 153*39338Sedward if (tt.tt_inschar) 15434803Sedward wwaddcap1(WWT_IMEI, &kp); 155*39338Sedward if (tt.tt_insspace) 156*39338Sedward wwaddcap1(WWT_IC, &kp); 15734803Sedward if (tt.tt_delchar) 15834803Sedward wwaddcap1(WWT_DC, &kp); 15916494Sedward wwaddcap("kb", &kp); 16016494Sedward wwaddcap("ku", &kp); 16116494Sedward wwaddcap("kd", &kp); 16216494Sedward wwaddcap("kl", &kp); 16316494Sedward wwaddcap("kr", &kp); 16416494Sedward wwaddcap("kh", &kp); 16516231Sedward if ((j = tgetnum("kn")) >= 0) { 16616231Sedward char cap[32]; 16714135Sedward 16816231Sedward (void) sprintf(kp, "kn#%d:", j); 16914135Sedward for (; *kp; kp++) 17014135Sedward ; 17116231Sedward for (i = 1; i <= j; i++) { 17214407Sedward (void) sprintf(cap, "k%d", i); 17316494Sedward wwaddcap(cap, &kp); 17414135Sedward cap[0] = 'l'; 17516494Sedward wwaddcap(cap, &kp); 17614135Sedward } 17714135Sedward } 17832322Sedward /* 17932322Sedward * It's ok to do this here even if setenv() is destructive 18032322Sedward * since tt_init() has already made its own copy of it and 18132322Sedward * wwterm now points to the copy. 18232322Sedward */ 18333758Sedward (void) setenv("TERM", WWT_TERM, 1); 18416231Sedward 18516398Sedward (void) sigsetmask(s); 18638563Sedward /* catch typeahead before ASYNC was set */ 18738563Sedward (void) kill(getpid(), SIGIO); 18838563Sedward xxstart(); 18913962Sedward return 0; 19014407Sedward bad: 19114662Sedward /* 19214662Sedward * Don't bother to free storage. We're supposed 19314662Sedward * to exit when wwinit fails anyway. 19414662Sedward */ 19517407Sedward (void) wwsettty(0, &wwoldtty, &wwnewtty); 19616111Sedward (void) signal(SIGIO, SIG_DFL); 19716398Sedward (void) sigsetmask(s); 19814407Sedward return -1; 19913925Sedward } 20014135Sedward 20116494Sedward wwaddcap(cap, kp) 20234803Sedward register char *cap; 20334803Sedward register char **kp; 20414135Sedward { 20514407Sedward char tbuf[512]; 20614407Sedward char *tp = tbuf; 20714287Sedward register char *str, *p; 20814135Sedward 20914135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 21016231Sedward while (*(*kp)++ = *cap++) 21114135Sedward ; 21216231Sedward (*kp)[-1] = '='; 21314287Sedward while (*str) { 21416231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 21514287Sedward ; 21616231Sedward (*kp)--; 21714287Sedward } 21816231Sedward *(*kp)++ = ':'; 21916231Sedward **kp = 0; 22014135Sedward } 22114135Sedward } 22234803Sedward 22334803Sedward wwaddcap1(cap, kp) 22434803Sedward register char *cap; 22534803Sedward register char **kp; 22634803Sedward { 22734803Sedward while (*(*kp)++ = *cap++) 22834803Sedward ; 22934803Sedward (*kp)--; 23034803Sedward } 231