+/* $NetBSD: hack.tty.c,v 1.9 2001/03/25 20:44:03 jsm 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
* SUCH DAMAGE.
*/
+#include <sys/cdefs.h>
#ifndef lint
-/*static char sccsid[] = "from: @(#)hack.tty.c 5.3 (Berkeley) 5/13/91";*/
-static char rcsid[] = "$Id: hack.tty.c,v 1.2 1993/08/01 18:54:35 mycroft Exp $";
-#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.9 2001/03/25 20:44:03 jsm 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. */
-
-#include "hack.h"
-#include <stdio.h>
-
/*
- * 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 <termios.h>
+#include <termcap.h>
+#include "hack.h"
+#include "extern.h"
/*
* Some systems may have getchar() return EOF for various reasons, and
*/
#ifndef BSD
#define NR_OF_EOFS 20
-#endif BSD
-
+#endif /* BSD */
-#ifdef USG
-
-#include <termio.h>
-#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 <sgtty.h>
-#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
-
-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();
/* fatal error */
-/*VARARGS1*/
-error(s,x,y) char *s; {
- if(settty_needed)
+/* VARARGS1 */
+void
+#ifdef __STDC__
+error(const char *fmt, ...)
+#else
+error(va_alist)
+ va_dcl
+#endif
+{
+ va_list ap;
+#ifndef __STDC__
+ const char *fmt;
+
+ va_start(ap);
+ fmt = va_arg(ap, const char *);
+#else
+ va_start(ap, fmt);
+#endif
+ if (settty_needed)
settty((char *) 0);
- printf(s,x,y);
+ vprintf(fmt, ap);
+ va_end(ap);
putchar('\n');
exit(1);
}
* 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");
}
}
}
-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");