xref: /csrg-svn/usr.bin/window/wwinit.c (revision 14662)
113925Sedward #ifndef lint
2*14662Sedward static	char *sccsid = "@(#)wwinit.c	3.4 83/08/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);
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 
3414407Sedward 	if ((wwterm = getenv("TERM")) == 0)
3514407Sedward 		goto bad;
3614407Sedward 	if (tgetent(wwtermcap, wwterm) != 1)
3714407Sedward 		goto bad;
3814407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
3914407Sedward 
4014407Sedward 	if (ttinit() < 0)
4114407Sedward 		goto bad;
4214407Sedward 	wwnrow = tt.tt_nrow;
4314407Sedward 	wwncol = tt.tt_ncol;
4414649Sedward 	(*tt.tt_init)();
4514407Sedward 
4614407Sedward 	if ((wwsmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
4714407Sedward 		goto bad;
4814407Sedward 	for (i = 0; i < wwnrow; i++)
4914407Sedward 		for (j = 0; j < wwncol; j++)
5014407Sedward 			wwsmap[i][j] = WWX_NOBODY;
5114591Sedward 	if ((wwfmap = wwalloc(wwnrow, wwncol, sizeof (char))) == 0)
5214591Sedward 		goto bad;
5314591Sedward 	for (i = 0; i < wwnrow; i++)
5414591Sedward 		for (j = 0; j < wwncol; j++)
5514591Sedward 			wwfmap[i][j] = 0;
5614591Sedward 
5714407Sedward 	wwos = (union ww_char **)
5814407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
5914407Sedward 	if (wwos == 0)
6014407Sedward 		goto bad;
6114407Sedward 	for (i = 0; i < wwnrow; i++)
6214407Sedward 		for (j = 0; j < wwncol; j++)
6314407Sedward 			wwos[i][j].c_w = ' ';
6414407Sedward 	wwns = (union ww_char **)
6514407Sedward 		wwalloc(wwnrow, wwncol, sizeof (union ww_char));
6614407Sedward 	if (wwns == 0)
6714407Sedward 		goto bad;
6814407Sedward 	for (i = 0; i < wwnrow; i++)
6914407Sedward 		for (j = 0; j < wwncol; j++)
7014407Sedward 			wwns[i][j].c_w = ' ';
7114407Sedward 
72*14662Sedward 	wwtouched = malloc((unsigned) wwnrow);
73*14662Sedward 	if (wwtouched == 0)
74*14662Sedward 		goto bad;
75*14662Sedward 	for (i = 0; i < wwnrow; i++)
76*14662Sedward 		wwtouched[i] = 0;
77*14662Sedward 
7814407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
7914407Sedward 	wwnobody.ww_order = NWW;
8014407Sedward 
8114135Sedward 	addcap("kb");
8214135Sedward 	addcap("ku");
8314135Sedward 	addcap("kd");
8414135Sedward 	addcap("kl");
8514135Sedward 	addcap("kr");
8614135Sedward 	addcap("kh");
8714135Sedward 	if ((kn = tgetnum("kn")) >= 0) {
8814135Sedward 		char cap[5];
8914135Sedward 		int i;
9014135Sedward 
9114407Sedward 		(void) sprintf(kp, "kn#%d:", kn);
9214135Sedward 		for (; *kp; kp++)
9314135Sedward 			;
9414135Sedward 		for (i = 1; i <= kn; i++) {
9514407Sedward 			(void) sprintf(cap, "k%d", i);
9614135Sedward 			addcap(cap);
9714135Sedward 			cap[0] = 'l';
9814135Sedward 			addcap(cap);
9914135Sedward 		}
10014135Sedward 	}
10113962Sedward 	return 0;
10214407Sedward bad:
103*14662Sedward 	/*
104*14662Sedward 	 * Don't bother to free storage.  We're supposed
105*14662Sedward 	 * to exit when wwinit fails anyway.
106*14662Sedward 	 */
10714407Sedward 	(void) wwsettty(0, &wwoldtty);
10814407Sedward 	return -1;
10913925Sedward }
11014135Sedward 
11114407Sedward static
11214135Sedward addcap(cap)
11314135Sedward register char *cap;
11414135Sedward {
11514407Sedward 	char tbuf[512];
11614407Sedward 	char *tp = tbuf;
11714287Sedward 	register char *str, *p;
11814135Sedward 
11914135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
12014135Sedward 		while (*kp++ = *cap++)
12114135Sedward 			;
12214135Sedward 		kp[-1] = '=';
12314287Sedward 		while (*str) {
12414287Sedward 			for (p = unctrl(*str++); *kp++ = *p++;)
12514287Sedward 				;
12614287Sedward 			kp--;
12714287Sedward 		}
12814287Sedward 		*kp++ = ':';
12914135Sedward 		*kp = 0;
13014135Sedward 	}
13114135Sedward }
132