gets.c revision 165906
1216615Slstewart/*	$NetBSD: gets.c,v 1.6 1995/10/11 21:16:57 pk Exp $	*/
2216615Slstewart
3216615Slstewart/*-
4216615Slstewart * Copyright (c) 1993
5216615Slstewart *	The Regents of the University of California.  All rights reserved.
6216615Slstewart *
7220560Slstewart * Redistribution and use in source and binary forms, with or without
8220560Slstewart * modification, are permitted provided that the following conditions
9220560Slstewart * are met:
10216615Slstewart * 1. Redistributions of source code must retain the above copyright
11216615Slstewart *    notice, this list of conditions and the following disclaimer.
12216615Slstewart * 2. Redistributions in binary form must reproduce the above copyright
13216615Slstewart *    notice, this list of conditions and the following disclaimer in the
14216615Slstewart *    documentation and/or other materials provided with the distribution.
15216615Slstewart * 4. Neither the name of the University nor the names of its contributors
16216615Slstewart *    may be used to endorse or promote products derived from this software
17216615Slstewart *    without specific prior written permission.
18216615Slstewart *
19216615Slstewart * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20216615Slstewart * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21216615Slstewart * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22216615Slstewart * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23216615Slstewart * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24216615Slstewart * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25216615Slstewart * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26216615Slstewart * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27216615Slstewart * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28216615Slstewart * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29216615Slstewart * SUCH DAMAGE.
30216615Slstewart *
31216615Slstewart *	@(#)gets.c	8.1 (Berkeley) 6/11/93
32216615Slstewart */
33216615Slstewart
34216615Slstewart#include <sys/cdefs.h>
35216615Slstewart__FBSDID("$FreeBSD: head/lib/libstand/gets.c 165906 2007-01-09 01:02:06Z imp $");
36216615Slstewart
37216615Slstewart#include "stand.h"
38216615Slstewart
39216615Slstewart/* gets() with constrained input length */
40216615Slstewart
41216615Slstewartvoid
42220560Slstewartngets(char *buf, int n)
43220560Slstewart{
44220560Slstewart    int c;
45220560Slstewart    char *lp;
46216615Slstewart
47216615Slstewart    for (lp = buf;;)
48216615Slstewart	switch (c = getchar() & 0177) {
49216615Slstewart	case '\n':
50216615Slstewart	case '\r':
51216615Slstewart	    *lp = '\0';
52216615Slstewart	    putchar('\n');
53216615Slstewart	    return;
54216615Slstewart	case '\b':
55216615Slstewart	case '\177':
56216615Slstewart	    if (lp > buf) {
57216615Slstewart		lp--;
58216615Slstewart		putchar('\b');
59216615Slstewart		putchar(' ');
60216615Slstewart		putchar('\b');
61216615Slstewart	    }
62216615Slstewart	    break;
63216615Slstewart	case 'r'&037: {
64216615Slstewart	    char *p;
65216615Slstewart
66216615Slstewart	    putchar('\n');
67216615Slstewart	    for (p = buf; p < lp; ++p)
68216615Slstewart		putchar(*p);
69216615Slstewart	    break;
70216615Slstewart	}
71216615Slstewart	case 'u'&037:
72216615Slstewart	case 'w'&037:
73216615Slstewart	    lp = buf;
74216615Slstewart	    putchar('\n');
75216615Slstewart	    break;
76216615Slstewart	default:
77216615Slstewart	    if ((n < 1) || ((lp - buf) < n)) {
78216615Slstewart		*lp++ = c;
79216615Slstewart		putchar(c);
80216615Slstewart	    }
81216615Slstewart	}
82216615Slstewart    /*NOTREACHED*/
83216615Slstewart}
84216615Slstewart
85216615Slstewartint
86216615Slstewartfgetstr(char *buf, int size, int fd)
87216615Slstewart{
88216615Slstewart    char	c;
89216615Slstewart    int		err, len;
90216615Slstewart
91216615Slstewart    size--;	/* leave space for terminator */
92216615Slstewart    len = 0;
93216615Slstewart    while (size != 0) {
94216615Slstewart	err = read(fd, &c, sizeof(c));
95216615Slstewart	if (err < 0)		/* read error */
96216615Slstewart	    return(-1);
97216615Slstewart	if (err == 0) {		/* EOF */
98216615Slstewart	    if (len == 0)
99216615Slstewart		return(-1);	/* nothing to read */
100216615Slstewart	    break;
101216615Slstewart	}
102216615Slstewart	if ((c == '\r') ||	/* line terminators */
103216615Slstewart	    (c == '\n'))
104216615Slstewart	    break;
105216615Slstewart	*buf++ = c;		/* keep char */
106216615Slstewart	size--;
107216615Slstewart	len++;
108216615Slstewart    }
109216615Slstewart    *buf = 0;
110216615Slstewart    return(len);
111216615Slstewart}
112216615Slstewart
113216615Slstewart