1/* $NetBSD: getcom.c,v 1.15 2021/05/02 12:50:43 rillig Exp $ */ 2 3/* 4 * Copyright (c) 1983, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32#include <sys/cdefs.h> 33#ifndef lint 34#if 0 35static char sccsid[] = "@(#)getcom.c 8.1 (Berkeley) 5/31/93"; 36#else 37__RCSID("$NetBSD: getcom.c,v 1.15 2021/05/02 12:50:43 rillig Exp $"); 38#endif 39#endif /* not lint */ 40 41#include "extern.h" 42 43char * 44getcom(char *buf, int size, const char *prompt, const char *error) 45{ 46 for (;;) { 47 fputs(prompt, stdout); 48 if (fgets(buf, size, stdin) == NULL) { 49 if (feof(stdin)) 50 die(); 51 clearerr(stdin); 52 continue; 53 } 54 while (isspace((unsigned char)*buf)) 55 buf++; 56 if (*buf) 57 break; 58 if (error) 59 puts(error); 60 } 61 /* If we didn't get to the end of line, don't read it in next time. */ 62 if (buf[strlen(buf) - 1] != '\n') { 63 int i; 64 while ((i = getchar()) != '\n' && i != EOF) 65 continue; 66 } 67 return (buf); 68} 69 70 71/* 72 * shifts to UPPERCASE if flag > 0, lowercase if flag < 0, 73 * and leaves it unchanged if flag = 0 74 */ 75char * 76getword(char *buf1, char *buf2, int flag) 77{ 78 int cnt; 79 80 cnt = 1; 81 while (isspace((unsigned char)*buf1)) 82 buf1++; 83 if (*buf1 != ',') { 84 if (!*buf1) { 85 *buf2 = 0; 86 return (0); 87 } 88 while (cnt < WORDLEN && *buf1 && 89 !isspace((unsigned char)*buf1) && *buf1 != ',') 90 if (flag < 0) { 91 if (isupper((unsigned char)*buf1)) { 92 *buf2++ = 93 tolower((unsigned char)*buf1++); 94 cnt++; 95 } else { 96 *buf2++ = *buf1++; 97 cnt++; 98 } 99 } else if (flag > 0) { 100 if (islower((unsigned char)*buf1)) { 101 *buf2++ = 102 toupper((unsigned char)*buf1++); 103 cnt++; 104 } else { 105 *buf2++ = *buf1++; 106 cnt++; 107 } 108 } else { 109 *buf2++ = *buf1++; 110 cnt++; 111 } 112 if (cnt == WORDLEN) 113 while (*buf1 && !isspace((unsigned char)*buf1)) 114 buf1++; 115 } else 116 *buf2++ = *buf1++; 117 *buf2 = '\0'; 118 while (isspace((unsigned char)*buf1)) 119 buf1++; 120 return (*buf1 ? buf1 : NULL); 121} 122