118727Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 542954Sbostic * This code is derived from software contributed to Berkeley by 642954Sbostic * Edward Wang at The University of California, Berkeley. 742954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918727Sedward */ 1018727Sedward 1133514Sbostic #ifndef lint 12*45033Sedward static char sccsid[] = "@(#)wwinit.c 3.40 (Berkeley) 08/12/90"; 1333514Sbostic #endif /* not lint */ 1433514Sbostic 1513925Sedward #include "ww.h" 1614649Sedward #include "tt.h" 1716111Sedward #include <sys/signal.h> 1816111Sedward #include <fcntl.h> 1916309Sedward #include "char.h" 2013925Sedward 2113925Sedward wwinit() 2213925Sedward { 2314407Sedward register i, j; 2416231Sedward char *kp; 2516398Sedward int s; 2613962Sedward 2714407Sedward wwdtablesize = getdtablesize(); 2816231Sedward wwhead.ww_forw = &wwhead; 2916231Sedward wwhead.ww_back = &wwhead; 3016111Sedward 3116398Sedward s = sigblock(sigmask(SIGIO)); 3238563Sedward if (signal(SIGIO, wwrint) == BADSIG || 3338563Sedward signal(SIGCHLD, wwchild) == BADSIG || 3438563Sedward signal(SIGPIPE, SIG_IGN) == BADSIG) { 3538563Sedward wwerrno = WWE_SYS; 3616111Sedward return -1; 3738563Sedward } 3816111Sedward 3913962Sedward if (wwgettty(0, &wwoldtty) < 0) 4013962Sedward return -1; 4114295Sedward wwwintty = wwoldtty; 42*45033Sedward #ifdef OLD_TTY 4314295Sedward wwwintty.ww_sgttyb.sg_flags &= ~XTABS; 4416231Sedward wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb; 4516231Sedward wwnewtty.ww_sgttyb.sg_erase = -1; 4616231Sedward wwnewtty.ww_sgttyb.sg_kill = -1; 4713962Sedward wwnewtty.ww_sgttyb.sg_flags |= CBREAK; 4813972Sedward wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD); 4916231Sedward wwnewtty.ww_tchars.t_intrc = -1; 5016231Sedward wwnewtty.ww_tchars.t_quitc = -1; 5116231Sedward wwnewtty.ww_tchars.t_startc = -1; 5216231Sedward wwnewtty.ww_tchars.t_stopc = -1; 5316231Sedward wwnewtty.ww_tchars.t_eofc = -1; 5416231Sedward wwnewtty.ww_tchars.t_brkc = -1; 5516231Sedward wwnewtty.ww_ltchars.t_suspc = -1; 5616231Sedward wwnewtty.ww_ltchars.t_dsuspc = -1; 5716231Sedward wwnewtty.ww_ltchars.t_rprntc = -1; 5816231Sedward wwnewtty.ww_ltchars.t_flushc = -1; 5916231Sedward wwnewtty.ww_ltchars.t_werasc = -1; 6016231Sedward wwnewtty.ww_ltchars.t_lnextc = -1; 6116231Sedward wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT; 6216231Sedward wwnewtty.ww_ldisc = wwoldtty.ww_ldisc; 6342834Sedward #else 64*45033Sedward #ifndef OXTABS 65*45033Sedward #define OXTABS XTABS 66*45033Sedward #endif 67*45033Sedward #ifndef _POSIX_VDISABLE 68*45033Sedward #define _POSIX_VDISABLE -1 69*45033Sedward #endif 7042834Sedward wwwintty.ww_termios.c_oflag &= ~OXTABS; 7142834Sedward wwnewtty.ww_termios = wwoldtty.ww_termios; 7242834Sedward wwnewtty.ww_termios.c_iflag &= 7342834Sedward ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL); 7442834Sedward wwnewtty.ww_termios.c_iflag |= INPCK; 7542834Sedward wwnewtty.ww_termios.c_oflag = 0; 7642834Sedward wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB); 7742834Sedward wwnewtty.ww_termios.c_cflag |= CS8; 7842834Sedward wwnewtty.ww_termios.c_lflag = 0; 79*45033Sedward for (i = 0; i < NCCS; i++) 8042834Sedward wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE; 8142834Sedward #endif 8216231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 83*45033Sedward if (wwsettty(0, &wwnewtty) < 0) 8414407Sedward goto bad; 8514135Sedward 8614851Sedward if ((wwterm = getenv("TERM")) == 0) { 8714851Sedward wwerrno = WWE_BADTERM; 8814407Sedward goto bad; 8914851Sedward } 9014851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 9114851Sedward wwerrno = WWE_BADTERM; 9214407Sedward goto bad; 9314851Sedward } 94*45033Sedward #ifdef OLD_TTY 95*45033Sedward wwospeed = wwoldtty.ww_sgttyb.sg_ospeed; 9642834Sedward #else 97*45033Sedward wwospeed = cfgetospeed(&wwoldtty.ww_termios); 98*45033Sedward #endif 99*45033Sedward switch (wwospeed) { 100*45033Sedward default: 101*45033Sedward case B0: 102*45033Sedward wwbaud = 0; 103*45033Sedward break; 104*45033Sedward case B50: 105*45033Sedward wwbaud = 50; 106*45033Sedward break; 107*45033Sedward case B75: 108*45033Sedward wwbaud = 75; 109*45033Sedward break; 110*45033Sedward case B110: 111*45033Sedward wwbaud = 110; 112*45033Sedward break; 113*45033Sedward case B134: 114*45033Sedward wwbaud = 134; 115*45033Sedward break; 116*45033Sedward case B150: 117*45033Sedward wwbaud = 150; 118*45033Sedward break; 119*45033Sedward case B200: 120*45033Sedward wwbaud = 200; 121*45033Sedward break; 122*45033Sedward case B300: 123*45033Sedward wwbaud = 300; 124*45033Sedward break; 125*45033Sedward case B600: 126*45033Sedward wwbaud = 600; 127*45033Sedward break; 128*45033Sedward case B1200: 129*45033Sedward wwbaud = 1200; 130*45033Sedward break; 131*45033Sedward case B1800: 132*45033Sedward wwbaud = 1800; 133*45033Sedward break; 134*45033Sedward case B2400: 135*45033Sedward wwbaud = 2400; 136*45033Sedward break; 137*45033Sedward case B4800: 138*45033Sedward wwbaud = 4800; 139*45033Sedward break; 140*45033Sedward case B9600: 141*45033Sedward wwbaud = 9600; 142*45033Sedward break; 143*45033Sedward #ifdef B19200 144*45033Sedward case B19200: 14542834Sedward #else 146*45033Sedward case EXTA: 14742834Sedward #endif 148*45033Sedward wwbaud = 19200; 149*45033Sedward break; 150*45033Sedward #ifdef B38400 151*45033Sedward case B38400: 152*45033Sedward #else 153*45033Sedward case EXTB: 15442834Sedward #endif 155*45033Sedward wwbaud = 38400; 156*45033Sedward break; 157*45033Sedward } 15814407Sedward 15938563Sedward if (xxinit() < 0) 16014407Sedward goto bad; 16114407Sedward wwnrow = tt.tt_nrow; 16214407Sedward wwncol = tt.tt_ncol; 16314684Sedward wwavailmodes = tt.tt_availmodes; 16414696Sedward wwwrap = tt.tt_wrap; 16514407Sedward 16614763Sedward if (wwavailmodes & WWM_REV) 16714763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 16814763Sedward else if (wwavailmodes & WWM_UL) 16914763Sedward wwcursormodes = WWM_UL; 17014763Sedward 17115870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 17215870Sedward goto bad; 17315870Sedward wwibe = wwib + 512; 17416111Sedward wwibq = wwibp = wwib; 17515870Sedward 17614985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 17714407Sedward goto bad; 17814407Sedward for (i = 0; i < wwnrow; i++) 17914407Sedward for (j = 0; j < wwncol; j++) 18014407Sedward wwsmap[i][j] = WWX_NOBODY; 18114591Sedward 18214407Sedward wwos = (union ww_char **) 18314985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 18414407Sedward if (wwos == 0) 18514407Sedward goto bad; 18614407Sedward for (i = 0; i < wwnrow; i++) 18714407Sedward for (j = 0; j < wwncol; j++) 18814407Sedward wwos[i][j].c_w = ' '; 18914407Sedward wwns = (union ww_char **) 19014985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 19114407Sedward if (wwns == 0) 19214407Sedward goto bad; 19314407Sedward for (i = 0; i < wwnrow; i++) 19414407Sedward for (j = 0; j < wwncol; j++) 19514407Sedward wwns[i][j].c_w = ' '; 19614407Sedward 19714662Sedward wwtouched = malloc((unsigned) wwnrow); 19814851Sedward if (wwtouched == 0) { 19914851Sedward wwerrno = WWE_NOMEM; 20014662Sedward goto bad; 20114851Sedward } 20214662Sedward for (i = 0; i < wwnrow; i++) 20314662Sedward wwtouched[i] = 0; 20414662Sedward 20535330Sedward wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd); 20635330Sedward if (wwupd == 0) { 20735330Sedward wwerrno = WWE_NOMEM; 20835330Sedward goto bad; 20935330Sedward } 21035330Sedward 21114407Sedward wwindex[WWX_NOBODY] = &wwnobody; 21214407Sedward wwnobody.ww_order = NWW; 21314407Sedward 21434803Sedward kp = wwwintermcap; 21534803Sedward if (wwavailmodes & WWM_REV) 21634803Sedward wwaddcap1(WWT_REV, &kp); 21734803Sedward if (wwavailmodes & WWM_BLK) 21834803Sedward wwaddcap1(WWT_BLK, &kp); 21934803Sedward if (wwavailmodes & WWM_UL) 22034803Sedward wwaddcap1(WWT_UL, &kp); 22134803Sedward if (wwavailmodes & WWM_GRP) 22234803Sedward wwaddcap1(WWT_GRP, &kp); 22334803Sedward if (wwavailmodes & WWM_DIM) 22434803Sedward wwaddcap1(WWT_DIM, &kp); 22534803Sedward if (wwavailmodes & WWM_USR) 22634803Sedward wwaddcap1(WWT_USR, &kp); 22734803Sedward if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll) 22834803Sedward wwaddcap1(WWT_ALDL, &kp); 22939338Sedward if (tt.tt_inschar) 23034803Sedward wwaddcap1(WWT_IMEI, &kp); 23139338Sedward if (tt.tt_insspace) 23239338Sedward wwaddcap1(WWT_IC, &kp); 23334803Sedward if (tt.tt_delchar) 23434803Sedward wwaddcap1(WWT_DC, &kp); 23516494Sedward wwaddcap("kb", &kp); 23616494Sedward wwaddcap("ku", &kp); 23716494Sedward wwaddcap("kd", &kp); 23816494Sedward wwaddcap("kl", &kp); 23916494Sedward wwaddcap("kr", &kp); 24016494Sedward wwaddcap("kh", &kp); 24116231Sedward if ((j = tgetnum("kn")) >= 0) { 24216231Sedward char cap[32]; 24314135Sedward 24416231Sedward (void) sprintf(kp, "kn#%d:", j); 24514135Sedward for (; *kp; kp++) 24614135Sedward ; 24716231Sedward for (i = 1; i <= j; i++) { 24814407Sedward (void) sprintf(cap, "k%d", i); 24916494Sedward wwaddcap(cap, &kp); 25014135Sedward cap[0] = 'l'; 25116494Sedward wwaddcap(cap, &kp); 25214135Sedward } 25314135Sedward } 25432322Sedward /* 25532322Sedward * It's ok to do this here even if setenv() is destructive 25632322Sedward * since tt_init() has already made its own copy of it and 25732322Sedward * wwterm now points to the copy. 25832322Sedward */ 25933758Sedward (void) setenv("TERM", WWT_TERM, 1); 26016231Sedward 26116398Sedward (void) sigsetmask(s); 26238563Sedward /* catch typeahead before ASYNC was set */ 26338563Sedward (void) kill(getpid(), SIGIO); 26438563Sedward xxstart(); 26513962Sedward return 0; 26614407Sedward bad: 26714662Sedward /* 26814662Sedward * Don't bother to free storage. We're supposed 26914662Sedward * to exit when wwinit fails anyway. 27014662Sedward */ 271*45033Sedward (void) wwsettty(0, &wwoldtty); 27216111Sedward (void) signal(SIGIO, SIG_DFL); 27316398Sedward (void) sigsetmask(s); 27414407Sedward return -1; 27513925Sedward } 27614135Sedward 27716494Sedward wwaddcap(cap, kp) 27834803Sedward register char *cap; 27934803Sedward register char **kp; 28014135Sedward { 28114407Sedward char tbuf[512]; 28214407Sedward char *tp = tbuf; 28314287Sedward register char *str, *p; 28414135Sedward 28514135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 28616231Sedward while (*(*kp)++ = *cap++) 28714135Sedward ; 28816231Sedward (*kp)[-1] = '='; 28914287Sedward while (*str) { 29016231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 29114287Sedward ; 29216231Sedward (*kp)--; 29314287Sedward } 29416231Sedward *(*kp)++ = ':'; 29516231Sedward **kp = 0; 29614135Sedward } 29714135Sedward } 29834803Sedward 29934803Sedward wwaddcap1(cap, kp) 30034803Sedward register char *cap; 30134803Sedward register char **kp; 30234803Sedward { 30334803Sedward while (*(*kp)++ = *cap++) 30434803Sedward ; 30534803Sedward (*kp)--; 30634803Sedward } 307