xref: /csrg-svn/usr.bin/window/wwinit.c (revision 45033)
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