#include #undef TERMIOSECHO
#define TERMIOSFLUSH
/*
* kbhit() -- a keyboard lookahead monitor
*
* returns the number of characters available to read
*/
static int kbhit ( void )
{
struct timeval tv;
struct termios old_termios, new_termios;
int error;
int count = 0;
tcgetattr( 0, &old_termios );
new_termios = old_termios;
/*
* raw mode
*/
new_termios.c_lflag &= ~ICANON;
/*
* disable echoing the char as it is typed
*/
new_termios.c_lflag &= ~ECHO;
/*
* minimum chars to wait for
*/
new_termios.c_cc[VMIN] = 1;
/*
* minimum wait time, 1 * 0.10s
*/
new_termios.c_cc[VTIME] = 1;
error = tcsetattr( 0, TCSANOW, &new_termios );
tv.tv_sec = 0;
tv.tv_usec = 100;
/*
* insert a minimal delay
*/
select( 1, NULL, NULL, NULL, &tv );
error += ioctl( 0, FIONREAD, &count );
error += tcsetattr( 0, TCSANOW, &old_termios );
return( error == 0 ? count : -1 );
} /* end of kbhit */