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