xref: /csrg-svn/usr.bin/window/wwinit.c (revision 17407)
113925Sedward #ifndef lint
2*17407Sedward static char sccsid[] = "@(#)wwinit.c	3.22 11/20/84";
313925Sedward #endif
413925Sedward 
513925Sedward #include "ww.h"
614649Sedward #include "tt.h"
716111Sedward #include <sys/signal.h>
816111Sedward #include <fcntl.h>
916309Sedward #include "char.h"
1013925Sedward 
1113925Sedward wwinit()
1213925Sedward {
1314407Sedward 	register i, j;
1416231Sedward 	char *kp;
1516231Sedward 	register char **p, **q;
1617397Sedward 	char **env, **termcap = 0;
1716231Sedward 	extern char **environ;
1816398Sedward 	int s;
1913962Sedward 
2014407Sedward 	wwdtablesize = getdtablesize();
2116231Sedward 	wwhead.ww_forw = &wwhead;
2216231Sedward 	wwhead.ww_back = &wwhead;
2316111Sedward 
2416398Sedward 	s = sigblock(sigmask(SIGIO));
2516111Sedward 	if (signal(SIGIO, wwrint) == BADSIG)
2616111Sedward 		return -1;
2716111Sedward 
2813962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
2913962Sedward 		return -1;
3014295Sedward 	wwwintty = wwoldtty;
3114295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
3216231Sedward 	wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
3316231Sedward 	wwnewtty.ww_sgttyb.sg_erase = -1;
3416231Sedward 	wwnewtty.ww_sgttyb.sg_kill = -1;
3513962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
3613972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
3716231Sedward 	wwnewtty.ww_tchars.t_intrc = -1;
3816231Sedward 	wwnewtty.ww_tchars.t_quitc = -1;
3916231Sedward 	wwnewtty.ww_tchars.t_startc = -1;
4016231Sedward 	wwnewtty.ww_tchars.t_stopc = -1;
4116231Sedward 	wwnewtty.ww_tchars.t_eofc = -1;
4216231Sedward 	wwnewtty.ww_tchars.t_brkc = -1;
4316231Sedward 	wwnewtty.ww_ltchars.t_suspc = -1;
4416231Sedward 	wwnewtty.ww_ltchars.t_dsuspc = -1;
4516231Sedward 	wwnewtty.ww_ltchars.t_rprntc = -1;
4616231Sedward 	wwnewtty.ww_ltchars.t_flushc = -1;
4716231Sedward 	wwnewtty.ww_ltchars.t_werasc = -1;
4816231Sedward 	wwnewtty.ww_ltchars.t_lnextc = -1;
4916231Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
5016231Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
5116231Sedward 	wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
52*17407Sedward 	if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
5314407Sedward 		goto bad;
5414135Sedward 
5514851Sedward 	if ((wwterm = getenv("TERM")) == 0) {
5614851Sedward 		wwerrno = WWE_BADTERM;
5714407Sedward 		goto bad;
5814851Sedward 	}
5914851Sedward 	if (tgetent(wwtermcap, wwterm) != 1) {
6014851Sedward 		wwerrno = WWE_BADTERM;
6114407Sedward 		goto bad;
6214851Sedward 	}
6314407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
6414407Sedward 
6514407Sedward 	if (ttinit() < 0)
6614407Sedward 		goto bad;
6714407Sedward 	wwnrow = tt.tt_nrow;
6814407Sedward 	wwncol = tt.tt_ncol;
6914684Sedward 	wwavailmodes = tt.tt_availmodes;
7014696Sedward 	wwwrap = tt.tt_wrap;
7114649Sedward 	(*tt.tt_init)();
7214407Sedward 
7314763Sedward 	if (wwavailmodes & WWM_REV)
7414763Sedward 		wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
7514763Sedward 	else if (wwavailmodes & WWM_UL)
7614763Sedward 		wwcursormodes = WWM_UL;
7714763Sedward 
7815870Sedward 	if ((wwib = malloc((unsigned) 512)) == 0)
7915870Sedward 		goto bad;
8015870Sedward 	wwibe = wwib + 512;
8116111Sedward 	wwibq = wwibp = wwib;
8215870Sedward 
8314985Sedward 	if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
8414407Sedward 		goto bad;
8514407Sedward 	for (i = 0; i < wwnrow; i++)
8614407Sedward 		for (j = 0; j < wwncol; j++)
8714407Sedward 			wwsmap[i][j] = WWX_NOBODY;
8814591Sedward 
8914407Sedward 	wwos = (union ww_char **)
9014985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
9114407Sedward 	if (wwos == 0)
9214407Sedward 		goto bad;
9314407Sedward 	for (i = 0; i < wwnrow; i++)
9414407Sedward 		for (j = 0; j < wwncol; j++)
9514407Sedward 			wwos[i][j].c_w = ' ';
9614407Sedward 	wwns = (union ww_char **)
9714985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
9814407Sedward 	if (wwns == 0)
9914407Sedward 		goto bad;
10014407Sedward 	for (i = 0; i < wwnrow; i++)
10114407Sedward 		for (j = 0; j < wwncol; j++)
10214407Sedward 			wwns[i][j].c_w = ' ';
10314407Sedward 
10414662Sedward 	wwtouched = malloc((unsigned) wwnrow);
10514851Sedward 	if (wwtouched == 0) {
10614851Sedward 		wwerrno = WWE_NOMEM;
10714662Sedward 		goto bad;
10814851Sedward 	}
10914662Sedward 	for (i = 0; i < wwnrow; i++)
11014662Sedward 		wwtouched[i] = 0;
11114662Sedward 
11214407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
11314407Sedward 	wwnobody.ww_order = NWW;
11414407Sedward 
11516231Sedward 	kp = wwkeys;
11616494Sedward 	wwaddcap("kb", &kp);
11716494Sedward 	wwaddcap("ku", &kp);
11816494Sedward 	wwaddcap("kd", &kp);
11916494Sedward 	wwaddcap("kl", &kp);
12016494Sedward 	wwaddcap("kr", &kp);
12116494Sedward 	wwaddcap("kh", &kp);
12216231Sedward 	if ((j = tgetnum("kn")) >= 0) {
12316231Sedward 		char cap[32];
12414135Sedward 		int i;
12514135Sedward 
12616231Sedward 		(void) sprintf(kp, "kn#%d:", j);
12714135Sedward 		for (; *kp; kp++)
12814135Sedward 			;
12916231Sedward 		for (i = 1; i <= j; i++) {
13014407Sedward 			(void) sprintf(cap, "k%d", i);
13116494Sedward 			wwaddcap(cap, &kp);
13214135Sedward 			cap[0] = 'l';
13316494Sedward 			wwaddcap(cap, &kp);
13414135Sedward 		}
13514135Sedward 	}
13616231Sedward 	for (i = 0, p = environ; *p++; i++)
13716231Sedward 		;
13816231Sedward 	if ((env = (char **)malloc((unsigned)(i + 3) * sizeof (char *))) == 0)
13916231Sedward 		goto bad;
14016231Sedward 	for (p = environ, q = env; *p; p++, q++) {
14116231Sedward 		if (strncmp(*p, "TERM=", 5) == 0)
14216231Sedward 			*q = WWT_TERM;
14316231Sedward 		else if (strncmp(*p, "TERMCAP=", 8) == 0)
14416231Sedward 			termcap = q;
14516231Sedward 		else
14616231Sedward 			*q = *p;
14716231Sedward 	}
14816231Sedward 	*(termcap ? termcap : q++) = wwwintermcap;
14916231Sedward 	*q = 0;
15016231Sedward 	environ = env;
15116231Sedward 
15216494Sedward 	(void) signal(SIGPIPE, SIG_IGN);
15316398Sedward 	(void) sigsetmask(s);
15413962Sedward 	return 0;
15514407Sedward bad:
15614662Sedward 	/*
15714662Sedward 	 * Don't bother to free storage.  We're supposed
15814662Sedward 	 * to exit when wwinit fails anyway.
15914662Sedward 	 */
160*17407Sedward 	(void) wwsettty(0, &wwoldtty, &wwnewtty);
16116111Sedward 	(void) signal(SIGIO, SIG_DFL);
16216398Sedward 	(void) sigsetmask(s);
16314407Sedward 	return -1;
16413925Sedward }
16514135Sedward 
16616494Sedward wwaddcap(cap, kp)
16714135Sedward register char *cap;
16816231Sedward register char **kp;
16914135Sedward {
17014407Sedward 	char tbuf[512];
17114407Sedward 	char *tp = tbuf;
17214287Sedward 	register char *str, *p;
17314135Sedward 
17414135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
17516231Sedward 		while (*(*kp)++ = *cap++)
17614135Sedward 			;
17716231Sedward 		(*kp)[-1] = '=';
17814287Sedward 		while (*str) {
17916231Sedward 			for (p = unctrl(*str++); *(*kp)++ = *p++;)
18014287Sedward 				;
18116231Sedward 			(*kp)--;
18214287Sedward 		}
18316231Sedward 		*(*kp)++ = ':';
18416231Sedward 		**kp = 0;
18514135Sedward 	}
18614135Sedward }
187