xref: /csrg-svn/games/trek/getpar.c (revision 60857)
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