118727Sedward /* 233514Sbostic * Copyright (c) 1983 Regents of the University of California. 333514Sbostic * All rights reserved. 433514Sbostic * 5*42954Sbostic * This code is derived from software contributed to Berkeley by 6*42954Sbostic * Edward Wang at The University of California, Berkeley. 7*42954Sbostic * 842835Sbostic * %sccs.include.redist.c% 918727Sedward */ 1018727Sedward 1133514Sbostic #ifndef lint 12*42954Sbostic static char sccsid[] = "@(#)wwinit.c 3.39 (Berkeley) 06/06/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; 4242834Sedward #ifndef POSIX_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 6442834Sedward wwwintty.ww_termios.c_oflag &= ~OXTABS; 6542834Sedward wwnewtty.ww_termios = wwoldtty.ww_termios; 6642834Sedward wwnewtty.ww_termios.c_iflag &= 6742834Sedward ~(ISTRIP | INLCR | IGNCR | ICRNL | IXON | IXOFF | IMAXBEL); 6842834Sedward wwnewtty.ww_termios.c_iflag |= INPCK; 6942834Sedward wwnewtty.ww_termios.c_oflag = 0; 7042834Sedward wwnewtty.ww_termios.c_cflag &= ~(CSIZE | PARENB); 7142834Sedward wwnewtty.ww_termios.c_cflag |= CS8; 7242834Sedward wwnewtty.ww_termios.c_lflag = 0; 7342834Sedward for (i = 0; i < NCC; i++) 7442834Sedward wwnewtty.ww_termios.c_cc[i] = _POSIX_VDISABLE; 7542834Sedward #endif 7616231Sedward wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC; 7717407Sedward if (wwsettty(0, &wwnewtty, &wwoldtty) < 0) 7814407Sedward goto bad; 7914135Sedward 8014851Sedward if ((wwterm = getenv("TERM")) == 0) { 8114851Sedward wwerrno = WWE_BADTERM; 8214407Sedward goto bad; 8314851Sedward } 8414851Sedward if (tgetent(wwtermcap, wwterm) != 1) { 8514851Sedward wwerrno = WWE_BADTERM; 8614407Sedward goto bad; 8714851Sedward } 8842834Sedward #ifndef POSIX_TTY 8914407Sedward wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed]; 9042834Sedward #else 9142834Sedward #ifdef CBAUD 9242834Sedward wwbaud = wwbaudmap[wwoldtty.ww_termios.c_cflag & CBAUD]; 9342834Sedward #else 9442834Sedward wwbaud = wwoldtty.ww_termios.c_ospeed; 9542834Sedward #endif 9642834Sedward #endif 9714407Sedward 9838563Sedward if (xxinit() < 0) 9914407Sedward goto bad; 10014407Sedward wwnrow = tt.tt_nrow; 10114407Sedward wwncol = tt.tt_ncol; 10214684Sedward wwavailmodes = tt.tt_availmodes; 10314696Sedward wwwrap = tt.tt_wrap; 10414407Sedward 10514763Sedward if (wwavailmodes & WWM_REV) 10614763Sedward wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK; 10714763Sedward else if (wwavailmodes & WWM_UL) 10814763Sedward wwcursormodes = WWM_UL; 10914763Sedward 11015870Sedward if ((wwib = malloc((unsigned) 512)) == 0) 11115870Sedward goto bad; 11215870Sedward wwibe = wwib + 512; 11316111Sedward wwibq = wwibp = wwib; 11415870Sedward 11514985Sedward if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0) 11614407Sedward goto bad; 11714407Sedward for (i = 0; i < wwnrow; i++) 11814407Sedward for (j = 0; j < wwncol; j++) 11914407Sedward wwsmap[i][j] = WWX_NOBODY; 12014591Sedward 12114407Sedward wwos = (union ww_char **) 12214985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 12314407Sedward if (wwos == 0) 12414407Sedward goto bad; 12514407Sedward for (i = 0; i < wwnrow; i++) 12614407Sedward for (j = 0; j < wwncol; j++) 12714407Sedward wwos[i][j].c_w = ' '; 12814407Sedward wwns = (union ww_char **) 12914985Sedward wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char)); 13014407Sedward if (wwns == 0) 13114407Sedward goto bad; 13214407Sedward for (i = 0; i < wwnrow; i++) 13314407Sedward for (j = 0; j < wwncol; j++) 13414407Sedward wwns[i][j].c_w = ' '; 13514407Sedward 13614662Sedward wwtouched = malloc((unsigned) wwnrow); 13714851Sedward if (wwtouched == 0) { 13814851Sedward wwerrno = WWE_NOMEM; 13914662Sedward goto bad; 14014851Sedward } 14114662Sedward for (i = 0; i < wwnrow; i++) 14214662Sedward wwtouched[i] = 0; 14314662Sedward 14435330Sedward wwupd = (struct ww_update *) malloc((unsigned) wwnrow * sizeof *wwupd); 14535330Sedward if (wwupd == 0) { 14635330Sedward wwerrno = WWE_NOMEM; 14735330Sedward goto bad; 14835330Sedward } 14935330Sedward 15014407Sedward wwindex[WWX_NOBODY] = &wwnobody; 15114407Sedward wwnobody.ww_order = NWW; 15214407Sedward 15334803Sedward kp = wwwintermcap; 15434803Sedward if (wwavailmodes & WWM_REV) 15534803Sedward wwaddcap1(WWT_REV, &kp); 15634803Sedward if (wwavailmodes & WWM_BLK) 15734803Sedward wwaddcap1(WWT_BLK, &kp); 15834803Sedward if (wwavailmodes & WWM_UL) 15934803Sedward wwaddcap1(WWT_UL, &kp); 16034803Sedward if (wwavailmodes & WWM_GRP) 16134803Sedward wwaddcap1(WWT_GRP, &kp); 16234803Sedward if (wwavailmodes & WWM_DIM) 16334803Sedward wwaddcap1(WWT_DIM, &kp); 16434803Sedward if (wwavailmodes & WWM_USR) 16534803Sedward wwaddcap1(WWT_USR, &kp); 16634803Sedward if (tt.tt_insline && tt.tt_delline || tt.tt_setscroll) 16734803Sedward wwaddcap1(WWT_ALDL, &kp); 16839338Sedward if (tt.tt_inschar) 16934803Sedward wwaddcap1(WWT_IMEI, &kp); 17039338Sedward if (tt.tt_insspace) 17139338Sedward wwaddcap1(WWT_IC, &kp); 17234803Sedward if (tt.tt_delchar) 17334803Sedward wwaddcap1(WWT_DC, &kp); 17416494Sedward wwaddcap("kb", &kp); 17516494Sedward wwaddcap("ku", &kp); 17616494Sedward wwaddcap("kd", &kp); 17716494Sedward wwaddcap("kl", &kp); 17816494Sedward wwaddcap("kr", &kp); 17916494Sedward wwaddcap("kh", &kp); 18016231Sedward if ((j = tgetnum("kn")) >= 0) { 18116231Sedward char cap[32]; 18214135Sedward 18316231Sedward (void) sprintf(kp, "kn#%d:", j); 18414135Sedward for (; *kp; kp++) 18514135Sedward ; 18616231Sedward for (i = 1; i <= j; i++) { 18714407Sedward (void) sprintf(cap, "k%d", i); 18816494Sedward wwaddcap(cap, &kp); 18914135Sedward cap[0] = 'l'; 19016494Sedward wwaddcap(cap, &kp); 19114135Sedward } 19214135Sedward } 19332322Sedward /* 19432322Sedward * It's ok to do this here even if setenv() is destructive 19532322Sedward * since tt_init() has already made its own copy of it and 19632322Sedward * wwterm now points to the copy. 19732322Sedward */ 19833758Sedward (void) setenv("TERM", WWT_TERM, 1); 19916231Sedward 20016398Sedward (void) sigsetmask(s); 20138563Sedward /* catch typeahead before ASYNC was set */ 20238563Sedward (void) kill(getpid(), SIGIO); 20338563Sedward xxstart(); 20413962Sedward return 0; 20514407Sedward bad: 20614662Sedward /* 20714662Sedward * Don't bother to free storage. We're supposed 20814662Sedward * to exit when wwinit fails anyway. 20914662Sedward */ 21017407Sedward (void) wwsettty(0, &wwoldtty, &wwnewtty); 21116111Sedward (void) signal(SIGIO, SIG_DFL); 21216398Sedward (void) sigsetmask(s); 21314407Sedward return -1; 21413925Sedward } 21514135Sedward 21616494Sedward wwaddcap(cap, kp) 21734803Sedward register char *cap; 21834803Sedward register char **kp; 21914135Sedward { 22014407Sedward char tbuf[512]; 22114407Sedward char *tp = tbuf; 22214287Sedward register char *str, *p; 22314135Sedward 22414135Sedward if ((str = tgetstr(cap, &tp)) != 0) { 22516231Sedward while (*(*kp)++ = *cap++) 22614135Sedward ; 22716231Sedward (*kp)[-1] = '='; 22814287Sedward while (*str) { 22916231Sedward for (p = unctrl(*str++); *(*kp)++ = *p++;) 23014287Sedward ; 23116231Sedward (*kp)--; 23214287Sedward } 23316231Sedward *(*kp)++ = ':'; 23416231Sedward **kp = 0; 23514135Sedward } 23614135Sedward } 23734803Sedward 23834803Sedward wwaddcap1(cap, kp) 23934803Sedward register char *cap; 24034803Sedward register char **kp; 24134803Sedward { 24234803Sedward while (*(*kp)++ = *cap++) 24334803Sedward ; 24434803Sedward (*kp)--; 24534803Sedward } 246