This is tcapsysv.h in view mode; [Download] [Up]
/* tcapsysv.h */
char id_tcapsysv[] = "$Id: tcapsysv.h,v 2.7 1996/04/28 18:18:27 steve Exp $";
#include <termio.h>
#include <signal.h>
#include <unistd.h>
/* HPUX does a "#define ttysize winsize". Elvis doesn't like that. */
#undef ttysize
static struct termio oldtermio; /* original tty mode */
static struct termio newtermio; /* cbreak/noecho tty mode */
/* signal catching function */
void catchsig(signo)
int signo;
{
caught |= (1<<signo);
}
/* remember the original tty state */
void ttyinit()
{
/* get the old tty state */
ioctl(0, TCGETA, &oldtermio);
}
/* switch back to the original tty state */
void ttynormal()
{
ioctl(0, TCSETAW, &oldtermio);
}
/* switch to the tty state that elvis runs in */
void ttyraw(erasekey)
char *erasekey; /* where to store the ERASE key */
{
/* arrange for signals to be caught or ignored */
signal(SIGHUP, catchsig);
signal(SIGINT, catchsig);
#ifdef SIGWINCH
signal(SIGWINCH, catchsig);
#endif
signal(SIGQUIT, SIG_IGN);
ospeed = (oldtermio.c_cflag & CBAUD);
*erasekey = oldtermio.c_cc[VERASE];
newtermio = oldtermio;
# ifdef IXANY
newtermio.c_iflag &= (IXON|IXOFF|IXANY|ISTRIP|IGNBRK);
# else
newtermio.c_iflag &= (IXON|IXOFF|ISTRIP|IGNBRK);
# endif
newtermio.c_oflag &= ~OPOST;
newtermio.c_lflag &= ISIG;
newtermio.c_cc[VINTR] = ELVCTRL('C'); /* always use ^C for interrupts */
newtermio.c_cc[VMIN] = 1;
newtermio.c_cc[VTIME] = 0;
# ifdef VSWTCH
newtermio.c_cc[VSWTCH] = 0;
# endif
# ifdef VSWTC
newtermio.c_cc[VSWTC] = 0;
# endif
# ifdef VSUSP
# if VSUSP < NCC
newtermio.c_cc[VSUSP] = 0;
# endif
# endif
# ifdef VDSUSP
newtermio.c_cc[VSUSP] = 0;
# endif
ioctl(0, TCSETAW, &newtermio);
}
/* For System-V, we use VMIN/VTIME to implement the timeout. For no
* timeout, VMIN should be 1 and VTIME should be 0; for timeout, VMIN
* should be 0 and VTIME should be the timeout value.
*/
int ttyread(buf, len, timeout)
char *buf; /* where to store the input characters */
int len; /* maximum number of characters to read */
int timeout;/* timeout (or 0 for none) */
{
struct termio t, oldt;
int bytes; /* number of bytes actually read */
/* reset the "caught" variable */
caught = 0;
/* make sure the signal handler is still in place */
signal(SIGHUP, catchsig);
signal(SIGINT, catchsig);
#ifdef SIGWINCH
signal(SIGWINCH, catchsig);
#endif
/* arrange for timeout, and disable special keys */
ioctl(0, TCGETA, &t);
oldt = t;
if (timeout)
{
t.c_cc[VMIN] = 0;
t.c_cc[VTIME] = timeout;
}
else
{
t.c_cc[VMIN] = 1;
t.c_cc[VTIME] = 0;
}
t.c_cc[VINTR] = t.c_cc[VQUIT] = 0;
#ifdef VSTART
t.c_cc[VSTART] = t.c_cc[VSTOP] = 0;
#endif
ioctl(0, TCSETA, &t);
/* Perform the read. */
bytes = read(0, buf, (unsigned)len);
/* set the tty back to ordinary raw mode */
ioctl(0, TCSETA, &oldt);
/* return the number of bytes read */
return bytes;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.