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