#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 raw-Modus:*/
/*Folgende Eingabeflags werden gelöscht : BRKINT, ICRNL, INPCK, ISTRIP, IXON*/
/*Folgende Kontrollflags werden gelöscht: CSIZE, PERENB*/
/*Folgende Ausgabeflags werden gelöscht : OPOST*/
/*Folgende Kontrollflags werden gelöscht: ECHO, ICANON, IEXTEN, ISIG*/
/*Gesetzt wird das Kontrollflag CS8 was Bedeuteted das ein Zeichen 8 Bit breit ist*/
/*Steuerzeichen : Leseoperation liefert 1 Byte VMIN=1 VTIME=1 */

int raw(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 raw-Modus*/

 new_io.c_iflag = new_io.c_iflag & ~(BRKINT|ICRNL|INPCK|ISTRIP|IXON);
 new_io.c_oflag = new_io.c_iflag & ~(OPOST);
 new_io.c_cflag = new_io.c_cflag & ~(CSIZE|PARENB);
 new_io.c_lflag = new_io.c_lflag & ~(ECHO|ICANON|IEXTEN|ISIG);
 new_io.c_cflag = new_io.c_cflag | CS8;
 new_io.c_cc[VMIN] = 1;
 new_io.c_cc[VTIME]= 0;

/*Jetzt setzten wir den raw-Modus*/

 if((tcsetattr(fd, TCSAFLUSH, &new_io)) == ERROR)
       return ERROR;

 return SUCCESS;
}


/*Funktion zur Abfrage einer Taste*/

int getch()
{
 int c;

 if(raw(STDIN_FILENO) == ERROR)
   {
     printf("Fehler bei der Funktion raw......\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()) != 'q');

 return 0;
}

