* Copyright (c) 1981, 1993, 1994
* The Regents of the University of California. All rights reserved.
* %sccs.include.redist.c%
static char sccsid
[] = "@(#)setterm.c 8.5 (Berkeley) %G%";
#include <sys/ioctl.h> /* TIOCGWINSZ on old systems. */
static void zap
__P((void));
static char *sflags
[] = {
/* am bs da eo hc in mi ms */
&AM
, &BS
, &DA
, &EO
, &HC
, &IN
, &MI
, &MS
,
/* nc ns os ul xb xn xt xs xx */
&NC
, &NS
, &OS
, &UL
, &XB
, &XN
, &XT
, &XS
, &XX
/* AL bc bt cd ce cl cm cr cs */
&AL
, &BC
, &BT
, &CD
, &CE
, &CL
, &CM
, &CR
, &CS
,
/* dc DL dm do ed ei k0 k1 k2 */
&DC
, &DL
, &DM
, &DO
, &ED
, &EI
, &K0
, &K1
, &K2
,
/* k3 k4 k5 k6 k7 k8 k9 ho ic */
&K3
, &K4
, &K5
, &K6
, &K7
, &K8
, &K9
, &HO
, &IC
,
/* im ip kd ke kh kl kr ks ku */
&IM
, &IP
, &KD
, &KE
, &KH
, &KL
, &KR
, &KS
, &KU
,
/* ll ma nd nl pc rc sc se SF */
&LL
, &MA
, &ND
, &NL
, &_PC
, &RC
, &SC
, &SE
, &SF
,
/* so SR ta te ti uc ue up us */
&SO
, &SR
, &TA
, &TE
, &TI
, &UC
, &UE
, &UP
, &US
,
/* vb vs ve al dl sf sr AL */
&VB
, &VS
, &VE
, &al
, &dl
, &sf
, &sr
, &AL_PARM
,
&DL_PARM
, &UP_PARM
, &DOWN_PARM
, &LEFT_PARM
,
static char *aoftspace
; /* Address of _tspace for relocation */
static char tspace
[2048]; /* Space for capability strings */
static char genbuf
[1024];
static char __ttytype
[1024];
__CTRACE("setterm: (\"%s\")\nLINES = %d, COLS = %d\n",
if (tgetent(genbuf
, type
) != 1) {
strcpy(genbuf
, "xx|dumb:");
__CTRACE("setterm: tty = %s\n", type
);
/* Try TIOCGWINSZ, and, if it fails, the termcap entry. */
if (ioctl(STDERR_FILENO
, TIOCGWINSZ
, &win
) != -1 &&
win
.ws_row
!= 0 && win
.ws_col
!= 0) {
/* POSIX 1003.2 requires that the environment override. */
if ((p
= getenv("LINES")) != NULL
)
LINES
= strtol(p
, NULL
, 10);
if ((p
= getenv("COLUMNS")) != NULL
)
COLS
= strtol(p
, NULL
, 10);
* Want cols > 4, otherwise things will fail.
__CTRACE("setterm: LINES = %d, COLS = %d\n", LINES
, COLS
);
zap(); /* Get terminal description. */
/* If we can't tab, we can't backtab, either. */
* Test for cursor motion capbility.
* This is truly stupid -- tgoto returns "OOPS" if it can't
if (tgoto(CM
, 0, 0)[0] == 'O') {
ttytype
= longname(genbuf
, __ttytype
);
if ((!AL
&& !al
) || (!DL
&& !dl
))
return (unknown
? ERR
: OK
);
* Gets all the terminal flags from the termcap database.
register char *namp
, ***sp
;
namp
= "ambsdaeohcinmimsncnsosulxbxnxtxsxx";
*(tmp
+ 1) = *(namp
+ 1);
*(*fp
++) = tgetflag(tmp
);
__CTRACE("2.2s = %s\n", namp
, *fp
[-1] ? "TRUE" : "FALSE");
namp
= "ALbcbtcdceclcmcrcsdcDLdmdoedeik0k1k2k3k4k5k6k7k8k9hoicimipkdkekhklkrkskullmandnlpcrcscseSFsoSRtatetiucueupusvbvsvealdlsfsrALDLUPDOLERI";
*(tmp
+ 1) = *(namp
+ 1);
*(*sp
++) = tgetstr(tmp
, &aoftspace
);
__CTRACE("2.2s = %s", namp
, *sp
[-1] == NULL
? "NULL\n" : "\"");
for (cp
= *sp
[-1]; *cp
; cp
++)
__CTRACE("%s", unctrl(*cp
));
* Return a capability from termcap.
return (tgetstr(name
, &aoftspace
));