* Copyright (c) 1991 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
static char sccsid
[] = "@(#)set.c 5.2 (Berkeley) 12/24/91";
#define CHK(val, dft) (val <= 0 ? dft : val)
int set_tabs
__P((void));
* Reset the terminal mode bits to a sensible state. Very useful after
* a child program dies in raw mode.
tcgetattr(STDERR_FILENO
, &mode
);
#if defined(VDISCARD) && defined(CDISCARD)
mode
.c_cc
[VDISCARD
] = CHK(mode
.c_cc
[VDISCARD
], CDISCARD
);
mode
.c_cc
[VEOF
] = CHK(mode
.c_cc
[VEOF
], CEOF
);
mode
.c_cc
[VERASE
] = CHK(mode
.c_cc
[VERASE
], CERASE
);
#if defined(VFLUSH) && defined(CFLUSH)
mode
.c_cc
[VFLUSH
] = CHK(mode
.c_cc
[VFLUSH
], CFLUSH
);
mode
.c_cc
[VINTR
] = CHK(mode
.c_cc
[VINTR
], CINTR
);
mode
.c_cc
[VKILL
] = CHK(mode
.c_cc
[VKILL
], CKILL
);
#if defined(VLNEXT) && defined(CLNEXT)
mode
.c_cc
[VLNEXT
] = CHK(mode
.c_cc
[VLNEXT
], CLNEXT
);
mode
.c_cc
[VQUIT
] = CHK(mode
.c_cc
[VQUIT
], CQUIT
);
#if defined(VREPRINT) && defined(CRPRNT)
mode
.c_cc
[VREPRINT
] = CHK(mode
.c_cc
[VREPRINT
], CRPRNT
);
mode
.c_cc
[VSTART
] = CHK(mode
.c_cc
[VSTART
], CSTART
);
mode
.c_cc
[VSTOP
] = CHK(mode
.c_cc
[VSTOP
], CSTOP
);
mode
.c_cc
[VSUSP
] = CHK(mode
.c_cc
[VSUSP
], CSUSP
);
#if defined(VWERASE) && defined(CWERASE)
mode
.c_cc
[VWERASE
] = CHK(mode
.c_cc
[VWERASE
], CWERASE
);
mode
.c_iflag
&= ~(IGNBRK
| PARMRK
| INPCK
| ISTRIP
| INLCR
| IGNCR
mode
.c_iflag
|= (BRKINT
| IGNPAR
| ICRNL
| IXON
| NLDLY
| CRDLY
| TABDLY
| BSDLY
| VTDLY
| FFDLY
mode
.c_cflag
&= ~(CSIZE
| CSTOPB
| PARENB
| PARODD
| CLOCAL
);
mode
.c_cflag
|= (CS8
| CREAD
);
mode
.c_lflag
&= ~(ECHONL
| NOFLSH
| TOSTOP
mode
.c_lflag
|= (ISIG
| ICANON
| ECHO
| ECHOE
| ECHOK
tcsetattr(STDERR_FILENO
, TCSADRAIN
, &mode
);
* Determine the erase, interrupt, and kill characters from the termcap
* entry and command line and update their values in 'mode'.
char *bp
, *p
, bs_char
, buf
[1024];
if (p
== NULL
|| p
[1] != '\0')
if (p
!= NULL
&& p
[1] == '\0')
if (erasechar
== 0 && !tgetflag("os") && mode
.c_cc
[VERASE
] != CERASE
) {
if (tgetflag("bs") || bs_char
!= 0)
erasechar
= (bs_char
!= 0) ? bs_char
: CTRL('h');
if (mode
.c_cc
[VERASE
] == 0 || erasechar
!= 0)
mode
.c_cc
[VERASE
] = erasechar
? erasechar
: CERASE
;
if (mode
.c_cc
[VINTR
] == 0 || intrchar
!= 0)
mode
.c_cc
[VINTR
] = intrchar
? intrchar
: CINTR
;
if (mode
.c_cc
[VKILL
] == 0 || killchar
!= 0)
mode
.c_cc
[VKILL
] = killchar
? killchar
: CKILL
;
* Set up various conversions in 'mode', including parity, tabs, returns,
* echo, and case, according to the termcap entry. If the program we're
* running was named with a leading upper-case character, map external
* uppercase to internal lowercase.
set_conversions(usingupper
)
if (tgetflag("UC") || usingupper
) {
} else if (tgetflag("LC")) {
mode
.c_iflag
&= ~(PARMRK
| INPCK
);
if (tgetflag("NL")) { /* Newline, not linefeed. */
if (tgetflag("HD")) /* Half duplex. */
if (tgetflag("pt")) /* Print tabs. */
mode
.c_lflag
|= (ECHOE
| ECHOK
);
/* Output startup string. */
if (tgetstr("pc", &bp
) != 0) /* Get/set pad character. */
if (oldmode
.c_oflag
& (TAB3
| ONLCR
| OCRNL
| ONLRET
)) {
oldmode
.c_oflag
&= (TAB3
| ONLCR
| OCRNL
| ONLRET
);
tcsetattr(STDERR_FILENO
, TCSADRAIN
, &oldmode
);
if (tgetstr("rs", &bp
) != 0 || tgetstr("is", &bp
) != 0) {
if (tgetstr("rf", &bp
) != 0 || tgetstr("if", &bp
) != 0) {
(void)putc('\r', stderr
);
(void)sleep(1); /* Settle the terminal. */
* Set the hardware tabs on the terminal, using the ct (clear all tabs),
* st (set one tab) and ch (horizontal cursor addressing) capabilities.
* This is done before if and is, so they can patch in case we blow this.
* Return nonzero if we set any tab stops, zero if not.
char *capsp
, *clear_tabs
;
char *set_column
, *set_pos
, *set_tab
, *tg_out
;
set_tab
= tgetstr("st", &capsp
);
if (set_tab
&& (clear_tabs
= tgetstr("ct", &capsp
))) {
(void)putc('\r', stderr
); /* Force to left margin. */
tputs(clear_tabs
, 0, outc
);
set_column
= tgetstr("ch", &capsp
);
set_pos
= set_column
? NULL
: tgetstr("cm", &capsp
);
for (c
= 8; c
< columns
; c
+= 8) {
* Get to the right column. "OOPS" is returned by
* tgoto() if it can't do the job. (*snarl*)
tg_out
= tgoto(set_column
, 0, c
);
if (*tg_out
== 'O' && set_pos
)
tg_out
= tgoto(set_pos
, c
, lines
- 1);
(void)fprintf(stderr
, "%s", " ");