* Copyright (c) 1988 Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
static char sccsid
[] = "@(#)hack.tty.c 5.2 (Berkeley) 7/22/88";
/* 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");