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 633514Sbostic * provided that this notice is preserved and that due credit is given 733514Sbostic * to the University of California at Berkeley. The name of the University 833514Sbostic * may not be used to endorse or promote products derived from this 933514Sbostic * software without specific prior written permission. This software 1033514Sbostic * is provided ``as is'' without express or implied warranty. 1118727Sedward */ 1218727Sedward 1333514Sbostic #ifndef lint 14*33758Sedward static char sccsid[] = "@(#)wwinit.c 3.29 (Berkeley) 03/19/88"; 1533514Sbostic #endif /* not lint */ 1633514Sbostic 1713925Sedward #include "ww.h" 1814649Sedward #include "tt.h" 1916111Sedward #include <sys/signal.h> 2016111Sedward #include <fcntl.h> 2116309Sedward #include "char.h" 2213925Sedward 2313925Sedward wwinit() 2413925Sedward { 2514407Sedward register i, j; 2616231Sedward char *kp; 2716398Sedward int s; 2813962Sedward 2914407Sedward wwdtablesize = getdtablesize(); 3016231Sedward wwhead.ww_forw = &wwhead; 3116231Sedward wwhead.ww_back = &wwhead; 3216111Sedward 3316398Sedward s = sigblock(sigmask(SIGIO)); 3416111Sedward if (signal(SIGIO, wwrint) == BADSIG) 3516111Sedward return -1; 3616111Sedward 3713962Sedward if (wwgettty(0, &wwoldtty) < 0) 3813962Sedward return -1; 3914295Sedward wwwintty = wwoldtty; 4014295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 4116231Sedward wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; 4216231Sedward wwnewtty.ww_sgttyb.sg_erase = -1; 4316231Sedward wwnewtty.ww_sgttyb.sg_kill = -1; 4413962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 4513972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 4616231Sedward wwnewtty.ww_tchars.t_intrc = -1; 4716231Sedward wwnewtty.ww_tchars.t_quitc = -1; 4816231Sedward wwnewtty.ww_tchars.t_startc = -1; 4916231Sedward wwnewtty.ww_tchars.t_stopc = -1; 5016231Sedward wwnewtty.ww_tchars.t_eofc = -1; 5116231Sedward wwnewtty.ww_tchars.t_brkc = -1; 5216231Sedward wwnewtty.ww_ltchars.t_suspc = -1; 5316231Sedward wwnewtty.ww_ltchars.t_dsuspc = -1; 5416231Sedward wwnewtty.ww_ltchars.t_rprntc = -1; 5516231Sedward wwnewtty.ww_ltchars.t_flushc = -1; 5616231Sedward wwnewtty.ww_ltchars.t_werasc = -1; 5716231Sedward wwnewtty.ww_ltchars.t_lnextc = -1; 5816231Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; 5916231Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 6016231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 6117407Sedward if (wwsettty(0, &wwnewtty, &wwoldtty) < 0) 6214407Sedward goto bad; 6314135Sedward 6414851Sedward if ((wwterm = getenv("TERM")) == 0) { 6514851Sedward wwerrno = WWE_BADTERM; 6614407Sedward goto bad; 6714851Sedward } 6814851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 6914851Sedward wwerrno = WWE_BADTERM; 7014407Sedward goto bad; 7114851Sedward } 7214407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 7314407Sedward 7414407Sedward if (ttinit() < 0) 7514407Sedward goto bad; 7614407Sedward wwnrow = tt.tt_nrow; 7714407Sedward wwncol = tt.tt_ncol; 7814684Sedward wwavailmodes = tt.tt_availmodes; 7914696Sedward wwwrap = tt.tt_wrap; 8014649Sedward (*tt.tt_init)(); 8114407Sedward 8214763Sedward if (wwavailmodes & WWM_REV) 8314763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 8414763Sedward else if (wwavailmodes & WWM_UL) 8514763Sedward wwcursormodes = WWM_UL; 8614763Sedward 8715870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 8815870Sedward goto bad; 8915870Sedward wwibe = wwib + 512; 9016111Sedward wwibq = wwibp = wwib; 9115870Sedward 9214985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 9314407Sedward goto bad; 9414407Sedward for (i = 0; i < wwnrow; i++) 9514407Sedward for (j = 0; j < wwncol; j++) 9614407Sedward wwsmap[i][j] = WWX_NOBODY; 9714591Sedward 9814407Sedward wwos = (union ww_char **) 9914985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 10014407Sedward if (wwos == 0) 10114407Sedward goto bad; 10214407Sedward for (i = 0; i < wwnrow; i++) 10314407Sedward for (j = 0; j < wwncol; j++) 10414407Sedward wwos[i][j].c_w = ' '; 10514407Sedward wwns = (union ww_char **) 10614985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 10714407Sedward if (wwns == 0) 10814407Sedward goto bad; 10914407Sedward for (i = 0; i < wwnrow; i++) 11014407Sedward for (j = 0; j < wwncol; j++) 11114407Sedward wwns[i][j].c_w = ' '; 11214407Sedward 11314662Sedward wwtouched = malloc((unsigned) wwnrow); 11414851Sedward if (wwtouched == 0) { 11514851Sedward wwerrno = WWE_NOMEM; 11614662Sedward goto bad; 11714851Sedward } 11814662Sedward for (i = 0; i < wwnrow; i++) 11914662Sedward wwtouched[i] = 0; 12014662Sedward 12114407Sedward wwindex[WWX_NOBODY] = &wwnobody; 12214407Sedward wwnobody.ww_order = NWW; 12314407Sedward 12416231Sedward kp = wwkeys; 12516494Sedward wwaddcap("kb", &kp); 12616494Sedward wwaddcap("ku", &kp); 12716494Sedward wwaddcap("kd", &kp); 12816494Sedward wwaddcap("kl", &kp); 12916494Sedward wwaddcap("kr", &kp); 13016494Sedward wwaddcap("kh", &kp); 13116231Sedward if ((j = tgetnum("kn")) >= 0) { 13216231Sedward char cap[32]; 13314135Sedward 13416231Sedward (void) sprintf(kp, "kn#%d:", j); 13514135Sedward for (; *kp; kp++) 13614135Sedward ; 13716231Sedward for (i = 1; i <= j; i++) { 13814407Sedward (void) sprintf(cap, "k%d", i); 13916494Sedward wwaddcap(cap, &kp); 14014135Sedward cap[0] = 'l'; 14116494Sedward wwaddcap(cap, &kp); 14214135Sedward } 14314135Sedward } 14432322Sedward /* 14532322Sedward * It's ok to do this here even if setenv() is destructive 14632322Sedward * since tt_init() has already made its own copy of it and 14732322Sedward * wwterm now points to the copy. 14832322Sedward */ 149*33758Sedward (void) setenv("TERM", WWT_TERM, 1); 15016231Sedward 15116494Sedward (void) signal(SIGPIPE, SIG_IGN); 15216398Sedward (void) sigsetmask(s); 15313962Sedward return 0; 15414407Sedward bad: 15514662Sedward /* 15614662Sedward * Don't bother to free storage. We're supposed 15714662Sedward * to exit when wwinit fails anyway. 15814662Sedward */ 15917407Sedward (void) wwsettty(0, &wwoldtty, &wwnewtty); 16016111Sedward (void) signal(SIGIO, SIG_DFL); 16116398Sedward (void) sigsetmask(s); 16214407Sedward return -1; 16313925Sedward } 16414135Sedward 16516494Sedward wwaddcap(cap, kp) 16614135Sedward register char *cap; 16716231Sedward register char **kp; 16814135Sedward { 16914407Sedward char tbuf[512]; 17014407Sedward char *tp = tbuf; 17114287Sedward register char *str, *p; 17214135Sedward 17314135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 17416231Sedward while (*(*kp)++ = *cap++) 17514135Sedward ; 17616231Sedward (*kp)[-1] = '='; 17714287Sedward while (*str) { 17816231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 17914287Sedward ; 18016231Sedward (*kp)--; 18114287Sedward } 18216231Sedward *(*kp)++ = ':'; 18316231Sedward **kp = 0; 18414135Sedward } 18514135Sedward } 186