1/*	$NetBSD: gets.c,v 1.1 2006/04/07 14:21:29 cherry Exp $	*/
2
3/*-
4 * Copyright (c) 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. All advertising materials mentioning features or use of this software
16 *    must display the following acknowledgement:
17 *	This product includes software developed by the University of
18 *	California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 *
35 *	@(#)gets.c	8.1 (Berkeley) 6/11/93
36 */
37
38#include <sys/cdefs.h>
39
40#include "lib/libsa/stand.h"
41#include "lib/libsa/loadfile.h"
42
43#include "bootstrap.h"
44
45/* gets() with constrained input length */
46
47void
48ngets(char *buf, int n)
49{
50    int c;
51    char *lp;
52
53    for (lp = buf;;)
54	switch (c = getchar() & 0177) {
55	case '\n':
56	case '\r':
57	    *lp = '\0';
58	    putchar('\n');
59	    return;
60	case '\b':
61	case '\177':
62	    if (lp > buf) {
63		lp--;
64		putchar('\b');
65		putchar(' ');
66		putchar('\b');
67	    }
68	    break;
69	case 'r'&037: {
70	    char *p;
71
72	    putchar('\n');
73	    for (p = buf; p < lp; ++p)
74		putchar(*p);
75	    break;
76	}
77	case 'u'&037:
78	case 'w'&037:
79	    lp = buf;
80	    putchar('\n');
81	    break;
82	default:
83	    if ((n < 1) || ((lp - buf) < n)) {
84		*lp++ = c;
85		putchar(c);
86	    }
87	}
88    /*NOTREACHED*/
89}
90
91int
92fgetstr(char *buf, int size, int fd)
93{
94    char	c;
95    int		err, len;
96
97    size--;	/* leave space for terminator */
98    len = 0;
99    while (size != 0) {
100	err = read(fd, &c, sizeof(c));
101	if (err < 0)		/* read error */
102	    return(-1);
103	if (err == 0) {		/* EOF */
104	    if (len == 0)
105		return(-1);	/* nothing to read */
106	    break;
107	}
108	if ((c == '\r') ||	/* line terminators */
109	    (c == '\n'))
110	    break;
111	*buf++ = c;		/* keep char */
112	size--;
113	len++;
114    }
115    *buf = 0;
116    return(len);
117}
118