xref: /csrg-svn/lib/libcurses/setterm.c (revision 3786)
12243Sarnold /*
22243Sarnold  * Terminal initialization routines.
32243Sarnold  *
4*3786Sarnold  * 05/15/81 (Berkeley) @(#)setterm.c	1.4
52243Sarnold  */
62243Sarnold 
72243Sarnold # undef	DEBUG
82243Sarnold 
92243Sarnold # include	"curses.ext"
102243Sarnold # include	"cr_ex.h"
112243Sarnold 
122243Sarnold static bool	*sflags[]	= {
132243Sarnold 			&AM, &BS, &EO, &HZ, &IN, &MI, &MS, &NC, &OS, &UL, &XN
142243Sarnold 		};
152243Sarnold 
162243Sarnold static char	*xPC,
172243Sarnold 		**sstrs[]	= {
182243Sarnold 			&AL, &BC,  &BT, &CD, &CE, &CL, &CM, &DC, &DL,
192243Sarnold 			&DM, &DO,  &ED, &EI, &HO, &IC, &IM, &IP, &LL,
202243Sarnold 			&MA, &ND, &xPC, &SE, &SF, &SO, &SR, &TA, &TE,
212243Sarnold 			&TI, &UC,  &UE, &UP, &US, &VB, &VS, &VE
222243Sarnold 		},
232465Sarnold 		*tgoto();
242243Sarnold 
252243Sarnold static char	tspace[128],		/* Space for capability strings */
262243Sarnold 		*aoftspace;		/* Address of tspace for relocation */
272243Sarnold 
282243Sarnold static int	destcol, destline;
292243Sarnold 
302243Sarnold /*
312243Sarnold  *	This routine does terminal type initialization routines, and
322243Sarnold  * calculation of flags at entry.  It is almost entirely stolen from
332243Sarnold  * Bill Joy's ex version 2.6.
342243Sarnold  */
352243Sarnold short	ospeed = -1;
362243Sarnold 
372243Sarnold gettmode() {
382243Sarnold 
392243Sarnold 	if (gtty(_tty_ch, &_tty) < 0)
402243Sarnold 		return;
412243Sarnold 	savetty();
422243Sarnold 	if (stty(_tty_ch, &_tty) < 0)
432243Sarnold 		_tty.sg_flags = _res_flg;
442243Sarnold 	ospeed = _tty.sg_ospeed;
452243Sarnold 	_res_flg = _tty.sg_flags;
462243Sarnold 	UPPERCASE = (_tty.sg_flags & LCASE) != 0;
472243Sarnold 	GT = ((_tty.sg_flags & XTABS) == 0);
482243Sarnold 	NONL = ((_tty.sg_flags & CRMOD) == 0);
493631Sarnold 	_tty.sg_flags &= ~XTABS;
502243Sarnold # ifdef DEBUG
512243Sarnold 	fprintf(outf, "GETTMODE: UPPERCASE = %s\n", UPPERCASE ? "TRUE":"FALSE");
522243Sarnold 	fprintf(outf, "GETTMODE: GT = %s\n", GT ? "TRUE" : "FALSE");
532243Sarnold 	fprintf(outf, "GETTMODE: NONL = %s\n", NONL ? "TRUE" : "FALSE");
542243Sarnold 	fprintf(outf, "GETTMODE: ospeed = %d\n", ospeed);
552243Sarnold # endif
562243Sarnold }
572243Sarnold 
582243Sarnold setterm(type)
592243Sarnold reg char	*type; {
602243Sarnold 
612243Sarnold 	reg int	unknown;
622243Sarnold 	char	genbuf[1024];
632243Sarnold 
642243Sarnold # ifdef DEBUG
652243Sarnold 	fprintf(outf, "SETTERM(\"%s\")\n", type);
662243Sarnold 	fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
672243Sarnold # endif
682243Sarnold 	if (type[0] == '\0')
692243Sarnold 		type = "xx";
702243Sarnold 	unknown = FALSE;
712243Sarnold 	if (tgetent(genbuf, type) != 1) {
722243Sarnold 		unknown++;
732243Sarnold 		strcpy(genbuf, "xx|dumb:");
742243Sarnold 	}
752243Sarnold # ifdef DEBUG
762243Sarnold 	fprintf(outf, "SETTERM: tty = %s\n", type);
772243Sarnold # endif
782243Sarnold 	if (LINES == 0)
792243Sarnold 		LINES = tgetnum("li");
802243Sarnold 	if (LINES <= 5)
812243Sarnold 		LINES = 24;
822243Sarnold 	else if (LINES > 48)
832243Sarnold 		LINES = 48;
842243Sarnold 
852243Sarnold 	if (COLS == 0)
862243Sarnold 		COLS = tgetnum("co");
872243Sarnold 	if (COLS <= 4)
882243Sarnold 		COLS = 80;
892243Sarnold 	else if (COLS > 1000)
902243Sarnold 		COLS = 1000;
912243Sarnold # ifdef DEBUG
922243Sarnold 	fprintf(outf, "SETTERM: LINES = %d, COLS = %d\n", LINES, COLS);
932243Sarnold # endif
942243Sarnold 	aoftspace = tspace;
952243Sarnold 	zap();			/* get terminal description		*/
962243Sarnold 	if (tgoto(CM, destcol, destline)[0] == 'O')
972243Sarnold 		CA = FALSE, CM = 0;
982243Sarnold 	else
992243Sarnold 		CA = TRUE;
1002243Sarnold 	PC = xPC ? xPC[0] : FALSE;
1012243Sarnold 	aoftspace = tspace;
1022243Sarnold 	strcpy(ttytype, longname(genbuf, type));
1032243Sarnold 	if (unknown)
1042243Sarnold 		return ERR;
1052243Sarnold 	return OK;
1062243Sarnold }
1072243Sarnold /*
1082243Sarnold  *	This routine gets all the terminal falgs from the termcap database
1092243Sarnold  */
1102243Sarnold zap() {
1112243Sarnold 
1122243Sarnold 	reg bool	**fp;
1132243Sarnold 	reg char	*namp, ***sp;
1142243Sarnold 	extern char	*tgetstr();
1152243Sarnold 
1162243Sarnold 	/*
1172243Sarnold 	 * get boolean flags
1182243Sarnold 	 */
1192243Sarnold  	namp = "ambseohzinmimsncosulxn\0\0";
1202243Sarnold # ifdef FULLDEBUG
1212243Sarnold 	fprintf(outf, "ZAP: namp = \"%s\"\n", namp);
1222243Sarnold # endif
1232243Sarnold 	fp = sflags;
1242243Sarnold 	do {
1252243Sarnold 		*(*fp++) = tgetflag(namp);
1262243Sarnold # ifdef FULLDEBUG
1272243Sarnold 		fprintf(outf, "ZAP: %.2s = %d", namp, *(*(fp - 1)));
1282243Sarnold # endif
1292243Sarnold 		namp += 2;
1302243Sarnold 	} while (*namp);
1312243Sarnold 
1322243Sarnold 	/*
1332243Sarnold 	 * get string values
1342243Sarnold 	 */
1352243Sarnold 	namp = "albcbtcdceclcmdcdldmdoedeihoicimipllmandpcsesfsosrtatetiucueupusvbvsve";
1362243Sarnold # ifdef FULLDEBUG
1372243Sarnold 	fprintf(outf, "ZAP: namp = \"%s\"\n", namp);
1382243Sarnold # endif
1392243Sarnold 	sp = sstrs;
1402243Sarnold 	do {
1412243Sarnold 		*(*sp++) = tgetstr(namp, &aoftspace);
1422243Sarnold # ifdef FULLDEBUG
1432243Sarnold 		fprintf(outf, "ZAP: %.2s = \"%s\"\n", namp, *(*(sp-1)));
1442243Sarnold # endif
1452243Sarnold 		namp += 2;
1462243Sarnold 	} while (*namp);
1472243Sarnold 	if (!SO && US) {
1482243Sarnold 		SO = US;
1492243Sarnold 		SE = UE;
1502243Sarnold 	}
1512243Sarnold }
152*3786Sarnold 
153*3786Sarnold /*
154*3786Sarnold  * return a capability from termcap
155*3786Sarnold  */
156*3786Sarnold char *
157*3786Sarnold getcap(name)
158*3786Sarnold char *name;
159*3786Sarnold {
160*3786Sarnold 	return tgetent(name, &aoftspace);
161*3786Sarnold }
162