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