|  | /* $Id: fgetln.c,v 1.5 2009-04-29 22:45:32 nicm Exp $ */ | 
|  | /*	$NetBSD: fgetln.c,v 1.3 2007/08/07 02:06:58 lukem Exp $	*/ | 
|  |  | 
|  | /*- | 
|  | * Copyright (c) 1998 The NetBSD Foundation, Inc. | 
|  | * All rights reserved. | 
|  | * | 
|  | * This code is derived from software contributed to The NetBSD Foundation | 
|  | * by Christos Zoulas. | 
|  | * | 
|  | * Redistribution and use in source and binary forms, with or without | 
|  | * modification, are permitted provided that the following conditions | 
|  | * are met: | 
|  | * 1. Redistributions of source code must retain the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer. | 
|  | * 2. Redistributions in binary form must reproduce the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer in the | 
|  | *    documentation and/or other materials provided with the distribution. | 
|  | * 3. Neither the name of The NetBSD Foundation nor the names of its | 
|  | *    contributors may be used to endorse or promote products derived | 
|  | *    from this software without specific prior written permission. | 
|  | * | 
|  | * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS | 
|  | * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED | 
|  | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
|  | * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | 
|  | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
|  | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|  | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | 
|  | * POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | #include <sys/types.h> | 
|  |  | 
|  | #include <errno.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <string.h> | 
|  |  | 
|  | #include "tmux.h" | 
|  |  | 
|  | char * | 
|  | fgetln(fp, len) | 
|  | FILE *fp; | 
|  | size_t *len; | 
|  | { | 
|  | static char *buf = NULL; | 
|  | static size_t bufsiz = 0; | 
|  | char *ptr; | 
|  |  | 
|  |  | 
|  | if (buf == NULL) { | 
|  | bufsiz = BUFSIZ; | 
|  | if ((buf = malloc(bufsiz)) == NULL) | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  | if (fgets(buf, bufsiz, fp) == NULL) | 
|  | return NULL; | 
|  |  | 
|  | *len = 0; | 
|  | while ((ptr = strchr(&buf[*len], '\n')) == NULL) { | 
|  | size_t nbufsiz = bufsiz + BUFSIZ; | 
|  | char *nbuf = realloc(buf, nbufsiz); | 
|  |  | 
|  | if (nbuf == NULL) { | 
|  | int oerrno = errno; | 
|  | free(buf); | 
|  | errno = oerrno; | 
|  | buf = NULL; | 
|  | return NULL; | 
|  | } else | 
|  | buf = nbuf; | 
|  |  | 
|  | *len = bufsiz; | 
|  | if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL) | 
|  | return buf; | 
|  |  | 
|  | bufsiz = nbufsiz; | 
|  | } | 
|  |  | 
|  | *len = (ptr - buf) + 1; | 
|  | return buf; | 
|  | } | 
|  |  |