xref: /csrg-svn/usr.bin/window/wwinit.c (revision 33758)
118727Sedward /*
233514Sbostic  * Copyright (c) 1983 Regents of the University of California.
333514Sbostic  * All rights reserved.
433514Sbostic  *
533514Sbostic  * Redistribution and use in source and binary forms are permitted
633514Sbostic  * provided that this notice is preserved and that due credit is given
733514Sbostic  * to the University of California at Berkeley. The name of the University
833514Sbostic  * may not be used to endorse or promote products derived from this
933514Sbostic  * software without specific prior written permission. This software
1033514Sbostic  * is provided ``as is'' without express or implied warranty.
1118727Sedward  */
1218727Sedward 
1333514Sbostic #ifndef lint
14*33758Sedward static char sccsid[] = "@(#)wwinit.c	3.29 (Berkeley) 03/19/88";
1533514Sbostic #endif /* not lint */
1633514Sbostic 
1713925Sedward #include "ww.h"
1814649Sedward #include "tt.h"
1916111Sedward #include <sys/signal.h>
2016111Sedward #include <fcntl.h>
2116309Sedward #include "char.h"
2213925Sedward 
2313925Sedward wwinit()
2413925Sedward {
2514407Sedward 	register i, j;
2616231Sedward 	char *kp;
2716398Sedward 	int s;
2813962Sedward 
2914407Sedward 	wwdtablesize = getdtablesize();
3016231Sedward 	wwhead.ww_forw = &wwhead;
3116231Sedward 	wwhead.ww_back = &wwhead;
3216111Sedward 
3316398Sedward 	s = sigblock(sigmask(SIGIO));
3416111Sedward 	if (signal(SIGIO, wwrint) == BADSIG)
3516111Sedward 		return -1;
3616111Sedward 
3713962Sedward 	if (wwgettty(0, &wwoldtty) < 0)
3813962Sedward 		return -1;
3914295Sedward 	wwwintty = wwoldtty;
4014295Sedward 	wwwintty.ww_sgttyb.sg_flags &= ~XTABS;
4116231Sedward 	wwnewtty.ww_sgttyb = wwoldtty.ww_sgttyb;
4216231Sedward 	wwnewtty.ww_sgttyb.sg_erase = -1;
4316231Sedward 	wwnewtty.ww_sgttyb.sg_kill = -1;
4413962Sedward 	wwnewtty.ww_sgttyb.sg_flags |= CBREAK;
4513972Sedward 	wwnewtty.ww_sgttyb.sg_flags &= ~(ECHO|CRMOD);
4616231Sedward 	wwnewtty.ww_tchars.t_intrc = -1;
4716231Sedward 	wwnewtty.ww_tchars.t_quitc = -1;
4816231Sedward 	wwnewtty.ww_tchars.t_startc = -1;
4916231Sedward 	wwnewtty.ww_tchars.t_stopc = -1;
5016231Sedward 	wwnewtty.ww_tchars.t_eofc = -1;
5116231Sedward 	wwnewtty.ww_tchars.t_brkc = -1;
5216231Sedward 	wwnewtty.ww_ltchars.t_suspc = -1;
5316231Sedward 	wwnewtty.ww_ltchars.t_dsuspc = -1;
5416231Sedward 	wwnewtty.ww_ltchars.t_rprntc = -1;
5516231Sedward 	wwnewtty.ww_ltchars.t_flushc = -1;
5616231Sedward 	wwnewtty.ww_ltchars.t_werasc = -1;
5716231Sedward 	wwnewtty.ww_ltchars.t_lnextc = -1;
5816231Sedward 	wwnewtty.ww_lmode = wwoldtty.ww_lmode | LLITOUT;
5916231Sedward 	wwnewtty.ww_ldisc = wwoldtty.ww_ldisc;
6016231Sedward 	wwnewtty.ww_fflags = wwoldtty.ww_fflags | FASYNC;
6117407Sedward 	if (wwsettty(0, &wwnewtty, &wwoldtty) < 0)
6214407Sedward 		goto bad;
6314135Sedward 
6414851Sedward 	if ((wwterm = getenv("TERM")) == 0) {
6514851Sedward 		wwerrno = WWE_BADTERM;
6614407Sedward 		goto bad;
6714851Sedward 	}
6814851Sedward 	if (tgetent(wwtermcap, wwterm) != 1) {
6914851Sedward 		wwerrno = WWE_BADTERM;
7014407Sedward 		goto bad;
7114851Sedward 	}
7214407Sedward 	wwbaud = wwbaudmap[wwoldtty.ww_sgttyb.sg_ospeed];
7314407Sedward 
7414407Sedward 	if (ttinit() < 0)
7514407Sedward 		goto bad;
7614407Sedward 	wwnrow = tt.tt_nrow;
7714407Sedward 	wwncol = tt.tt_ncol;
7814684Sedward 	wwavailmodes = tt.tt_availmodes;
7914696Sedward 	wwwrap = tt.tt_wrap;
8014649Sedward 	(*tt.tt_init)();
8114407Sedward 
8214763Sedward 	if (wwavailmodes & WWM_REV)
8314763Sedward 		wwcursormodes = WWM_REV | wwavailmodes & WWM_BLK;
8414763Sedward 	else if (wwavailmodes & WWM_UL)
8514763Sedward 		wwcursormodes = WWM_UL;
8614763Sedward 
8715870Sedward 	if ((wwib = malloc((unsigned) 512)) == 0)
8815870Sedward 		goto bad;
8915870Sedward 	wwibe = wwib + 512;
9016111Sedward 	wwibq = wwibp = wwib;
9115870Sedward 
9214985Sedward 	if ((wwsmap = wwalloc(0, 0, wwnrow, wwncol, sizeof (char))) == 0)
9314407Sedward 		goto bad;
9414407Sedward 	for (i = 0; i < wwnrow; i++)
9514407Sedward 		for (j = 0; j < wwncol; j++)
9614407Sedward 			wwsmap[i][j] = WWX_NOBODY;
9714591Sedward 
9814407Sedward 	wwos = (union ww_char **)
9914985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
10014407Sedward 	if (wwos == 0)
10114407Sedward 		goto bad;
10214407Sedward 	for (i = 0; i < wwnrow; i++)
10314407Sedward 		for (j = 0; j < wwncol; j++)
10414407Sedward 			wwos[i][j].c_w = ' ';
10514407Sedward 	wwns = (union ww_char **)
10614985Sedward 		wwalloc(0, 0, wwnrow, wwncol, sizeof (union ww_char));
10714407Sedward 	if (wwns == 0)
10814407Sedward 		goto bad;
10914407Sedward 	for (i = 0; i < wwnrow; i++)
11014407Sedward 		for (j = 0; j < wwncol; j++)
11114407Sedward 			wwns[i][j].c_w = ' ';
11214407Sedward 
11314662Sedward 	wwtouched = malloc((unsigned) wwnrow);
11414851Sedward 	if (wwtouched == 0) {
11514851Sedward 		wwerrno = WWE_NOMEM;
11614662Sedward 		goto bad;
11714851Sedward 	}
11814662Sedward 	for (i = 0; i < wwnrow; i++)
11914662Sedward 		wwtouched[i] = 0;
12014662Sedward 
12114407Sedward 	wwindex[WWX_NOBODY] = &wwnobody;
12214407Sedward 	wwnobody.ww_order = NWW;
12314407Sedward 
12416231Sedward 	kp = wwkeys;
12516494Sedward 	wwaddcap("kb", &kp);
12616494Sedward 	wwaddcap("ku", &kp);
12716494Sedward 	wwaddcap("kd", &kp);
12816494Sedward 	wwaddcap("kl", &kp);
12916494Sedward 	wwaddcap("kr", &kp);
13016494Sedward 	wwaddcap("kh", &kp);
13116231Sedward 	if ((j = tgetnum("kn")) >= 0) {
13216231Sedward 		char cap[32];
13314135Sedward 
13416231Sedward 		(void) sprintf(kp, "kn#%d:", j);
13514135Sedward 		for (; *kp; kp++)
13614135Sedward 			;
13716231Sedward 		for (i = 1; i <= j; i++) {
13814407Sedward 			(void) sprintf(cap, "k%d", i);
13916494Sedward 			wwaddcap(cap, &kp);
14014135Sedward 			cap[0] = 'l';
14116494Sedward 			wwaddcap(cap, &kp);
14214135Sedward 		}
14314135Sedward 	}
14432322Sedward 	/*
14532322Sedward 	 * It's ok to do this here even if setenv() is destructive
14632322Sedward 	 * since tt_init() has already made its own copy of it and
14732322Sedward 	 * wwterm now points to the copy.
14832322Sedward 	 */
149*33758Sedward 	(void) setenv("TERM", WWT_TERM, 1);
15016231Sedward 
15116494Sedward 	(void) signal(SIGPIPE, SIG_IGN);
15216398Sedward 	(void) sigsetmask(s);
15313962Sedward 	return 0;
15414407Sedward bad:
15514662Sedward 	/*
15614662Sedward 	 * Don't bother to free storage.  We're supposed
15714662Sedward 	 * to exit when wwinit fails anyway.
15814662Sedward 	 */
15917407Sedward 	(void) wwsettty(0, &wwoldtty, &wwnewtty);
16016111Sedward 	(void) signal(SIGIO, SIG_DFL);
16116398Sedward 	(void) sigsetmask(s);
16214407Sedward 	return -1;
16313925Sedward }
16414135Sedward 
16516494Sedward wwaddcap(cap, kp)
16614135Sedward register char *cap;
16716231Sedward register char **kp;
16814135Sedward {
16914407Sedward 	char tbuf[512];
17014407Sedward 	char *tp = tbuf;
17114287Sedward 	register char *str, *p;
17214135Sedward 
17314135Sedward 	if ((str = tgetstr(cap, &tp)) != 0) {
17416231Sedward 		while (*(*kp)++ = *cap++)
17514135Sedward 			;
17616231Sedward 		(*kp)[-1] = '=';
17714287Sedward 		while (*str) {
17816231Sedward 			for (p = unctrl(*str++); *(*kp)++ = *p++;)
17914287Sedward 				;
18016231Sedward 			(*kp)--;
18114287Sedward 		}
18216231Sedward 		*(*kp)++ = ':';
18316231Sedward 		**kp = 0;
18414135Sedward 	}
18514135Sedward }
186