xref: /csrg-svn/usr.bin/window/wwinit.c (revision 16231)
113925Sedward #ifndef lint
2*16231Sedward static	char *sccsid = "@(#)wwinit.c	3.16 84/03/23";
313925Sedward #endif
413925Sedward 
513925Sedward #include "ww.h"
614649Sedward #include "tt.h"
716111Sedward #include <sys/signal.h>
816111Sedward #include <fcntl.h>
913925Sedward 
1013925Sedward wwinit()
1113925Sedward {
1214407Sedward 	register i, j;
13*16231Sedward 	char *kp;
14*16231Sedward 	register char **p, **q;
15*16231Sedward 	char **env, **termcap;
16*16231Sedward 	extern char **environ;
1713962Sedward 
1815361Sedward #ifndef O_4_1A
1914407Sedward 	wwdtablesize = getdtablesize();
2015361Sedward #else
2115361Sedward #include <sys/param.h>
2215361Sedward 	wwdtablesize = NOFILE;
2315361Sedward #endif
24*16231Sedward 	wwhead.ww_forw = &wwhead;
25*16231Sedward 	wwhead.ww_back = &wwhead;
2616111Sedward 
2716111Sedward 	if (signal(SIGIO, wwrint) == BADSIG)
2816111Sedward 		return -1;
2916111Sedward 	(void) sighold(SIGIO);
3016111Sedward 
3113962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
3213962Sedward 		return -1;
3314295Sedward 	wwwintty = wwoldtty;
3414295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
35*16231Sedward 	wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
36*16231Sedward 	wwnewtty.ww_sgttyb.sg_erase = -1;
37*16231Sedward 	wwnewtty.ww_sgttyb.sg_kill = -1;
3813962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
3913972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
40*16231Sedward 	wwnewtty.ww_tchars.t_intrc = -1;
41*16231Sedward 	wwnewtty.ww_tchars.t_quitc = -1;
42*16231Sedward 	wwnewtty.ww_tchars.t_startc = -1;
43*16231Sedward 	wwnewtty.ww_tchars.t_stopc = -1;
44*16231Sedward 	wwnewtty.ww_tchars.t_eofc = -1;
45*16231Sedward 	wwnewtty.ww_tchars.t_brkc = -1;
46*16231Sedward 	wwnewtty.ww_ltchars.t_suspc = -1;
47*16231Sedward 	wwnewtty.ww_ltchars.t_dsuspc = -1;
48*16231Sedward 	wwnewtty.ww_ltchars.t_rprntc = -1;
49*16231Sedward 	wwnewtty.ww_ltchars.t_flushc = -1;
50*16231Sedward 	wwnewtty.ww_ltchars.t_werasc = -1;
51*16231Sedward 	wwnewtty.ww_ltchars.t_lnextc = -1;
52*16231Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
53*16231Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
54*16231Sedward 	wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
55*16231Sedward 
5613962Sedward 	if (wwsettty(0, &wwnewtty) < 0)
5714407Sedward 		goto bad;
5814135Sedward 
5914851Sedward 	if ((wwterm = getenv("TERM")) == 0) {
6014851Sedward 		wwerrno = WWE_BADTERM;
6114407Sedward 		goto bad;
6214851Sedward 	}
6314851Sedward 	if (tgetent(wwtermcap, wwterm) != 1) {
6414851Sedward 		wwerrno = WWE_BADTERM;
6514407Sedward 		goto bad;
6614851Sedward 	}
6714407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
6814407Sedward 
6914407Sedward 	if (ttinit() < 0)
7014407Sedward 		goto bad;
7114407Sedward 	wwnrow = tt.tt_nrow;
7214407Sedward 	wwncol = tt.tt_ncol;
7314684Sedward 	wwavailmodes = tt.tt_availmodes;
7414696Sedward 	wwwrap = tt.tt_wrap;
7514649Sedward 	(*tt.tt_init)();
7614407Sedward 
7714763Sedward 	if (wwavailmodes & WWM_REV)
7814763Sedward 		wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
7914763Sedward 	else if (wwavailmodes & WWM_UL)
8014763Sedward 		wwcursormodes = WWM_UL;
8114763Sedward 
8215870Sedward 	if ((wwib = malloc((unsigned) 512)) == 0)
8315870Sedward 		goto bad;
8415870Sedward 	wwibe = wwib + 512;
8516111Sedward 	wwibq = wwibp = wwib;
8615870Sedward 
8714985Sedward 	if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
8814407Sedward 		goto bad;
8914407Sedward 	for (i = 0; i < wwnrow; i++)
9014407Sedward 		for (j = 0; j < wwncol; j++)
9114407Sedward 			wwsmap[i][j] = WWX_NOBODY;
9214591Sedward 
9314407Sedward 	wwos = (union ww_char **)
9414985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
9514407Sedward 	if (wwos == 0)
9614407Sedward 		goto bad;
9714407Sedward 	for (i = 0; i < wwnrow; i++)
9814407Sedward 		for (j = 0; j < wwncol; j++)
9914407Sedward 			wwos[i][j].c_w = ' ';
10014407Sedward 	wwns = (union ww_char **)
10114985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
10214407Sedward 	if (wwns == 0)
10314407Sedward 		goto bad;
10414407Sedward 	for (i = 0; i < wwnrow; i++)
10514407Sedward 		for (j = 0; j < wwncol; j++)
10614407Sedward 			wwns[i][j].c_w = ' ';
10714407Sedward 
10814662Sedward 	wwtouched = malloc((unsigned) wwnrow);
10914851Sedward 	if (wwtouched == 0) {
11014851Sedward 		wwerrno = WWE_NOMEM;
11114662Sedward 		goto bad;
11214851Sedward 	}
11314662Sedward 	for (i = 0; i < wwnrow; i++)
11414662Sedward 		wwtouched[i] = 0;
11514662Sedward 
11614407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
11714407Sedward 	wwnobody.ww_order = NWW;
11814407Sedward 
119*16231Sedward 	kp = wwkeys;
120*16231Sedward 	addcap("kb", &kp);
121*16231Sedward 	addcap("ku", &kp);
122*16231Sedward 	addcap("kd", &kp);
123*16231Sedward 	addcap("kl", &kp);
124*16231Sedward 	addcap("kr", &kp);
125*16231Sedward 	addcap("kh", &kp);
126*16231Sedward 	if ((j = tgetnum("kn")) >= 0) {
127*16231Sedward 		char cap[32];
12814135Sedward 		int i;
12914135Sedward 
130*16231Sedward 		(void) sprintf(kp, "kn#%d:", j);
13114135Sedward 		for (; *kp; kp++)
13214135Sedward 			;
133*16231Sedward 		for (i = 1; i <= j; i++) {
13414407Sedward 			(void) sprintf(cap, "k%d", i);
135*16231Sedward 			addcap(cap, &kp);
13614135Sedward 			cap[0] = 'l';
137*16231Sedward 			addcap(cap, &kp);
13814135Sedward 		}
13914135Sedward 	}
140*16231Sedward 	for (i = 0, p = environ; *p++; i++)
141*16231Sedward 		;
142*16231Sedward 	if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
143*16231Sedward 		goto bad;
144*16231Sedward 	for (p = environ, q = env; *p; p++, q++) {
145*16231Sedward 		if (strncmp(*p, "TERM=", 5) == 0)
146*16231Sedward 			*q = WWT_TERM;
147*16231Sedward 		else if (strncmp(*p, "TERMCAP=", 8) == 0)
148*16231Sedward 			termcap = q;
149*16231Sedward 		else
150*16231Sedward 			*q = *p;
151*16231Sedward 	}
152*16231Sedward 	*(termcap ? termcap : q++) = wwwintermcap;
153*16231Sedward 	*q = 0;
154*16231Sedward 	environ = env;
155*16231Sedward 
15616111Sedward 	(void) sigrelse(SIGIO);
15713962Sedward 	return 0;
15814407Sedward bad:
15914662Sedward 	/*
16014662Sedward 	 * Don't bother to free storage.  We're supposed
16114662Sedward 	 * to exit when wwinit fails anyway.
16214662Sedward 	 */
16314407Sedward 	(void) wwsettty(0, &wwoldtty);
16416111Sedward 	(void) signal(SIGIO, SIG_DFL);
16516111Sedward 	(void) sigrelse(SIGIO);
16614407Sedward 	return -1;
16713925Sedward }
16814135Sedward 
16914407Sedward static
170*16231Sedward addcap(cap, kp)
17114135Sedward register char *cap;
172*16231Sedward register char **kp;
17314135Sedward {
17414407Sedward 	char tbuf[512];
17514407Sedward 	char *tp = tbuf;
17614287Sedward 	register char *str, *p;
17714135Sedward 
17814135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
179*16231Sedward 		while (*(*kp)++ = *cap++)
18014135Sedward 			;
181*16231Sedward 		(*kp)[-1] = '=';
18214287Sedward 		while (*str) {
183*16231Sedward 			for (p = unctrl(*str++); *(*kp)++ = *p++;)
18414287Sedward 				;
185*16231Sedward 			(*kp)--;
18614287Sedward 		}
187*16231Sedward 		*(*kp)++ = ':';
188*16231Sedward 		**kp = 0;
18914135Sedward 	}
19014135Sedward }
191