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