dcfb316c14914dcbde1b92744c753df72008dbe2
[mmh] / sbr / gans.c
1
2 /*
3  * gans.c -- get an answer from the user
4  *
5  * $Id$
6  */
7
8 #include <h/mh.h>
9
10
11 int
12 gans (char *prompt, struct swit *ansp)
13 {
14     register int i;
15     register char *cp;
16     register struct swit *ap;
17     char ansbuf[BUFSIZ];
18
19     for (;;) {
20         printf ("%s", prompt);
21         fflush (stdout);
22         cp = ansbuf;
23         while ((i = getchar ()) != '\n') {
24             if (i == EOF)
25                 return 0;
26             if (cp < &ansbuf[sizeof ansbuf - 1]) {
27 #ifdef LOCALE
28                 i = (isalpha(i) && isupper(i)) ? tolower(i) : i;
29 #else
30                 if (i >= 'A' && i <= 'Z')
31                     i += 'a' - 'A';
32 #endif
33                 *cp++ = i;
34             }
35         }
36         *cp = '\0';
37         if (ansbuf[0] == '?' || cp == ansbuf) {
38             printf ("Options are:\n");
39             for (ap = ansp; ap->sw; ap++)
40                 printf ("  %s\n", ap->sw);
41             continue;
42         }
43         if ((i = smatch (ansbuf, ansp)) < 0) {
44             printf ("%s: %s.\n", ansbuf, i == -1 ? "unknown" : "ambiguous");
45             continue;
46         }
47         return i;
48     }
49 }