1 /* 2 * Copyright (c) 1980, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)getpar.c 8.1 (Berkeley) 5/31/93 34 * $FreeBSD: src/games/trek/getpar.c,v 1.5 1999/11/30 03:49:48 billf Exp $ 35 * $DragonFly: src/games/trek/getpar.c,v 1.2 2003/06/17 04:25:25 dillon Exp $ 36 */ 37 38 # include <stdio.h> 39 # include "getpar.h" 40 41 /** 42 ** get integer parameter 43 **/ 44 45 getintpar(s) 46 char *s; 47 { 48 int i; 49 int n; 50 51 while (1) 52 { 53 if (testnl() && s) 54 printf("%s: ", s); 55 i = scanf("%d", &n); 56 if (i < 0) 57 exit(1); 58 if (i > 0 && testterm()) 59 return (n); 60 printf("invalid input; please enter an integer\n"); 61 skiptonl(0); 62 } 63 } 64 65 /** 66 ** get floating parameter 67 **/ 68 69 double getfltpar(s) 70 char *s; 71 { 72 int i; 73 double d; 74 75 while (1) 76 { 77 if (testnl() && s) 78 printf("%s: ", s); 79 i = scanf("%lf", &d); 80 if (i < 0) 81 exit(1); 82 if (i > 0 && testterm()) 83 return (d); 84 printf("invalid input; please enter a double\n"); 85 skiptonl(0); 86 } 87 } 88 89 /** 90 ** get yes/no parameter 91 **/ 92 93 struct cvntab Yntab[] = 94 { 95 "y", "es", (int (*)())1, 0, 96 "n", "o", (int (*)())0, 0, 97 0 98 }; 99 100 getynpar(s) 101 char *s; 102 { 103 struct cvntab *r; 104 105 r = getcodpar(s, Yntab); 106 return ((long) r->value); 107 } 108 109 110 /** 111 ** get coded parameter 112 **/ 113 114 struct cvntab *getcodpar(s, tab) 115 char *s; 116 struct cvntab tab[]; 117 { 118 char input[100]; 119 struct cvntab *r; 120 int flag; 121 char *p, *q; 122 int c; 123 int f; 124 125 flag = 0; 126 while (1) 127 { 128 flag |= (f = testnl()); 129 if (flag) 130 printf("%s: ", s); 131 if (f) 132 cgetc(0); /* throw out the newline */ 133 scanf("%*[ \t;]"); 134 if ((c = scanf("%[^ \t;\n]", input)) < 0) 135 exit(1); 136 if (c == 0) 137 continue; 138 flag = 1; 139 140 /* if command list, print four per line */ 141 if (input[0] == '?' && input[1] == 0) 142 { 143 c = 4; 144 for (r = tab; r->abrev; r++) 145 { 146 concat(r->abrev, r->full, input); 147 printf("%14.14s", input); 148 if (--c > 0) 149 continue; 150 c = 4; 151 printf("\n"); 152 } 153 if (c != 4) 154 printf("\n"); 155 continue; 156 } 157 158 /* search for in table */ 159 for (r = tab; r->abrev; r++) 160 { 161 p = input; 162 for (q = r->abrev; *q; q++) 163 if (*p++ != *q) 164 break; 165 if (!*q) 166 { 167 for (q = r->full; *p && *q; q++, p++) 168 if (*p != *q) 169 break; 170 if (!*p || !*q) 171 break; 172 } 173 } 174 175 /* check for not found */ 176 if (!r->abrev) 177 { 178 printf("invalid input; ? for valid inputs\n"); 179 skiptonl(0); 180 } 181 else 182 return (r); 183 } 184 } 185 186 187 /** 188 ** get string parameter 189 **/ 190 191 getstrpar(s, r, l, t) 192 char *s; 193 char *r; 194 int l; 195 char *t; 196 { 197 int i; 198 char format[20]; 199 int f; 200 201 if (t == 0) 202 t = " \t\n;"; 203 (void)sprintf(format, "%%%d[^%s]", l, t); 204 while (1) 205 { 206 if ((f = testnl()) && s) 207 printf("%s: ", s); 208 if (f) 209 cgetc(0); 210 scanf("%*[\t ;]"); 211 i = scanf(format, r); 212 if (i < 0) 213 exit(1); 214 if (i != 0) 215 return; 216 } 217 } 218 219 220 /** 221 ** test if newline is next valid character 222 **/ 223 224 testnl() 225 { 226 char c; 227 228 while ((c = cgetc(0)) != '\n') 229 if ((c >= '0' && c <= '9') || c == '.' || c == '!' || 230 (c >= 'A' && c <= 'Z') || 231 (c >= 'a' && c <= 'z') || c == '-') 232 { 233 ungetc(c, stdin); 234 return(0); 235 } 236 ungetc(c, stdin); 237 return (1); 238 } 239 240 241 /** 242 ** scan for newline 243 **/ 244 245 skiptonl(c) 246 char c; 247 { 248 while (c != '\n') 249 if (!(c = cgetc(0))) 250 return; 251 ungetc('\n', stdin); 252 return; 253 } 254 255 256 /** 257 ** test for valid terminator 258 **/ 259 260 testterm() 261 { 262 char c; 263 264 if (!(c = cgetc(0))) 265 return (1); 266 if (c == '.') 267 return (0); 268 if (c == '\n' || c == ';') 269 ungetc(c, stdin); 270 return (1); 271 } 272 273 274 /* 275 ** TEST FOR SPECIFIED DELIMETER 276 ** 277 ** The standard input is scanned for the parameter. If found, 278 ** it is thrown away and non-zero is returned. If not found, 279 ** zero is returned. 280 */ 281 282 readdelim(d) 283 char d; 284 { 285 char c; 286 287 while (c = cgetc(0)) 288 { 289 if (c == d) 290 return (1); 291 if (c == ' ') 292 continue; 293 ungetc(c, stdin); 294 break; 295 } 296 return (0); 297 } 298