|
|
1.1 ! root 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) 6/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.