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