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