125991Smckusick /*
2*60857Sbostic * Copyright (c) 1980, 1993
3*60857Sbostic * The Regents of the University of California. All rights reserved.
434205Sbostic *
542605Sbostic * %sccs.include.redist.c%
625991Smckusick */
725991Smckusick
811675Smckusick #ifndef lint
9*60857Sbostic static char sccsid[] = "@(#)getpar.c 8.1 (Berkeley) 05/31/93";
1034205Sbostic #endif /* not lint */
1111675Smckusick
1212738Slayer # include <stdio.h>
1311675Smckusick # include "getpar.h"
1411675Smckusick
1511675Smckusick /**
1611675Smckusick ** get integer parameter
1711675Smckusick **/
1811675Smckusick
getintpar(s)1911675Smckusick getintpar(s)
2011675Smckusick char *s;
2111675Smckusick {
2211675Smckusick register int i;
2311675Smckusick int n;
2411675Smckusick
2511675Smckusick while (1)
2611675Smckusick {
2711675Smckusick if (testnl() && s)
2811675Smckusick printf("%s: ", s);
2911675Smckusick i = scanf("%d", &n);
3011675Smckusick if (i < 0)
3111675Smckusick exit(1);
3211675Smckusick if (i > 0 && testterm())
3311675Smckusick return (n);
3411675Smckusick printf("invalid input; please enter an integer\n");
3511675Smckusick skiptonl(0);
3611675Smckusick }
3711675Smckusick }
3811675Smckusick
3911675Smckusick /**
4011675Smckusick ** get floating parameter
4111675Smckusick **/
4211675Smckusick
getfltpar(s)4311675Smckusick double getfltpar(s)
4411675Smckusick char *s;
4511675Smckusick {
4611675Smckusick register int i;
4711675Smckusick double d;
4811675Smckusick
4911675Smckusick while (1)
5011675Smckusick {
5111675Smckusick if (testnl() && s)
5211675Smckusick printf("%s: ", s);
5311675Smckusick i = scanf("%lf", &d);
5411675Smckusick if (i < 0)
5511675Smckusick exit(1);
5611675Smckusick if (i > 0 && testterm())
5711675Smckusick return (d);
5812738Slayer printf("invalid input; please enter a double\n");
5911675Smckusick skiptonl(0);
6011675Smckusick }
6111675Smckusick }
6211675Smckusick
6311675Smckusick /**
6411675Smckusick ** get yes/no parameter
6511675Smckusick **/
6611675Smckusick
6712738Slayer struct cvntab Yntab[] =
6811675Smckusick {
6912738Slayer "y", "es", (int (*)())1, 0,
7012738Slayer "n", "o", (int (*)())0, 0,
7111675Smckusick 0
7211675Smckusick };
7311675Smckusick
getynpar(s)7411675Smckusick getynpar(s)
7511675Smckusick char *s;
7611675Smckusick {
7711675Smckusick struct cvntab *r;
7811675Smckusick
7911675Smckusick r = getcodpar(s, Yntab);
8012813Slayer return ((int) r->value);
8111675Smckusick }
8211675Smckusick
8311675Smckusick
8411675Smckusick /**
8511675Smckusick ** get coded parameter
8611675Smckusick **/
8711675Smckusick
getcodpar(s,tab)8811675Smckusick struct cvntab *getcodpar(s, tab)
8911675Smckusick char *s;
9011675Smckusick struct cvntab tab[];
9111675Smckusick {
9211675Smckusick char input[100];
9311675Smckusick register struct cvntab *r;
9411675Smckusick int flag;
9511675Smckusick register char *p, *q;
9611675Smckusick int c;
9711675Smckusick int f;
9811675Smckusick
9911675Smckusick flag = 0;
10011675Smckusick while (1)
10111675Smckusick {
10212738Slayer flag |= (f = testnl());
10311675Smckusick if (flag)
10411675Smckusick printf("%s: ", s);
10511675Smckusick if (f)
10611675Smckusick cgetc(0); /* throw out the newline */
10711675Smckusick scanf("%*[ \t;]");
10811675Smckusick if ((c = scanf("%[^ \t;\n]", input)) < 0)
10911675Smckusick exit(1);
11011675Smckusick if (c == 0)
11111675Smckusick continue;
11211675Smckusick flag = 1;
11311675Smckusick
11411675Smckusick /* if command list, print four per line */
11511675Smckusick if (input[0] == '?' && input[1] == 0)
11611675Smckusick {
11711675Smckusick c = 4;
11811675Smckusick for (r = tab; r->abrev; r++)
11911675Smckusick {
12011675Smckusick concat(r->abrev, r->full, input);
12111675Smckusick printf("%14.14s", input);
12211675Smckusick if (--c > 0)
12311675Smckusick continue;
12411675Smckusick c = 4;
12511675Smckusick printf("\n");
12611675Smckusick }
12711675Smckusick if (c != 4)
12811675Smckusick printf("\n");
12911675Smckusick continue;
13011675Smckusick }
13111675Smckusick
13211675Smckusick /* search for in table */
13311675Smckusick for (r = tab; r->abrev; r++)
13411675Smckusick {
13511675Smckusick p = input;
13611675Smckusick for (q = r->abrev; *q; q++)
13711675Smckusick if (*p++ != *q)
13811675Smckusick break;
13911675Smckusick if (!*q)
14011675Smckusick {
14111675Smckusick for (q = r->full; *p && *q; q++, p++)
14211675Smckusick if (*p != *q)
14311675Smckusick break;
14411675Smckusick if (!*p || !*q)
14511675Smckusick break;
14611675Smckusick }
14711675Smckusick }
14811675Smckusick
14911675Smckusick /* check for not found */
15011675Smckusick if (!r->abrev)
15111675Smckusick {
15211675Smckusick printf("invalid input; ? for valid inputs\n");
15311675Smckusick skiptonl(0);
15411675Smckusick }
15511675Smckusick else
15611675Smckusick return (r);
15711675Smckusick }
15811675Smckusick }
15911675Smckusick
16011675Smckusick
16111675Smckusick /**
16211675Smckusick ** get string parameter
16311675Smckusick **/
16411675Smckusick
getstrpar(s,r,l,t)16511675Smckusick getstrpar(s, r, l, t)
16611675Smckusick char *s;
16711675Smckusick char *r;
16811675Smckusick int l;
16911675Smckusick char *t;
17011675Smckusick {
17111675Smckusick register int i;
17211675Smckusick char format[20];
17311675Smckusick register int f;
17411675Smckusick
17511675Smckusick if (t == 0)
17611675Smckusick t = " \t\n;";
17732481Sbostic (void)sprintf(format, "%%%d[^%s]", l, t);
17811675Smckusick while (1)
17911675Smckusick {
18011675Smckusick if ((f = testnl()) && s)
18111675Smckusick printf("%s: ", s);
18211675Smckusick if (f)
18311675Smckusick cgetc(0);
18411675Smckusick scanf("%*[\t ;]");
18511675Smckusick i = scanf(format, r);
18611675Smckusick if (i < 0)
18711675Smckusick exit(1);
18811675Smckusick if (i != 0)
18911675Smckusick return;
19011675Smckusick }
19111675Smckusick }
19211675Smckusick
19311675Smckusick
19411675Smckusick /**
19511675Smckusick ** test if newline is next valid character
19611675Smckusick **/
19711675Smckusick
testnl()19811675Smckusick testnl()
19911675Smckusick {
20011675Smckusick register char c;
20111675Smckusick
20211675Smckusick while ((c = cgetc(0)) != '\n')
20311675Smckusick if ((c >= '0' && c <= '9') || c == '.' || c == '!' ||
20411675Smckusick (c >= 'A' && c <= 'Z') ||
20511675Smckusick (c >= 'a' && c <= 'z') || c == '-')
20611675Smckusick {
20712738Slayer ungetc(c, stdin);
20811675Smckusick return(0);
20911675Smckusick }
21012738Slayer ungetc(c, stdin);
21111675Smckusick return (1);
21211675Smckusick }
21311675Smckusick
21411675Smckusick
21511675Smckusick /**
21611675Smckusick ** scan for newline
21711675Smckusick **/
21811675Smckusick
skiptonl(c)21911675Smckusick skiptonl(c)
22011675Smckusick char c;
22111675Smckusick {
22211675Smckusick while (c != '\n')
22311675Smckusick if (!(c = cgetc(0)))
22411675Smckusick return;
22512738Slayer ungetc('\n', stdin);
22611675Smckusick return;
22711675Smckusick }
22811675Smckusick
22911675Smckusick
23011675Smckusick /**
23111675Smckusick ** test for valid terminator
23211675Smckusick **/
23311675Smckusick
testterm()23411675Smckusick testterm()
23511675Smckusick {
23611675Smckusick register char c;
23711675Smckusick
23811675Smckusick if (!(c = cgetc(0)))
23911675Smckusick return (1);
24011675Smckusick if (c == '.')
24111675Smckusick return (0);
24211675Smckusick if (c == '\n' || c == ';')
24312738Slayer ungetc(c, stdin);
24411675Smckusick return (1);
24511675Smckusick }
24611675Smckusick
24711675Smckusick
24811675Smckusick /*
24911675Smckusick ** TEST FOR SPECIFIED DELIMETER
25011675Smckusick **
25111675Smckusick ** The standard input is scanned for the parameter. If found,
25211675Smckusick ** it is thrown away and non-zero is returned. If not found,
25311675Smckusick ** zero is returned.
25411675Smckusick */
25511675Smckusick
readdelim(d)25611675Smckusick readdelim(d)
25711675Smckusick char d;
25811675Smckusick {
25911675Smckusick register char c;
26011675Smckusick
26111675Smckusick while (c = cgetc(0))
26211675Smckusick {
26311675Smckusick if (c == d)
26411675Smckusick return (1);
26511675Smckusick if (c == ' ')
26611675Smckusick continue;
26712738Slayer ungetc(c, stdin);
26811675Smckusick break;
26911675Smckusick }
27011675Smckusick return (0);
27111675Smckusick }
272