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