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