#include <stdio.h>
#include <unistd.h>
#include <termios.h>

enum{ERROR=-1, SUCCESS};

static struct termios new_io;
static struct termios old_io;


/*Funktion schaltet das Terminal in den cbreak-Modus: */
/*   Kontrollflag ECHO und ICANON auf 0 setzen        */
/*   Steuerzeichen : Leseoperation liefert 1 Byte VMIN=1 VTIME=1 */

int cbreak(int fd)
{
/*Sichern unseres Terminals*/
  if((tcgetattr(fd, &old_io)) == ERROR)
        return ERROR;

  new_io = old_io;

/*Wir verändern jetzt die Flags für den cbreak-Modus*/

  new_io.c_lflag = new_io.c_lflag & ~(ECHO|ICANON);
  new_io.c_cc[VMIN] = 1;
  new_io.c_cc[VTIME]= 0;

/*Jetzt setzten wir den cbreak-Modus*/

  if((tcsetattr(fd, TCSAFLUSH, &new_io)) == ERROR)
         return ERROR;

  return SUCCESS;
}


/*Funktion zur Abfrage einer Taste*/

int getch_cbreak()
{
  int c;

  if(cbreak(STDIN_FILENO) == ERROR)
    {
      printf("Fehler bei der Funktion cbreak......\n");
      exit(0);
    }

  c = getchar();

/*Alten Terminal-Modus wiederherstellen*/

  tcsetattr(STDIN_FILENO, TCSANOW, &old_io);

  return c;
}


int main()
{
  int zeichen;

  printf("Bitte 'q' drücken um das Programm zu beenden!\n");
  while((zeichen=getch_cbreak()) != 'q');

  return 0;
}
