1 /* play_again1.c
2 * purpuse: ask if user wants another play
3 * better : instant response without echo
4 * returns: 0 -> yes , 1 -> no
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <termios.h>
10
11 #define QUESTION "Do you want another play?"
12
13 int get_response(char *);
14 void set_crmode(void);
15 void tty_mode(int);
16
17 int main()
18 {
19 int response ;
20 tty_mode(0); // save tty mode
21 set_crmode();
22 response = get_response(QUESTION);
23 tty_mode(1); // restore tty mode
24 return response ;
25 }
26
27 int get_response(char * qiz)
28 {
29 int input ;
30 printf("%s(y/n)" , qiz);
31 while(1)
32 {
33 switch(input = getchar())
34 {
35 case 'y':
36 case 'Y':
37 printf("\n");
38 return 0 ;
39 case 'n':
40 case 'N':
41 case EOF:
42 printf("\n");
43 return 1 ;
44 default :
45 printf("\nCannot understand %c" , input );
46 printf("Please type y or no \n");
47 }
48 }
49 }
50
51 void set_crmode(void)
52 {
53 struct termios ttystate ;
54 tcgetattr(0 , &ttystate);
55 ttystate.c_lflag &= ~ICANON ; // No Buffering
56 ttystate.c_cc[VMIN] = 1 ; //Get one char one time
57 tcsetattr( 0 , TCSANOW , &ttystate);
58 }
59
60 void tty_mode(int mode)
61 {
62 static struct termios original_mode ;// 设置静态结构体变量
63 if(mode == 0 )
64 {
65 tcgetattr( 0 , & original_mode);// 存储原有设置
66 }
67 else
68 {
69 //还原原有设置
70 if( tcsetattr(0 , TCSANOW , & original_mode) == -1 )
71 {
72 perror("Restore tty settings failed!\n");
73 }
74 }
75 }