xref: /csrg-svn/lib/libcurses/setterm.c (revision 12570)
12243Sarnold /*
22243Sarnold  * Terminal initialization routines.
32243Sarnold  *
4*12570Sarnold  * 05/19/83 (Berkeley) @(#)setterm.c	1.13
52243Sarnold  */
62243Sarnold 
72243Sarnold # include	"curses.ext"
82243Sarnold 
92243Sarnold static bool	*sflags[]	= {
102243Sarnold 			&AM, &BS, &EO, &HZ, &IN, &MI, &MS, &NC, &OS, &UL, &XN
112243Sarnold 		};
122243Sarnold 
132243Sarnold static char	*xPC,
142243Sarnold 		**sstrs[]	= {
155881Sarnold 			&AL, &BC, &BT, &CD,  &CE, &CL, &CM, &CR, &DC,
165881Sarnold 			&DL, &DM, &DO, &ED,  &EI, &HO, &IC, &IM, &IP,
175881Sarnold 			&LL, &MA, &ND, &NL, &xPC, &SE, &SF, &SO, &SR,
185881Sarnold 			&TA, &TE, &TI, &UC,  &UE, &UP, &US, &VB, &VS,
195881Sarnold 			&VE
202243Sarnold 		},
212465Sarnold 		*tgoto();
222243Sarnold 
234699Sarnold static char	tspace[256],		/* Space for capability strings */
242243Sarnold 		*aoftspace;		/* Address of tspace for relocation */
252243Sarnold 
262243Sarnold static int	destcol, destline;
272243Sarnold 
282243Sarnold /*
292243Sarnold  *	This routine does terminal type initialization routines, and
302243Sarnold  * calculation of flags at entry.  It is almost entirely stolen from
312243Sarnold  * Bill Joy's ex version 2.6.
322243Sarnold  */
332243Sarnold short	ospeed = -1;
342243Sarnold 
352243Sarnold gettmode() {
362243Sarnold 
372243Sarnold 	if (gtty(_tty_ch, &_tty) < 0)
382243Sarnold 		return;
392243Sarnold 	savetty();
402243Sarnold 	if (stty(_tty_ch, &_tty) < 0)
412243Sarnold 		_tty.sg_flags = _res_flg;
422243Sarnold 	ospeed = _tty.sg_ospeed;
432243Sarnold 	_res_flg = _tty.sg_flags;
442243Sarnold 	UPPERCASE = (_tty.sg_flags & LCASE) != 0;
452243Sarnold 	GT = ((_tty.sg_flags & XTABS) == 0);
462243Sarnold 	NONL = ((_tty.sg_flags & CRMOD) == 0);
473631Sarnold 	_tty.sg_flags &= ~XTABS;
484612Sarnold 	stty(_tty_ch, &_tty);
492243Sarnold # ifdef DEBUG
502243Sarnold 	fprintf(outf, "GETTMODE: UPPERCASE = %s\n", UPPERCASE ? "TRUE":"FALSE");
512243Sarnold 	fprintf(outf, "GETTMODE: GT = %s\n", GT ? "TRUE" : "FALSE");
522243Sarnold 	fprintf(outf, "GETTMODE: NONL = %s\n", NONL ? "TRUE" : "FALSE");
532243Sarnold 	fprintf(outf, "GETTMODE: ospeed = %d\n", ospeed);
542243Sarnold # endif
552243Sarnold }
562243Sarnold 
572243Sarnold setterm(type)
582243Sarnold reg char	*type; {
592243Sarnold 
6011736Sarnold 	reg int		unknown;
6111736Sarnold 	static char	genbuf[1024];
622243Sarnold 
632243Sarnold # ifdef DEBUG
642243Sarnold 	fprintf(outf, "SETTERM(\"%s\")\n", type);
652243Sarnold 	fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
662243Sarnold # endif
672243Sarnold 	if (type[0] == '\0')
682243Sarnold 		type = "xx";
692243Sarnold 	unknown = FALSE;
702243Sarnold 	if (tgetent(genbuf, type) != 1) {
712243Sarnold 		unknown++;
722243Sarnold 		strcpy(genbuf, "xx|dumb:");
732243Sarnold 	}
742243Sarnold # ifdef DEBUG
752243Sarnold 	fprintf(outf, "SETTERM: tty = %s\n", type);
762243Sarnold # endif
772243Sarnold 	if (LINES == 0)
782243Sarnold 		LINES = tgetnum("li");
792243Sarnold 	if (LINES <= 5)
802243Sarnold 		LINES = 24;
812243Sarnold 
822243Sarnold 	if (COLS == 0)
832243Sarnold 		COLS = tgetnum("co");
842243Sarnold 	if (COLS <= 4)
852243Sarnold 		COLS = 80;
86*12570Sarnold 
872243Sarnold # ifdef DEBUG
882243Sarnold 	fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
892243Sarnold # endif
902243Sarnold 	aoftspace = tspace;
912243Sarnold 	zap();			/* get terminal description		*/
922243Sarnold 	if (tgoto(CM, destcol, destline)[0] == 'O')
932243Sarnold 		CA = FALSE, CM = 0;
942243Sarnold 	else
952243Sarnold 		CA = TRUE;
962243Sarnold 	PC = xPC ? xPC[0] : FALSE;
972243Sarnold 	aoftspace = tspace;
982243Sarnold 	strcpy(ttytype, longname(genbuf, type));
992243Sarnold 	if (unknown)
1002243Sarnold 		return ERR;
1012243Sarnold 	return OK;
1022243Sarnold }
1032243Sarnold /*
1044616Sarnold  *	This routine gets all the terminal flags from the termcap database
1052243Sarnold  */
1062243Sarnold zap() {
1072243Sarnold 
1082243Sarnold 	reg bool	**fp;
1092243Sarnold 	reg char	*namp, ***sp;
1104616Sarnold 	reg int		SG, UG;
1112243Sarnold 	extern char	*tgetstr();
1122243Sarnold 
1132243Sarnold 	/*
1142243Sarnold 	 * get boolean flags
1152243Sarnold 	 */
1162243Sarnold  	namp = "ambseohzinmimsncosulxn\0\0";
1172243Sarnold # ifdef FULLDEBUG
1182243Sarnold 	fprintf(outf, "ZAP: namp = \"%s\"\n", namp);
1192243Sarnold # endif
1202243Sarnold 	fp = sflags;
1212243Sarnold 	do {
1222243Sarnold 		*(*fp++) = tgetflag(namp);
1232243Sarnold # ifdef FULLDEBUG
1242243Sarnold 		fprintf(outf, "ZAP: %.2s = %d", namp, *(*(fp - 1)));
1252243Sarnold # endif
1262243Sarnold 		namp += 2;
1272243Sarnold 	} while (*namp);
1282243Sarnold 
1292243Sarnold 	/*
1302243Sarnold 	 * get string values
1312243Sarnold 	 */
1325881Sarnold 	namp = "albcbtcdceclcmcrdcdldmdoedeihoicimipllmandnlpcsesfsosrtatetiucueupusvbvsve";
1332243Sarnold # ifdef FULLDEBUG
1342243Sarnold 	fprintf(outf, "ZAP: namp = \"%s\"\n", namp);
1352243Sarnold # endif
1362243Sarnold 	sp = sstrs;
1372243Sarnold 	do {
1382243Sarnold 		*(*sp++) = tgetstr(namp, &aoftspace);
1392243Sarnold # ifdef FULLDEBUG
1402243Sarnold 		fprintf(outf, "ZAP: %.2s = \"%s\"\n", namp, *(*(sp-1)));
1412243Sarnold # endif
1422243Sarnold 		namp += 2;
1432243Sarnold 	} while (*namp);
1444616Sarnold 	SG = tgetnum("sg");
1454616Sarnold 	UG = tgetnum("ug");
1466424Sarnold 	if ((SG > 0 || !SO) && (UG <= 0 && US)) {
1472243Sarnold 		SO = US;
1482243Sarnold 		SE = UE;
1492243Sarnold 	}
1502243Sarnold }
1513786Sarnold 
1523786Sarnold /*
1533786Sarnold  * return a capability from termcap
1543786Sarnold  */
1553786Sarnold char *
1563786Sarnold getcap(name)
1573786Sarnold char *name;
1583786Sarnold {
1594616Sarnold 	char *tgetstr();
1604615Sarnold 
1614616Sarnold 	return tgetstr(name, &aoftspace);
1623786Sarnold }
163