added depend label
[unix-history] / usr / src / games / trek / getpar.c
CommitLineData
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 8static 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
18getintpar(s)
19char *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
42double getfltpar(s)
43char *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 66struct cvntab Yntab[] =
10103b9c 67{
06d69904
KL
68 "y", "es", (int (*)())1, 0,
69 "n", "o", (int (*)())0, 0,
10103b9c
KM
70 0
71};
72
73getynpar(s)
74char *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
87struct cvntab *getcodpar(s, tab)
88char *s;
89struct 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
164getstrpar(s, r, l, t)
165char *s;
166char *r;
167int l;
168char *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
197testnl()
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
218skiptonl(c)
219char 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
233testterm()
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
255readdelim(d)
256char 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}