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[] = "@(#)getinp.c 5.2 (Berkeley) 06/18/88"; 20 #endif /* not lint */ 21 22 # include <stdio.h> 23 # include <ctype.h> 24 25 # define reg register 26 27 # define LINE 70 28 29 static char buf[257]; 30 31 getinp(prompt, list) 32 char *prompt, *list[]; { 33 34 reg int i, n_match, match; 35 char *sp; 36 int plen; 37 38 39 for (;;) { 40 inter: 41 printf(prompt); 42 for (sp = buf; (*sp=getchar()) != '\n'; ) 43 if (*sp == -1) /* check for interupted system call */ 44 goto inter; 45 else if (sp != buf || *sp != ' ') 46 sp++; 47 if (buf[0] == '?' && buf[1] == '\n') { 48 printf("Valid inputs are: "); 49 for (i = 0, match = 18; list[i]; i++) { 50 if ((match+=(n_match=strlen(list[i]))) > LINE) { 51 printf("\n\t"); 52 match = n_match + 8; 53 } 54 if (*list[i] == '\0') { 55 match += 8; 56 printf("<RETURN>"); 57 } 58 else 59 printf(list[i]); 60 if (list[i+1]) 61 printf(", "); 62 else 63 putchar('\n'); 64 match += 2; 65 } 66 continue; 67 } 68 *sp = '\0'; 69 for (sp = buf; *sp; sp++) 70 if (isupper(*sp)) 71 *sp = tolower(*sp); 72 for (i = n_match = 0; list[i]; i++) 73 if (comp(list[i])) { 74 n_match++; 75 match = i; 76 } 77 if (n_match == 1) 78 return match; 79 else if (buf[0] != '\0') 80 printf("Illegal response: \"%s\". Use '?' to get list of valid answers\n", buf); 81 } 82 } 83 84 static 85 comp(s1) 86 char *s1; { 87 88 reg char *sp, *tsp, c; 89 90 if (buf[0] != '\0') 91 for (sp = buf, tsp = s1; *sp; ) { 92 c = isupper(*tsp) ? tolower(*tsp) : *tsp; 93 tsp++; 94 if (c != *sp++) 95 return 0; 96 } 97 else if (*s1 != '\0') 98 return 0; 99 return 1; 100 } 101