Commit | Line | Data |
---|---|---|
9758240b KM |
1 | /* |
2 | * Copyright (c) 1980 Regents of the University of California. | |
e9fb6bea KB |
3 | * All rights reserved. |
4 | * | |
af359dea C |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by the University of | |
16 | * California, Berkeley and its contributors. | |
17 | * 4. Neither the name of the University nor the names of its contributors | |
18 | * may be used to endorse or promote products derived from this software | |
19 | * without specific prior written permission. | |
20 | * | |
21 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND | |
22 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
23 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
24 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE | |
25 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
26 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
27 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
28 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
30 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
31 | * SUCH DAMAGE. | |
9758240b KM |
32 | */ |
33 | ||
10103b9c | 34 | #ifndef lint |
1c15e888 | 35 | static char sccsid[] = "@(#)getpar.c 4.8 (Berkeley) 6/1/90"; |
e9fb6bea | 36 | #endif /* not lint */ |
10103b9c | 37 | |
06d69904 | 38 | # include <stdio.h> |
10103b9c KM |
39 | # include "getpar.h" |
40 | ||
41 | /** | |
42 | ** get integer parameter | |
43 | **/ | |
44 | ||
45 | getintpar(s) | |
46 | char *s; | |
47 | { | |
48 | register int i; | |
49 | int n; | |
50 | ||
51 | while (1) | |
52 | { | |
53 | if (testnl() && s) | |
54 | printf("%s: ", s); | |
55 | i = scanf("%d", &n); | |
56 | if (i < 0) | |
57 | exit(1); | |
58 | if (i > 0 && testterm()) | |
59 | return (n); | |
60 | printf("invalid input; please enter an integer\n"); | |
61 | skiptonl(0); | |
62 | } | |
63 | } | |
64 | ||
65 | /** | |
66 | ** get floating parameter | |
67 | **/ | |
68 | ||
69 | double getfltpar(s) | |
70 | char *s; | |
71 | { | |
72 | register int i; | |
73 | double d; | |
74 | ||
75 | while (1) | |
76 | { | |
77 | if (testnl() && s) | |
78 | printf("%s: ", s); | |
79 | i = scanf("%lf", &d); | |
80 | if (i < 0) | |
81 | exit(1); | |
82 | if (i > 0 && testterm()) | |
83 | return (d); | |
06d69904 | 84 | printf("invalid input; please enter a double\n"); |
10103b9c KM |
85 | skiptonl(0); |
86 | } | |
87 | } | |
88 | ||
89 | /** | |
90 | ** get yes/no parameter | |
91 | **/ | |
92 | ||
06d69904 | 93 | struct cvntab Yntab[] = |
10103b9c | 94 | { |
06d69904 KL |
95 | "y", "es", (int (*)())1, 0, |
96 | "n", "o", (int (*)())0, 0, | |
10103b9c KM |
97 | 0 |
98 | }; | |
99 | ||
100 | getynpar(s) | |
101 | char *s; | |
102 | { | |
103 | struct cvntab *r; | |
104 | ||
105 | r = getcodpar(s, Yntab); | |
a1e29dfc | 106 | return ((int) r->value); |
10103b9c KM |
107 | } |
108 | ||
109 | ||
110 | /** | |
111 | ** get coded parameter | |
112 | **/ | |
113 | ||
114 | struct cvntab *getcodpar(s, tab) | |
115 | char *s; | |
116 | struct cvntab tab[]; | |
117 | { | |
118 | char input[100]; | |
119 | register struct cvntab *r; | |
120 | int flag; | |
121 | register char *p, *q; | |
122 | int c; | |
123 | int f; | |
124 | ||
125 | flag = 0; | |
126 | while (1) | |
127 | { | |
06d69904 | 128 | flag |= (f = testnl()); |
10103b9c KM |
129 | if (flag) |
130 | printf("%s: ", s); | |
131 | if (f) | |
132 | cgetc(0); /* throw out the newline */ | |
133 | scanf("%*[ \t;]"); | |
134 | if ((c = scanf("%[^ \t;\n]", input)) < 0) | |
135 | exit(1); | |
136 | if (c == 0) | |
137 | continue; | |
138 | flag = 1; | |
139 | ||
140 | /* if command list, print four per line */ | |
141 | if (input[0] == '?' && input[1] == 0) | |
142 | { | |
143 | c = 4; | |
144 | for (r = tab; r->abrev; r++) | |
145 | { | |
146 | concat(r->abrev, r->full, input); | |
147 | printf("%14.14s", input); | |
148 | if (--c > 0) | |
149 | continue; | |
150 | c = 4; | |
151 | printf("\n"); | |
152 | } | |
153 | if (c != 4) | |
154 | printf("\n"); | |
155 | continue; | |
156 | } | |
157 | ||
158 | /* search for in table */ | |
159 | for (r = tab; r->abrev; r++) | |
160 | { | |
161 | p = input; | |
162 | for (q = r->abrev; *q; q++) | |
163 | if (*p++ != *q) | |
164 | break; | |
165 | if (!*q) | |
166 | { | |
167 | for (q = r->full; *p && *q; q++, p++) | |
168 | if (*p != *q) | |
169 | break; | |
170 | if (!*p || !*q) | |
171 | break; | |
172 | } | |
173 | } | |
174 | ||
175 | /* check for not found */ | |
176 | if (!r->abrev) | |
177 | { | |
178 | printf("invalid input; ? for valid inputs\n"); | |
179 | skiptonl(0); | |
180 | } | |
181 | else | |
182 | return (r); | |
183 | } | |
184 | } | |
185 | ||
186 | ||
187 | /** | |
188 | ** get string parameter | |
189 | **/ | |
190 | ||
191 | getstrpar(s, r, l, t) | |
192 | char *s; | |
193 | char *r; | |
194 | int l; | |
195 | char *t; | |
196 | { | |
197 | register int i; | |
198 | char format[20]; | |
199 | register int f; | |
200 | ||
201 | if (t == 0) | |
202 | t = " \t\n;"; | |
e578d1f3 | 203 | (void)sprintf(format, "%%%d[^%s]", l, t); |
10103b9c KM |
204 | while (1) |
205 | { | |
206 | if ((f = testnl()) && s) | |
207 | printf("%s: ", s); | |
208 | if (f) | |
209 | cgetc(0); | |
210 | scanf("%*[\t ;]"); | |
211 | i = scanf(format, r); | |
212 | if (i < 0) | |
213 | exit(1); | |
214 | if (i != 0) | |
215 | return; | |
216 | } | |
217 | } | |
218 | ||
219 | ||
220 | /** | |
221 | ** test if newline is next valid character | |
222 | **/ | |
223 | ||
224 | testnl() | |
225 | { | |
226 | register char c; | |
227 | ||
228 | while ((c = cgetc(0)) != '\n') | |
229 | if ((c >= '0' && c <= '9') || c == '.' || c == '!' || | |
230 | (c >= 'A' && c <= 'Z') || | |
231 | (c >= 'a' && c <= 'z') || c == '-') | |
232 | { | |
06d69904 | 233 | ungetc(c, stdin); |
10103b9c KM |
234 | return(0); |
235 | } | |
06d69904 | 236 | ungetc(c, stdin); |
10103b9c KM |
237 | return (1); |
238 | } | |
239 | ||
240 | ||
241 | /** | |
242 | ** scan for newline | |
243 | **/ | |
244 | ||
245 | skiptonl(c) | |
246 | char c; | |
247 | { | |
248 | while (c != '\n') | |
249 | if (!(c = cgetc(0))) | |
250 | return; | |
06d69904 | 251 | ungetc('\n', stdin); |
10103b9c KM |
252 | return; |
253 | } | |
254 | ||
255 | ||
256 | /** | |
257 | ** test for valid terminator | |
258 | **/ | |
259 | ||
260 | testterm() | |
261 | { | |
262 | register char c; | |
263 | ||
264 | if (!(c = cgetc(0))) | |
265 | return (1); | |
266 | if (c == '.') | |
267 | return (0); | |
268 | if (c == '\n' || c == ';') | |
06d69904 | 269 | ungetc(c, stdin); |
10103b9c KM |
270 | return (1); |
271 | } | |
272 | ||
273 | ||
274 | /* | |
275 | ** TEST FOR SPECIFIED DELIMETER | |
276 | ** | |
277 | ** The standard input is scanned for the parameter. If found, | |
278 | ** it is thrown away and non-zero is returned. If not found, | |
279 | ** zero is returned. | |
280 | */ | |
281 | ||
282 | readdelim(d) | |
283 | char d; | |
284 | { | |
285 | register char c; | |
286 | ||
287 | while (c = cgetc(0)) | |
288 | { | |
289 | if (c == d) | |
290 | return (1); | |
291 | if (c == ' ') | |
292 | continue; | |
06d69904 | 293 | ungetc(c, stdin); |
10103b9c KM |
294 | break; |
295 | } | |
296 | return (0); | |
297 | } |