nocanonical.c
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 } |