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