nocanonical.c

source

   1 #include <unistd.h>
   2 #include <stdio.h>
   3 #include <stdlib.h>
   4 #include <termios.h>
   5 
   6 // misto kde se ulozi originalni parametry terminalu
   7 struct termios saved_attributes;
   8 
   9 void reset_input_mode(void)
  10 {
  11     // nastav terminal na puvodni parametry
  12     tcsetattr(fileno(stdin), TCSANOW, &saved_attributes);
  13 }
  14 
  15 void set_input_mode(void)
  16 {
  17     struct termios tattr;
  18               
  19     // presvec se, ze stdin je terminal
  20     if(!isatty(fileno(stdin))) {
  21         fprintf(stderr, "Not a terminal.\n");
  22         exit(EXIT_FAILURE);
  23     }
  24       
  25     // uschovej aktualni parametry terminalu pro pozdejsi obnoveni
  26     tcgetattr(fileno(stdin), &saved_attributes);                  
  27     // funkce reset_input_mode se bude volat pri ukoceni programu normalnim zpusobem
  28     atexit(reset_input_mode);                  
  29                              
  30     // nastav nove parametry terminalu
  31     tcgetattr(fileno(stdin), &tattr);  
  32     tattr.c_lflag &= ~ICANON; // necekej na cely radek (noncanonical)
  33     tattr.c_lflag &= ~ECHO;   // nezobrazuj ctene znaky
  34     tattr.c_cc[VMIN] = 1;                                        
  35     tattr.c_cc[VTIME] = 0;
  36     tcsetattr(fileno(stdin), TCSAFLUSH, &tattr);
  37 }                                             
  38 
  39 int main(void)
  40 {          
  41     set_input_mode();                     
  42     printf("Hit Ctrl-D to terminate.\n");
  43     while(1) {
  44         char c;
  45         read(fileno(stdin), &c, 1);
  46         if(c == '\004') { // `C-d'
  47             break;
  48         }
  49         else {
  50             putchar(c);
  51             fflush(stdout); // vyprazdni vystupni buffer
  52         }
  53     }
  54     reset_input_mode();                     
  55     
  56     return EXIT_SUCCESS;
  57 }