xref: /csrg-svn/usr.bin/window/wwinit.c (revision 14851)
113925Sedward #ifndef lint
2*14851Sedward static	char *sccsid = "@(#)wwinit.c	3.9 83/08/26";
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);
1714407Sedward 	wwdtablesize = getdtablesize();
1813962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
1913962Sedward 		return -1;
2014295Sedward 	wwwintty = wwoldtty;
2114295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
2213962Sedward 	wwnewtty.ww_sgttyb.sg_flags = wwoldtty.ww_sgttyb.sg_flags;
2313962Sedward 	wwnewtty.ww_sgttyb.sg_ispeed = wwoldtty.ww_sgttyb.sg_ispeed;
2413962Sedward 	wwnewtty.ww_sgttyb.sg_ospeed = wwoldtty.ww_sgttyb.sg_ospeed;
2513962Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode;
2613962Sedward 	wwnewtty.ww_pgrp = wwoldtty.ww_pgrp;
2713962Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
2813962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
2913972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
3013962Sedward 	wwnewtty.ww_lmode |= LLITOUT;
3113962Sedward 	if (wwsettty(0, &wwnewtty) < 0)
3214407Sedward 		goto bad;
3314135Sedward 
34*14851Sedward 	if ((wwterm = getenv("TERM")) == 0) {
35*14851Sedward 		wwerrno = WWE_BADTERM;
3614407Sedward 		goto bad;
37*14851Sedward 	}
38*14851Sedward 	if (tgetent(wwtermcap, wwterm) != 1) {
39*14851Sedward 		wwerrno = WWE_BADTERM;
4014407Sedward 		goto bad;
41*14851Sedward 	}
4214407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
4314407Sedward 
4414407Sedward 	if (ttinit() < 0)
4514407Sedward 		goto bad;
4614407Sedward 	wwnrow = tt.tt_nrow;
4714407Sedward 	wwncol = tt.tt_ncol;
4814684Sedward 	wwavailmodes = tt.tt_availmodes;
4914696Sedward 	wwwrap = tt.tt_wrap;
5014649Sedward 	(*tt.tt_init)();
5114407Sedward 
5214763Sedward 	if (wwavailmodes & WWM_REV)
5314763Sedward 		wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
5414763Sedward 	else if (wwavailmodes & WWM_UL)
5514763Sedward 		wwcursormodes = WWM_UL;
5614763Sedward 
5714407Sedward 	if ((wwsmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
5814407Sedward 		goto bad;
5914407Sedward 	for (i = 0; i < wwnrow; i++)
6014407Sedward 		for (j = 0; j < wwncol; j++)
6114407Sedward 			wwsmap[i][j] = WWX_NOBODY;
6214591Sedward 
6314407Sedward 	wwos = (union ww_char **)
6414407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
6514407Sedward 	if (wwos == 0)
6614407Sedward 		goto bad;
6714407Sedward 	for (i = 0; i < wwnrow; i++)
6814407Sedward 		for (j = 0; j < wwncol; j++)
6914407Sedward 			wwos[i][j].c_w = ' ';
7014407Sedward 	wwns = (union ww_char **)
7114407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
7214407Sedward 	if (wwns == 0)
7314407Sedward 		goto bad;
7414407Sedward 	for (i = 0; i < wwnrow; i++)
7514407Sedward 		for (j = 0; j < wwncol; j++)
7614407Sedward 			wwns[i][j].c_w = ' ';
7714407Sedward 
7814662Sedward 	wwtouched = malloc((unsigned) wwnrow);
79*14851Sedward 	if (wwtouched == 0) {
80*14851Sedward 		wwerrno = WWE_NOMEM;
8114662Sedward 		goto bad;
82*14851Sedward 	}
8314662Sedward 	for (i = 0; i < wwnrow; i++)
8414662Sedward 		wwtouched[i] = 0;
8514662Sedward 
8614407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
8714407Sedward 	wwnobody.ww_order = NWW;
8814407Sedward 
8914135Sedward 	addcap("kb");
9014135Sedward 	addcap("ku");
9114135Sedward 	addcap("kd");
9214135Sedward 	addcap("kl");
9314135Sedward 	addcap("kr");
9414135Sedward 	addcap("kh");
9514135Sedward 	if ((kn = tgetnum("kn")) >= 0) {
9614135Sedward 		char cap[5];
9714135Sedward 		int i;
9814135Sedward 
9914407Sedward 		(void) sprintf(kp, "kn#%d:", kn);
10014135Sedward 		for (; *kp; kp++)
10114135Sedward 			;
10214135Sedward 		for (i = 1; i <= kn; i++) {
10314407Sedward 			(void) sprintf(cap, "k%d", i);
10414135Sedward 			addcap(cap);
10514135Sedward 			cap[0] = 'l';
10614135Sedward 			addcap(cap);
10714135Sedward 		}
10814135Sedward 	}
10913962Sedward 	return 0;
11014407Sedward bad:
11114662Sedward 	/*
11214662Sedward 	 * Don't bother to free storage.  We're supposed
11314662Sedward 	 * to exit when wwinit fails anyway.
11414662Sedward 	 */
11514407Sedward 	(void) wwsettty(0, &wwoldtty);
11614407Sedward 	return -1;
11713925Sedward }
11814135Sedward 
11914407Sedward static
12014135Sedward addcap(cap)
12114135Sedward register char *cap;
12214135Sedward {
12314407Sedward 	char tbuf[512];
12414407Sedward 	char *tp = tbuf;
12514287Sedward 	register char *str, *p;
12614135Sedward 
12714135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
12814135Sedward 		while (*kp++ = *cap++)
12914135Sedward 			;
13014135Sedward 		kp[-1] = '=';
13114287Sedward 		while (*str) {
13214287Sedward 			for (p = unctrl(*str++); *kp++ = *p++;)
13314287Sedward 				;
13414287Sedward 			kp--;
13514287Sedward 		}
13614287Sedward 		*kp++ = ':';
13714135Sedward 		*kp = 0;
13814135Sedward 	}
13914135Sedward }
140