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