Commit | Line | Data |
---|---|---|
9758240b KM |
1 | /* |
2 | * Copyright (c) 1980 Regents of the University of California. | |
3 | * All rights reserved. The Berkeley software License Agreement | |
4 | * specifies the terms and conditions for redistribution. | |
5 | */ | |
6 | ||
10103b9c | 7 | #ifndef lint |
9758240b | 8 | static char sccsid[] = "@(#)getpar.c 4.4 (Berkeley) %G%"; |
10103b9c KM |
9 | #endif not lint |
10 | ||
06d69904 | 11 | # include <stdio.h> |
10103b9c KM |
12 | # include "getpar.h" |
13 | ||
14 | /** | |
15 | ** get integer parameter | |
16 | **/ | |
17 | ||
18 | getintpar(s) | |
19 | char *s; | |
20 | { | |
21 | register int i; | |
22 | int n; | |
23 | ||
24 | while (1) | |
25 | { | |
26 | if (testnl() && s) | |
27 | printf("%s: ", s); | |
28 | i = scanf("%d", &n); | |
29 | if (i < 0) | |
30 | exit(1); | |
31 | if (i > 0 && testterm()) | |
32 | return (n); | |
33 | printf("invalid input; please enter an integer\n"); | |
34 | skiptonl(0); | |
35 | } | |
36 | } | |
37 | ||
38 | /** | |
39 | ** get floating parameter | |
40 | **/ | |
41 | ||
42 | double getfltpar(s) | |
43 | char *s; | |
44 | { | |
45 | register int i; | |
46 | double d; | |
47 | ||
48 | while (1) | |
49 | { | |
50 | if (testnl() && s) | |
51 | printf("%s: ", s); | |
52 | i = scanf("%lf", &d); | |
53 | if (i < 0) | |
54 | exit(1); | |
55 | if (i > 0 && testterm()) | |
56 | return (d); | |
06d69904 | 57 | printf("invalid input; please enter a double\n"); |
10103b9c KM |
58 | skiptonl(0); |
59 | } | |
60 | } | |
61 | ||
62 | /** | |
63 | ** get yes/no parameter | |
64 | **/ | |
65 | ||
06d69904 | 66 | struct cvntab Yntab[] = |
10103b9c | 67 | { |
06d69904 KL |
68 | "y", "es", (int (*)())1, 0, |
69 | "n", "o", (int (*)())0, 0, | |
10103b9c KM |
70 | 0 |
71 | }; | |
72 | ||
73 | getynpar(s) | |
74 | char *s; | |
75 | { | |
76 | struct cvntab *r; | |
77 | ||
78 | r = getcodpar(s, Yntab); | |
a1e29dfc | 79 | return ((int) r->value); |
10103b9c KM |
80 | } |
81 | ||
82 | ||
83 | /** | |
84 | ** get coded parameter | |
85 | **/ | |
86 | ||
87 | struct cvntab *getcodpar(s, tab) | |
88 | char *s; | |
89 | struct cvntab tab[]; | |
90 | { | |
91 | char input[100]; | |
92 | register struct cvntab *r; | |
93 | int flag; | |
94 | register char *p, *q; | |
95 | int c; | |
96 | int f; | |
97 | ||
98 | flag = 0; | |
99 | while (1) | |
100 | { | |
06d69904 | 101 | flag |= (f = testnl()); |
10103b9c KM |
102 | if (flag) |
103 | printf("%s: ", s); | |
104 | if (f) | |
105 | cgetc(0); /* throw out the newline */ | |
106 | scanf("%*[ \t;]"); | |
107 | if ((c = scanf("%[^ \t;\n]", input)) < 0) | |
108 | exit(1); | |
109 | if (c == 0) | |
110 | continue; | |
111 | flag = 1; | |
112 | ||
113 | /* if command list, print four per line */ | |
114 | if (input[0] == '?' && input[1] == 0) | |
115 | { | |
116 | c = 4; | |
117 | for (r = tab; r->abrev; r++) | |
118 | { | |
119 | concat(r->abrev, r->full, input); | |
120 | printf("%14.14s", input); | |
121 | if (--c > 0) | |
122 | continue; | |
123 | c = 4; | |
124 | printf("\n"); | |
125 | } | |
126 | if (c != 4) | |
127 | printf("\n"); | |
128 | continue; | |
129 | } | |
130 | ||
131 | /* search for in table */ | |
132 | for (r = tab; r->abrev; r++) | |
133 | { | |
134 | p = input; | |
135 | for (q = r->abrev; *q; q++) | |
136 | if (*p++ != *q) | |
137 | break; | |
138 | if (!*q) | |
139 | { | |
140 | for (q = r->full; *p && *q; q++, p++) | |
141 | if (*p != *q) | |
142 | break; | |
143 | if (!*p || !*q) | |
144 | break; | |
145 | } | |
146 | } | |
147 | ||
148 | /* check for not found */ | |
149 | if (!r->abrev) | |
150 | { | |
151 | printf("invalid input; ? for valid inputs\n"); | |
152 | skiptonl(0); | |
153 | } | |
154 | else | |
155 | return (r); | |
156 | } | |
157 | } | |
158 | ||
159 | ||
160 | /** | |
161 | ** get string parameter | |
162 | **/ | |
163 | ||
164 | getstrpar(s, r, l, t) | |
165 | char *s; | |
166 | char *r; | |
167 | int l; | |
168 | char *t; | |
169 | { | |
170 | register int i; | |
171 | char format[20]; | |
172 | register int f; | |
173 | ||
174 | if (t == 0) | |
175 | t = " \t\n;"; | |
06d69904 | 176 | sprintf(format, "%%%d[^%s]", l, t); |
10103b9c KM |
177 | while (1) |
178 | { | |
179 | if ((f = testnl()) && s) | |
180 | printf("%s: ", s); | |
181 | if (f) | |
182 | cgetc(0); | |
183 | scanf("%*[\t ;]"); | |
184 | i = scanf(format, r); | |
185 | if (i < 0) | |
186 | exit(1); | |
187 | if (i != 0) | |
188 | return; | |
189 | } | |
190 | } | |
191 | ||
192 | ||
193 | /** | |
194 | ** test if newline is next valid character | |
195 | **/ | |
196 | ||
197 | testnl() | |
198 | { | |
199 | register char c; | |
200 | ||
201 | while ((c = cgetc(0)) != '\n') | |
202 | if ((c >= '0' && c <= '9') || c == '.' || c == '!' || | |
203 | (c >= 'A' && c <= 'Z') || | |
204 | (c >= 'a' && c <= 'z') || c == '-') | |
205 | { | |
06d69904 | 206 | ungetc(c, stdin); |
10103b9c KM |
207 | return(0); |
208 | } | |
06d69904 | 209 | ungetc(c, stdin); |
10103b9c KM |
210 | return (1); |
211 | } | |
212 | ||
213 | ||
214 | /** | |
215 | ** scan for newline | |
216 | **/ | |
217 | ||
218 | skiptonl(c) | |
219 | char c; | |
220 | { | |
221 | while (c != '\n') | |
222 | if (!(c = cgetc(0))) | |
223 | return; | |
06d69904 | 224 | ungetc('\n', stdin); |
10103b9c KM |
225 | return; |
226 | } | |
227 | ||
228 | ||
229 | /** | |
230 | ** test for valid terminator | |
231 | **/ | |
232 | ||
233 | testterm() | |
234 | { | |
235 | register char c; | |
236 | ||
237 | if (!(c = cgetc(0))) | |
238 | return (1); | |
239 | if (c == '.') | |
240 | return (0); | |
241 | if (c == '\n' || c == ';') | |
06d69904 | 242 | ungetc(c, stdin); |
10103b9c KM |
243 | return (1); |
244 | } | |
245 | ||
246 | ||
247 | /* | |
248 | ** TEST FOR SPECIFIED DELIMETER | |
249 | ** | |
250 | ** The standard input is scanned for the parameter. If found, | |
251 | ** it is thrown away and non-zero is returned. If not found, | |
252 | ** zero is returned. | |
253 | */ | |
254 | ||
255 | readdelim(d) | |
256 | char d; | |
257 | { | |
258 | register char c; | |
259 | ||
260 | while (c = cgetc(0)) | |
261 | { | |
262 | if (c == d) | |
263 | return (1); | |
264 | if (c == ' ') | |
265 | continue; | |
06d69904 | 266 | ungetc(c, stdin); |
10103b9c KM |
267 | break; |
268 | } | |
269 | return (0); | |
270 | } |