1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32: #include <sys/cdefs.h>
33: #ifndef lint
34: #if 0
35: static char sccsid[] = "@(#)getinp.c 8.1 (Berkeley) 5/31/93";
36: #else
37: __RCSID("$NetBSD: getinp.c,v 1.13 2004/11/05 21:30:32 dsl Exp $");
38: #endif
39: #endif
40:
41: #include <stdio.h>
42: #include <string.h>
43: #include <ctype.h>
44: #include "monop.ext"
45:
46: #define LINE 70
47:
48: static char buf[257];
49:
50: static int comp(const char *);
51:
52: int
53: getinp(prompt, list)
54: const char *prompt, *const list[];
55: {
56: int i, n_match, match = 0;
57: char *sp;
58: int c;
59:
60: for (;;) {
61: inter:
62: printf("%s", prompt);
63: for (sp = buf; (c=getchar()) != '\n'; ) {
64: *sp = c;
65: if (c == -1)
66: goto inter;
67: else if (sp != buf || *sp != ' ')
68: sp++;
69: }
70: *sp = c;
71: if (buf[0] == '?' && buf[1] == '\n') {
72: printf("Valid inputs are: ");
73: for (i = 0, match = 18; list[i]; i++) {
74: if ((match+=(n_match=strlen(list[i]))) > LINE) {
75: printf("\n\t");
76: match = n_match + 8;
77: }
78: if (*list[i] == '\0') {
79: match += 8;
80: printf("<RETURN>");
81: }
82: else
83: printf("%s", list[i]);
84: if (list[i+1])
85: printf(", ");
86: else
87: putchar('\n');
88: match += 2;
89: }
90: continue;
91: }
92: *sp = '\0';
93: for (sp = buf; *sp; sp++)
94: *sp = tolower((unsigned char)*sp);
95: for (i = n_match = 0; list[i]; i++)
96: if (comp(list[i])) {
97: n_match++;
98: match = i;
99: }
100: if (n_match == 1)
101: return match;
102: else if (buf[0] != '\0')
103: printf("Illegal response: \"%s\". "
104: "Use '?' to get list of valid answers\n", buf);
105: }
106: }
107:
108: static int
109: comp(s1)
110: const char *s1;
111: {
112: const char *sp, *tsp;
113: char c;
114:
115: if (buf[0] != '\0')
116: for (sp = buf, tsp = s1; *sp; ) {
117: c = tolower((unsigned char)*tsp);
118: tsp++;
119: if (c != *sp++)
120: return 0;
121: }
122: else if (*s1 != '\0')
123: return 0;
124: return 1;
125: }