
1: /* lib/fgetln.c - bsd-games implementation of fgetln. 2: * 3: * Copyright (c) 1997, 1998, 1999, 2000, 2004 Joseph Samuel Myers. 4: * All rights reserved. 5: * 6: * Redistribution and use in source and binary forms, with or without 7: * modification, are permitted provided that the following conditions 8: * are met: 9: * 1. Redistributions of source code must retain the above copyright 10: * notice, this list of conditions and the following disclaimer. 11: * 2. Redistributions in binary form must reproduce the above copyright 12: * notice, this list of conditions and the following disclaimer in the 13: * documentation and/or other materials provided with the distribution. 14: * 3. The name of the author may not be used to endorse or promote products 15: * derived from this software without specific prior written permission. 16: * 17: * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18: * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20: * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21: * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 22: * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23: * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 24: * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 25: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27: * SUCH DAMAGE. 28: */ 29: 30: #include <stdio.h> 31: #include <stdlib.h> 32: #include <string.h> 33: 34: #ifndef HAVE_fgetln 35: char * 36: fgetln(FILE *stream, size_t *len) 37: { 38: static char *buf = NULL; 39: static size_t buflen = 0; 40: char *res; 41: char *nbuf; 42: if (buf == NULL) { 43: buf = (char *)malloc(buflen = 1024); 44: if (buf == NULL) { 45: return NULL; 46: } 47: } 48: buf[buflen - 1] = 1; 49: res = fgets(buf, buflen, stream); 50: if (res == NULL) 51: return NULL; 52: while (buf[buflen - 1] == 0 && buf[buflen - 2] != '\n') { /* long line */ 53: nbuf = realloc(buf, buflen * 2); 54: if (nbuf == NULL) 55: return NULL; 56: buf = nbuf; 57: buflen *= 2; 58: buf[buflen - 1] = 1; 59: res = fgets(buf + buflen/2 - 1, buflen/2 + 1, stream); 60: if (res == NULL) 61: return NULL; 62: } 63: *len = strlen(buf); 64: return buf; 65: } 66: #endif /* !defined(HAVE_fgetln) */