X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/77e3814f0c0e3dea4d0032e25666f77e6f83bfff..3c3698066dc30e58a8df08ef915556b1836edb19:/hack/hack.tty.c diff --git a/hack/hack.tty.c b/hack/hack.tty.c index 68fefc4e..642225bb 100644 --- a/hack/hack.tty.c +++ b/hack/hack.tty.c @@ -1,6 +1,8 @@ +/* $NetBSD: hack.tty.c,v 1.12 2003/08/07 09:37:19 agc Exp $ */ + /*- - * Copyright (c) 1988 The Regents of the University of California. - * All rights reserved. + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,11 +12,7 @@ * 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 + * 3. 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. * @@ -31,27 +29,86 @@ * SUCH DAMAGE. */ +#include #ifndef lint -static char sccsid[] = "@(#)hack.tty.c 5.3 (Berkeley) 5/13/91"; -#endif /* not lint */ +#if 0 +static char sccsid[] = "@(#)hack.tty.c 8.1 (Berkeley) 5/31/93"; +#else +__RCSID("$NetBSD: hack.tty.c,v 1.12 2003/08/07 09:37:19 agc Exp $"); +#endif +#endif /* not lint */ -/* 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. */ +/* + * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica, + * Amsterdam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * - 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. + * + * - Neither the name of the Stichting Centrum voor Wiskunde en + * Informatica, 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER + * 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 SUCH DAMAGE. + */ -#include "hack.h" -#include +/* + * Copyright (c) 1982 Jay Fenlason + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 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. The name of the author 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 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 AUTHOR 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 SUCH DAMAGE. + */ +/* hack.tty.c - version 1.0.3 */ /* - * The distinctions here are not BSD - rest but rather USG - rest, as - * BSD still has the old sgttyb structure, but SYSV has termio. Thus: + * With thanks to the people who sent code for SYSV - hpscdi!jon, + * arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others. */ -#ifdef BSD -#define V7 -#else -#define USG -#endif BSD + +#include +#include +#include "hack.h" +#include "extern.h" /* * Some systems may have getchar() return EOF for various reasons, and @@ -59,112 +116,80 @@ static char sccsid[] = "@(#)hack.tty.c 5.3 (Berkeley) 5/13/91"; */ #ifndef BSD #define NR_OF_EOFS 20 -#endif BSD - - -#ifdef USG - -#include -#define termstruct termio -#define kill_sym c_cc[VKILL] -#define erase_sym c_cc[VERASE] -#define EXTABS TAB3 -#define tabflgs c_oflag -#define echoflgs c_lflag -#define cbrkflgs c_lflag -#define CBRKMASK ICANON -#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? */ - -#else /* V7 */ - -#include -#define termstruct sgttyb -#define kill_sym sg_kill -#define erase_sym sg_erase -#define EXTABS XTABS -#define tabflgs sg_flags -#define echoflgs sg_flags -#define cbrkflgs sg_flags -#define CBRKMASK CBREAK -#define CBRKON /* empty */ -#define OSPEED(x) (x).sg_ospeed -#define GTTY(x) (gtty(0, x)) -#define STTY(x) (stty(0, x)) - -#endif USG +#endif /* BSD */ -extern short ospeed; -static char erase_char, kill_char; -static boolean settty_needed = FALSE; -struct termstruct inittyb, curttyb; +static char erase_char, kill_char; +static boolean settty_needed = FALSE; +struct termios 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 */ -gettty(){ - if(GTTY(&inittyb) < 0) +void +gettty() +{ + if (tcgetattr(0, &inittyb) < 0) perror("Hack (gettty)"); curttyb = inittyb; - ospeed = OSPEED(inittyb); - erase_char = inittyb.erase_sym; - kill_char = inittyb.kill_sym; + ospeed = cfgetospeed(&inittyb); + erase_char = inittyb.c_cc[VERASE]; + kill_char = inittyb.c_cc[VKILL]; getioctls(); /* do not expand tabs - they might be needed inside a cm sequence */ - if(curttyb.tabflgs & EXTABS) { - curttyb.tabflgs &= ~EXTABS; + if (curttyb.c_oflag & OXTABS) { + curttyb.c_oflag &= ~OXTABS; setctty(); } settty_needed = TRUE; } /* reset terminal to original state */ -settty(s) char *s; { +void +settty(s) + const char *s; +{ clear_screen(); end_screen(); - if(s) printf(s); + if (s) + printf("%s", s); (void) fflush(stdout); - if(STTY(&inittyb) < 0) + if (tcsetattr(0, TCSADRAIN, &inittyb) < 0) perror("Hack (settty)"); - flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF; - flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF; + flags.echo = (inittyb.c_lflag & ECHO) ? ON : OFF; + flags.cbreak = (inittyb.c_lflag & ICANON) ? OFF : ON; setioctls(); } -setctty(){ - if(STTY(&curttyb) < 0) +void +setctty() +{ + if (tcsetattr(0, TCSADRAIN, &curttyb) < 0) perror("Hack (setctty)"); } -setftty(){ -register int ef = 0; /* desired value of flags & ECHO */ -register int cf = CBRKON(CBRKMASK); /* desired value of flags & CBREAK */ -register int change = 0; +void +setftty() +{ + int change = 0; flags.cbreak = ON; flags.echo = OFF; /* Should use (ECHO|CRMOD) here instead of ECHO */ - if((curttyb.echoflgs & ECHO) != ef){ - curttyb.echoflgs &= ~ECHO; -/* curttyb.echoflgs |= ef; */ + if (curttyb.c_lflag & ECHO) { + curttyb.c_lflag &= ~ECHO; change++; } - if((curttyb.cbrkflgs & CBRKMASK) != cf){ - curttyb.cbrkflgs &= ~CBRKMASK; - curttyb.cbrkflgs |= cf; -#ifdef USG + if (curttyb.c_lflag & ICANON) { + curttyb.c_lflag &= ~ICANON; /* be satisfied with one character; no timeout */ - curttyb.c_cc[VMIN] = 1; /* was VEOF */ - curttyb.c_cc[VTIME] = 0; /* was VEOL */ -#endif USG + curttyb.c_cc[VMIN] = 1; + curttyb.c_cc[VTIME] = 0; change++; } - if(change){ + if (change) { setctty(); } start_screen(); @@ -172,11 +197,17 @@ register int change = 0; /* fatal error */ -/*VARARGS1*/ -error(s,x,y) char *s; { - if(settty_needed) +/* VARARGS1 */ +void +error(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if (settty_needed) settty((char *) 0); - printf(s,x,y); + vprintf(fmt, ap); + va_end(ap); putchar('\n'); exit(1); } @@ -187,43 +218,47 @@ error(s,x,y) char *s; { * Reading can be interrupted by an escape ('\033') - now the * resulting string is "\033". */ +void getlin(bufp) -register char *bufp; + char *bufp; { - register char *obufp = bufp; - register int c; + char *obufp = bufp; + int c; - flags.toplin = 2; /* nonempty, no --More-- required */ - for(;;) { + flags.toplin = 2; /* nonempty, no --More-- required */ + for (;;) { (void) fflush(stdout); - if((c = getchar()) == EOF) { + if ((c = getchar()) == EOF) { *bufp = 0; return; } - if(c == '\033') { + if (c == '\033') { *obufp = c; obufp[1] = 0; return; } - if(c == erase_char || c == '\b') { - if(bufp != obufp) { + if (c == erase_char || c == '\b') { + if (bufp != obufp) { bufp--; - putstr("\b \b"); /* putsym converts \b */ - } else bell(); - } else if(c == '\n') { + putstr("\b \b"); /* putsym converts \b */ + } else + bell(); + } else if (c == '\n') { *bufp = 0; return; - } else if(' ' <= c && c < '\177') { - /* avoid isprint() - some people don't have it - ' ' is not always a printing char */ + } else if (' ' <= c && c < '\177') { + /* + * avoid isprint() - some people don't have it ' ' is + * not always a printing char + */ *bufp = c; bufp[1] = 0; putstr(bufp); - if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO) + if (bufp - obufp < BUFSZ - 1 && bufp - obufp < COLNO) bufp++; - } else if(c == kill_char || c == '\177') { /* Robert Viduya */ - /* this test last - @ might be the kill_char */ - while(bufp != obufp) { + } else if (c == kill_char || c == '\177') { /* Robert Viduya */ + /* this test last - @ might be the kill_char */ + while (bufp != obufp) { bufp--; putstr("\b \b"); } @@ -232,104 +267,118 @@ register char *bufp; } } -getret() { +void +getret() +{ cgetret(""); } +void cgetret(s) -register char *s; + const char *s; { putsym('\n'); - if(flags.standout) + if (flags.standout) standoutbeg(); putstr("Hit "); putstr(flags.cbreak ? "space" : "return"); putstr(" to continue: "); - if(flags.standout) + if (flags.standout) standoutend(); xwaitforspace(s); } -char morc; /* tell the outside world what char he used */ +char morc; /* tell the outside world what char he used */ +void xwaitforspace(s) -register char *s; /* chars allowed besides space or return */ + const char *s; /* chars allowed besides space or return */ { -register int c; + int c; morc = 0; - while((c = readchar()) != '\n') { - if(flags.cbreak) { - if(c == ' ') break; - if(s && index(s,c)) { - morc = c; - break; + while ((c = readchar()) != '\n') { + if (flags.cbreak) { + if (c == ' ') + break; + if (s && strchr(s, c)) { + morc = c; + break; + } + bell(); } - bell(); - } } } -char * +char * parse() { - static char inputline[COLNO]; - register foo; + static char inputline[COLNO]; + int foo; flags.move = 1; - if(!Invisible) curs_on_u(); else home(); - while((foo = readchar()) >= '0' && foo <= '9') - multi = 10*multi+foo-'0'; - if(multi) { + if (!Invisible) + curs_on_u(); + else + home(); + while ((foo = readchar()) >= '0' && foo <= '9') + multi = 10 * multi + foo - '0'; + if (multi) { multi--; save_cm = inputline; } inputline[0] = foo; inputline[1] = 0; - if(foo == 'f' || foo == 'F'){ + if (foo == 'f' || foo == 'F') { inputline[1] = getchar(); #ifdef QUEST - if(inputline[1] == foo) inputline[2] = getchar(); else -#endif QUEST - inputline[2] = 0; + if (inputline[1] == foo) + inputline[2] = getchar(); + else +#endif /* QUEST */ + inputline[2] = 0; } - if(foo == 'm' || foo == 'M'){ + if (foo == 'm' || foo == 'M') { inputline[1] = getchar(); inputline[2] = 0; } clrlin(); - return(inputline); + return (inputline); } char -readchar() { - register int sym; +readchar() +{ + int sym; (void) fflush(stdout); - if((sym = getchar()) == EOF) + if ((sym = getchar()) == EOF) #ifdef NR_OF_EOFS - { /* - * 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; + { /* + * 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. + */ + int cnt = NR_OF_EOFS; while (cnt--) { - clearerr(stdin); /* omit if clearerr is undefined */ - if((sym = getchar()) != EOF) goto noteof; + clearerr(stdin); /* omit if clearerr is + * undefined */ + if ((sym = getchar()) != EOF) + goto noteof; } end_of_input(); - noteof: ; +noteof: ; } #else end_of_input(); -#endif NR_OF_EOFS - if(flags.toplin == 1) +#endif /* NR_OF_EOFS */ + if (flags.toplin == 1) flags.toplin = 2; - return((char) sym); + return ((char) sym); } +void end_of_input() { settty("End of input?\n");