[comp.sys.hp] CBREAK on HP-UX 5.5

decot@hpisod2.HP.COM (Dave Decot) (01/23/88)

/* Routines for managing nonechoing, one-character-at-a-time tty reads */

/* Dave Decot, hpda!decot, 851023 */

/* cbreak() - sets terminal up for one-char-at-a-time reads */
/* normal() - restores terminal to initial state */


#include <stdio.h>
#include <signal.h>
#include <sys/types.h>

#ifndef hpux		/* BSD style */
#   include <sgtty.h>
#else hpux		/* HP-UX style (and other System V systems) */
#   include <termio.h>
#endif hpux


static int tty_mode = 0;

#ifdef TCGETA
    static struct termio orig_tty;
    static struct termio new_tty;
#else
    static struct sgttyb orig_tty;
    static struct sgttyb new_tty;
#endif


cbreak()
{
    if (tty_mode == 0)
    {
#ifdef TCGETA
	ioctl(0, TCGETA, &orig_tty);
#else
	ioctl(0, TIOCGETP, &orig_tty);
#endif
	tty_mode = 1;
	new_tty = orig_tty;
    }

#ifdef ICANON
    new_tty.c_lflag &= ~(ICANON | ECHO);
    new_tty.c_cc[VMIN] = 1;
    new_tty.c_cc[VTIME] = 0;
    ioctl(0, TCSETA, &new_tty);
#else
    new_tty.sg_flags |= CBREAK;
    new_tty.sg_flags &= ~ECHO;
    ioctl(0, TIOCSETN, &new_tty);
#endif
}


normal()
{
    if (tty_mode == 1)
    {
#ifdef TCSETA
	ioctl(0, TCSETA, &orig_tty);
#else
	ioctl(0, TIOCSETN, &orig_tty);
#endif
	new_tty = orig_tty;
    }
}