xref: /csrg-svn/usr.bin/window/wwinit.c (revision 15870)
113925Sedward #ifndef lint
2*15870Sedward static	char *sccsid = "@(#)wwinit.c	3.14 84/01/16";
313925Sedward #endif
413925Sedward 
513925Sedward #include "ww.h"
614649Sedward #include "tt.h"
713925Sedward 
814407Sedward static char *kp = wwkeys;
914454Sedward extern char _sobuf[];
1013925Sedward 
1113925Sedward wwinit()
1213925Sedward {
1314407Sedward 	register i, j;
1414135Sedward 	int kn;
1513962Sedward 
1614454Sedward 	setbuf(stdout, _sobuf);
1715361Sedward #ifndef O_4_1A
1814407Sedward 	wwdtablesize = getdtablesize();
1915361Sedward #else
2015361Sedward #include <sys/param.h>
2115361Sedward 	wwdtablesize = NOFILE;
2215361Sedward #endif
2313962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
2413962Sedward 		return -1;
2514295Sedward 	wwwintty = wwoldtty;
2614295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
2713962Sedward 	wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags;
2813962Sedward 	wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed;
2913962Sedward 	wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
3013962Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode;
3113962Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
3213962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
3313972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
3413962Sedward 	wwnewtty.ww_lmode |= LLITOUT;
3513962Sedward 	if (wwsettty(0, &wwnewtty) < 0)
3614407Sedward 		goto bad;
3714135Sedward 
3814851Sedward 	if ((wwterm = getenv("TERM")) == 0) {
3914851Sedward 		wwerrno = WWE_BADTERM;
4014407Sedward 		goto bad;
4114851Sedward 	}
4214851Sedward 	if (tgetent(wwtermcap, wwterm) != 1) {
4314851Sedward 		wwerrno = WWE_BADTERM;
4414407Sedward 		goto bad;
4514851Sedward 	}
4614407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
4714407Sedward 
4814407Sedward 	if (ttinit() < 0)
4914407Sedward 		goto bad;
5014407Sedward 	wwnrow = tt.tt_nrow;
5114407Sedward 	wwncol = tt.tt_ncol;
5214684Sedward 	wwavailmodes = tt.tt_availmodes;
5314696Sedward 	wwwrap = tt.tt_wrap;
5414649Sedward 	(*tt.tt_init)();
5514407Sedward 
5614763Sedward 	if (wwavailmodes & WWM_REV)
5714763Sedward 		wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
5814763Sedward 	else if (wwavailmodes & WWM_UL)
5914763Sedward 		wwcursormodes = WWM_UL;
6014763Sedward 
61*15870Sedward 	if ((wwib = malloc((unsigned) 512)) == 0)
62*15870Sedward 		goto bad;
63*15870Sedward 	wwibe = wwib + 512;
64*15870Sedward 	wwibp = wwib;
65*15870Sedward 	wwibc = 0;
66*15870Sedward 
6714985Sedward 	if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
6814407Sedward 		goto bad;
6914407Sedward 	for (i = 0; i < wwnrow; i++)
7014407Sedward 		for (j = 0; j < wwncol; j++)
7114407Sedward 			wwsmap[i][j] = WWX_NOBODY;
7214591Sedward 
7314407Sedward 	wwos = (union ww_char **)
7414985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
7514407Sedward 	if (wwos == 0)
7614407Sedward 		goto bad;
7714407Sedward 	for (i = 0; i < wwnrow; i++)
7814407Sedward 		for (j = 0; j < wwncol; j++)
7914407Sedward 			wwos[i][j].c_w = ' ';
8014407Sedward 	wwns = (union ww_char **)
8114985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
8214407Sedward 	if (wwns == 0)
8314407Sedward 		goto bad;
8414407Sedward 	for (i = 0; i < wwnrow; i++)
8514407Sedward 		for (j = 0; j < wwncol; j++)
8614407Sedward 			wwns[i][j].c_w = ' ';
8714407Sedward 
8814662Sedward 	wwtouched = malloc((unsigned) wwnrow);
8914851Sedward 	if (wwtouched == 0) {
9014851Sedward 		wwerrno = WWE_NOMEM;
9114662Sedward 		goto bad;
9214851Sedward 	}
9314662Sedward 	for (i = 0; i < wwnrow; i++)
9414662Sedward 		wwtouched[i] = 0;
9514662Sedward 
9614407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
9714407Sedward 	wwnobody.ww_order = NWW;
9814407Sedward 
9914135Sedward 	addcap("kb");
10014135Sedward 	addcap("ku");
10114135Sedward 	addcap("kd");
10214135Sedward 	addcap("kl");
10314135Sedward 	addcap("kr");
10414135Sedward 	addcap("kh");
10514135Sedward 	if ((kn = tgetnum("kn")) >= 0) {
10614135Sedward 		char cap[5];
10714135Sedward 		int i;
10814135Sedward 
10914407Sedward 		(void) sprintf(kp, "kn#%d:", kn);
11014135Sedward 		for (; *kp; kp++)
11114135Sedward 			;
11214135Sedward 		for (i = 1; i <= kn; i++) {
11314407Sedward 			(void) sprintf(cap, "k%d", i);
11414135Sedward 			addcap(cap);
11514135Sedward 			cap[0] = 'l';
11614135Sedward 			addcap(cap);
11714135Sedward 		}
11814135Sedward 	}
11913962Sedward 	return 0;
12014407Sedward bad:
12114662Sedward 	/*
12214662Sedward 	 * Don't bother to free storage.  We're supposed
12314662Sedward 	 * to exit when wwinit fails anyway.
12414662Sedward 	 */
12514407Sedward 	(void) wwsettty(0, &wwoldtty);
12614407Sedward 	return -1;
12713925Sedward }
12814135Sedward 
12914407Sedward static
13014135Sedward addcap(cap)
13114135Sedward register char *cap;
13214135Sedward {
13314407Sedward 	char tbuf[512];
13414407Sedward 	char *tp = tbuf;
13514287Sedward 	register char *str, *p;
13614135Sedward 
13714135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
13814135Sedward 		while (*kp++ = *cap++)
13914135Sedward 			;
14014135Sedward 		kp[-1] = '=';
14114287Sedward 		while (*str) {
14214287Sedward 			for (p = unctrl(*str++); *kp++ = *p++;)
14314287Sedward 				;
14414287Sedward 			kp--;
14514287Sedward 		}
14614287Sedward 		*kp++ = ':';
14714135Sedward 		*kp = 0;
14814135Sedward 	}
14914135Sedward }
150