1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)getinp.c 8.1 (Berkeley) 05/31/93";
10 #endif /* not lint */
11
12 # include <stdio.h>
13 # include <ctype.h>
14
15 # define reg register
16
17 # define LINE 70
18
19 static char buf[257];
20
getinp(prompt,list)21 getinp(prompt, list)
22 char *prompt, *list[]; {
23
24 reg int i, n_match, match;
25 char *sp;
26 int plen;
27 static int comp();
28
29 for (;;) {
30 inter:
31 printf(prompt);
32 for (sp = buf; (*sp=getchar()) != '\n'; )
33 if (*sp == -1) /* check for interupted system call */
34 goto inter;
35 else if (sp != buf || *sp != ' ')
36 sp++;
37 if (buf[0] == '?' && buf[1] == '\n') {
38 printf("Valid inputs are: ");
39 for (i = 0, match = 18; list[i]; i++) {
40 if ((match+=(n_match=strlen(list[i]))) > LINE) {
41 printf("\n\t");
42 match = n_match + 8;
43 }
44 if (*list[i] == '\0') {
45 match += 8;
46 printf("<RETURN>");
47 }
48 else
49 printf(list[i]);
50 if (list[i+1])
51 printf(", ");
52 else
53 putchar('\n');
54 match += 2;
55 }
56 continue;
57 }
58 *sp = '\0';
59 for (sp = buf; *sp; sp++)
60 if (isupper(*sp))
61 *sp = tolower(*sp);
62 for (i = n_match = 0; list[i]; i++)
63 if (comp(list[i])) {
64 n_match++;
65 match = i;
66 }
67 if (n_match == 1)
68 return match;
69 else if (buf[0] != '\0')
70 printf("Illegal response: \"%s\". Use '?' to get list of valid answers\n", buf);
71 }
72 }
73
74 static
comp(s1)75 comp(s1)
76 char *s1; {
77
78 reg char *sp, *tsp, c;
79
80 if (buf[0] != '\0')
81 for (sp = buf, tsp = s1; *sp; ) {
82 c = isupper(*tsp) ? tolower(*tsp) : *tsp;
83 tsp++;
84 if (c != *sp++)
85 return 0;
86 }
87 else if (*s1 != '\0')
88 return 0;
89 return 1;
90 }
91