reindent-20030715
[openafs.git] / src / lwp / test / test_key.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * test_key - test waiting for keystrokes.
12  * Use this test as:
13  * 1) test_key - no arguments should wait until stuff followed by <cr>.
14  * 2) test_key -delay n - should wait n seconds and beep then exit. If data
15  *    entered before n seconds, should be printed.
16  * 3) test_key -delay n -iters j - does the above n times.
17  *    
18  */
19
20 #include <afsconfig.h>
21 #include <afs/param.h>
22
23 RCSID
24     ("$Header$");
25
26 #include <stdio.h>
27 #include <sys/types.h>
28 #ifdef AFS_NT40_ENV
29 #include <time.h>
30 #else
31 #include <sys/time.h>
32 #include <unistd.h>
33 #endif
34 #include <lwp.h>
35
36 /* prototypes */
37 void interTest();
38 void lineTest();
39
40 void
41 Usage(void)
42 {
43     printf("Usage: test_key [-nobuf] [-delay seconds [-iters n]]\n");
44     printf
45         ("test_key waits for keystrokes. Without options it will wait indefinitely.\n");
46     printf
47         ("To show that LWP is still running there is a rotating '|' which cycles every quarter second.\n");
48     printf("-nobuf - don't buffer input. Don't need to wait for <cr>.\n");
49     printf("-delay seconds - wait for <seconds> for a keystroke.\n");
50     printf("-iters n - repeat the wait n times.\n");
51     printf
52         ("-inter - wait for key and beep every five seconds until pressed(overrides other options).\n");
53     printf("-line - wait for a whole line to be typed.");
54     exit(1);
55 }
56
57
58 int waitingForAnswer = 0;
59
60 static void
61 PrintDots()
62 {
63     static struct timeval constSleepTime = { 1, 0 };
64     struct timeval sleepTime;
65
66     while (waitingForAnswer) {
67         sleepTime = constSleepTime;
68         IOMGR_Select(0, 0, 0, 0, &sleepTime);
69         if (!waitingForAnswer)
70             break;
71         printf(".");
72         fflush(stdout);
73     }
74 }
75
76 static int
77 DotWriter(char *junk)
78 {
79     while (1) {
80         LWP_WaitProcess(&waitingForAnswer);
81         PrintDots();
82     }
83     return 0;
84 }
85
86 void
87 main(int ac, char **av)
88 {
89     int delay = 0;
90     int iters = 0;
91     int inter = 0;
92     int line = 0;
93     int i;
94     PROCESS dotpid;
95     int rc;
96
97     for (i = 1; i < ac; i++) {
98         if (!strcmp("-delay", av[i])) {
99             if (++i >= ac) {
100                 printf("Missing delay time for -delay option.\n");
101             }
102             delay = atoi(av[i]);
103             if (delay < 0) {
104                 printf("Delay must be at least 0 seconds.\n");
105                 Usage();
106             }
107         } else if (!strcmp("-iters", av[i])) {
108             if (++i >= ac) {
109                 printf("Missing iteration count for -iters option.\n");
110             }
111             iters = atoi(av[i]);
112             if (iters < 0) {
113                 printf("Number of iterations must be at least 0.\n");
114                 Usage();
115             }
116         } else if (!strcmp("-nobuf", av[i])) {
117             rc = setvbuf(stdin, NULL, _IONBF, 0);
118             if (rc < 0) {
119                 perror("Setting -nobuf for stdin");
120             }
121         } else if (!strcmp("-inter", av[i])) {
122             inter = 1;
123         } else if (!strcmp("-line", av[i])) {
124             line = 1;
125         } else
126             Usage();
127     }
128
129     IOMGR_Initialize();
130
131     LWP_CreateProcess(DotWriter, 32000, LWP_NORMAL_PRIORITY, (char *)0,
132                       "DotWriter", &dotpid);
133
134     if (inter) {
135         interTest();
136         exit(1);
137     }
138     if (line) {
139         lineTest();
140         exit(1);
141     }
142     if (delay == 0) {
143         delay = -1;             /* Means wait indefinitely. */
144     }
145     for (; iters >= 0; iters--) {
146         waitingForAnswer = 1;
147         LWP_NoYieldSignal(&waitingForAnswer);
148         rc = LWP_WaitForKeystroke(delay);
149         waitingForAnswer = 0;
150         if (rc) {
151             printf("\n'%c'\n", getchar());
152             printf("Flushing remaining input.\n");
153             while (LWP_WaitForKeystroke(0)) {
154                 printf("'%c'\n", getchar());
155             }
156         } else {
157             printf("\nNo data available on this iteration.\n");
158         }
159     }
160
161
162 }
163
164 /* interTest() : wait for key press and beep to remind user every five 
165  *    seconds.
166 */
167 void
168 interTest()
169 {
170     char ch;
171     int rc;
172
173     printf("Will print dots until you hit a key!\n");
174     /* start the dotwriter thread running */
175     waitingForAnswer = 1;
176     LWP_NoYieldSignal(&waitingForAnswer);
177
178     do {
179         rc = LWP_GetResponseKey(5, &ch);
180         if (rc == 0)
181             printf("\a");
182     } while (rc == 0);
183
184     waitingForAnswer = 0;       /* turn off dotwriter lwp */
185
186     printf("\nYou typed %c\n", ch);
187
188     return;
189 }
190
191 /* lineTest() : wait until a whole line has been entered before processing.
192  */
193 void
194 lineTest()
195 {
196     char ch;
197     int rc;
198     char line[256];
199
200     printf("Will print dots until enter a line\n");
201     /* start the dotwriter thread running */
202     waitingForAnswer = 1;
203     LWP_NoYieldSignal(&waitingForAnswer);
204
205     rc = LWP_GetLine(line, 256);
206
207     waitingForAnswer = 0;
208
209     printf("You entered : %s\n", line);
210     if (rc)
211         printf("linebuf was too small\n");
212
213     return;
214 }