* Copyright (c) 1988 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
[] = "@(#)hack.tty.c 5.3 (Berkeley) 5/13/91";
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* hack.tty.c - version 1.0.3 */
/* With thanks to the people who sent code for SYSV - hpscdi!jon,
arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others. */
* The distinctions here are not BSD - rest but rather USG - rest, as
* BSD still has the old sgttyb structure, but SYSV has termio. Thus:
* Some systems may have getchar() return EOF for various reasons, and
* we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
#define termstruct termio
#define kill_sym c_cc[VKILL]
#define erase_sym c_cc[VERASE]
#define CBRKON ! /* reverse condition */
#define OSPEED(x) ((x).c_cflag & CBAUD)
#define GTTY(x) (ioctl(0, TCGETA, x))
#define STTY(x) (ioctl(0, TCSETA, x)) /* TCSETAF? TCSETAW? */
#define termstruct sgttyb
#define erase_sym sg_erase
#define echoflgs sg_flags
#define cbrkflgs sg_flags
#define CBRKON /* empty */
#define OSPEED(x) (x).sg_ospeed
#define GTTY(x) (gtty(0, x))
#define STTY(x) (stty(0, x))
static char erase_char
, kill_char
;
static boolean settty_needed
= FALSE
;
struct termstruct inittyb
, curttyb
;
* Get initial state of terminal, set ospeed (for termcap routines)
* and switch off tab expansion if necessary.
* Called by startup() in termcap.c and after returning from ! or ^Z
ospeed
= OSPEED(inittyb
);
erase_char
= inittyb
.erase_sym
;
kill_char
= inittyb
.kill_sym
;
/* do not expand tabs - they might be needed inside a cm sequence */
if(curttyb
.tabflgs
& EXTABS
) {
curttyb
.tabflgs
&= ~EXTABS
;
/* reset terminal to original state */
flags
.echo
= (inittyb
.echoflgs
& ECHO
) ? ON
: OFF
;
flags
.cbreak
= (CBRKON(inittyb
.cbrkflgs
& CBRKMASK
)) ? ON
: OFF
;
perror("Hack (setctty)");
register int ef
= 0; /* desired value of flags & ECHO */
register int cf
= CBRKON(CBRKMASK
); /* desired value of flags & CBREAK */
/* Should use (ECHO|CRMOD) here instead of ECHO */
if((curttyb
.echoflgs
& ECHO
) != ef
){
curttyb
.echoflgs
&= ~ECHO
;
/* curttyb.echoflgs |= ef; */
if((curttyb
.cbrkflgs
& CBRKMASK
) != cf
){
curttyb
.cbrkflgs
&= ~CBRKMASK
;
/* be satisfied with one character; no timeout */
curttyb
.c_cc
[VMIN
] = 1; /* was VEOF */
curttyb
.c_cc
[VTIME
] = 0; /* was VEOL */
* Read a line closed with '\n' into the array char bufp[BUFSZ].
* (The '\n' is not stored. The string is closed with a '\0'.)
* Reading can be interrupted by an escape ('\033') - now the
* resulting string is "\033".
register char *obufp
= bufp
;
flags
.toplin
= 2; /* nonempty, no --More-- required */
if((c
= getchar()) == EOF
) {
if(c
== erase_char
|| c
== '\b') {
putstr("\b \b"); /* putsym converts \b */
} else if(' ' <= c
&& c
< '\177') {
/* avoid isprint() - some people don't have it
' ' is not always a printing char */
if(bufp
-obufp
< BUFSZ
-1 && bufp
-obufp
< COLNO
)
} else if(c
== kill_char
|| c
== '\177') { /* Robert Viduya */
/* this test last - @ might be the kill_char */
putstr(flags
.cbreak
? "space" : "return");
putstr(" to continue: ");
char morc
; /* tell the outside world what char he used */
register char *s
; /* chars allowed besides space or return */
while((c
= readchar()) != '\n') {
static char inputline
[COLNO
];
if(!Invisible
) curs_on_u(); else home();
while((foo
= readchar()) >= '0' && foo
<= '9')
multi
= 10*multi
+foo
-'0';
if(foo
== 'f' || foo
== 'F'){
inputline
[1] = getchar();
if(inputline
[1] == foo
) inputline
[2] = getchar(); else
if(foo
== 'm' || foo
== 'M'){
inputline
[1] = getchar();
if((sym
= getchar()) == EOF
)
* Some SYSV systems seem to return EOFs for various reasons
* (?like when one hits break or for interrupted systemcalls?),
* and we must see several before we quit.
register int cnt
= NR_OF_EOFS
;
clearerr(stdin
); /* omit if clearerr is undefined */
if((sym
= getchar()) != EOF
) goto noteof
;
settty("End of input?\n");