X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/5ff78ede5ea1a80c654d3f0684cd5f36d5253ae1..46062f71bb0dbda76cf0bde5c52bc325c97fd7a9:/battlestar/getcom.c diff --git a/battlestar/getcom.c b/battlestar/getcom.c index d6726de0..7e13b5f9 100644 --- a/battlestar/getcom.c +++ b/battlestar/getcom.c @@ -1,4 +1,4 @@ -/* $NetBSD: getcom.c,v 1.3 1995/03/21 15:07:30 cgd Exp $ */ +/* $NetBSD: getcom.c,v 1.14 2012/01/16 17:38:16 christos Exp $ */ /* * Copyright (c) 1983, 1993 @@ -12,11 +12,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors + * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * @@ -33,36 +29,41 @@ * SUCH DAMAGE. */ +#include #ifndef lint #if 0 static char sccsid[] = "@(#)getcom.c 8.1 (Berkeley) 5/31/93"; #else -static char rcsid[] = "$NetBSD: getcom.c,v 1.3 1995/03/21 15:07:30 cgd Exp $"; +__RCSID("$NetBSD: getcom.c,v 1.14 2012/01/16 17:38:16 christos Exp $"); #endif -#endif /* not lint */ +#endif /* not lint */ -#include -#include +#include "extern.h" char * -getcom(buf, size, prompt, error) - char *buf; - int size; - char *prompt, *error; +getcom(char *buf, int size, const char *prompt, const char *error) { for (;;) { - fputs(prompt, stdout); - if (fgets(buf, size, stdin) == 0) { + fputs(prompt, stdout); + if (fgets(buf, size, stdin) == NULL) { + if (feof(stdin)) + die(); clearerr(stdin); continue; } - while (isspace(*buf)) + while (isspace((unsigned char)*buf)) buf++; if (*buf) break; if (error) puts(error); } + /* If we didn't get to the end of line, don't read it in next time. */ + if (buf[strlen(buf) - 1] != '\n') { + int i; + while ((i = getchar()) != '\n' && i != EOF) + continue; + } return (buf); } @@ -71,35 +72,50 @@ getcom(buf, size, prompt, error) * shifts to UPPERCASE if flag > 0, lowercase if flag < 0, * and leaves it unchanged if flag = 0 */ -char * -getword(buf1, buf2, flag) - register char *buf1, *buf2; - register flag; +char * +getword(char *buf1, char *buf2, int flag) { - while (isspace(*buf1)) + int cnt; + + cnt = 1; + while (isspace((unsigned char)*buf1)) buf1++; if (*buf1 != ',') { if (!*buf1) { *buf2 = 0; return (0); } - while (*buf1 && !isspace(*buf1) && *buf1 != ',') - if (flag < 0) - if (isupper(*buf1)) - *buf2++ = tolower(*buf1++); - else + while (cnt < WORDLEN && *buf1 && + !isspace((unsigned char)*buf1) && *buf1 != ',') + if (flag < 0) { + if (isupper((unsigned char)*buf1)) { + *buf2++ = + tolower((unsigned char)*buf1++); + cnt++; + } else { *buf2++ = *buf1++; - else if (flag > 0) - if (islower(*buf1)) - *buf2++ = toupper(*buf1++); - else + cnt++; + } + } else if (flag > 0) { + if (islower((unsigned char)*buf1)) { + *buf2++ = + toupper((unsigned char)*buf1++); + cnt++; + } else { *buf2++ = *buf1++; - else + cnt++; + } + } else { *buf2++ = *buf1++; + cnt++; + } + if (cnt == WORDLEN) + while (*buf1 && !isspace((unsigned char)*buf1)) + buf1++; } else *buf2++ = *buf1++; - *buf2 = 0; - while (isspace(*buf1)) + *buf2 = '\0'; + while (isspace((unsigned char)*buf1)) buf1++; - return (*buf1 ? buf1 : 0); + return (*buf1 ? buf1 : NULL); }