/*
 * Copyright (c) 2009-2010 Todd C. Miller <Todd.Miller@courtesan.com>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <config.h>

#include <sys/types.h>

#include <stdio.h>
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif /* STDC_HEADERS */
#ifdef HAVE_STRING_H
# include <string.h>
#endif /* HAVE_STRING_H */
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif /* HAVE_STRINGS_H */
#include <limits.h>

#include "compat.h"
#include "alloc.h"

#ifndef LINE_MAX
# define LINE_MAX 2048
#endif

#ifdef HAVE_FGETLN
ssize_t
getline(bufp, bufsizep, fp)
    char **bufp;
    size_t *bufsizep;
    FILE *fp;
{
    char *buf;
    size_t bufsize;
    size_t len;

    buf = fgetln(fp, &len);
    if (buf) {
	bufsize = *bufp ? *bufsizep : 0;
	if (bufsize < len + 1) {
	    bufsize = len + 1;
	    *bufp = erealloc(*bufp, bufsize);
	    *bufsizep = bufsize;
	}
	memcpy(*bufp, buf, len);
	(*bufp)[len] = '\0';
    }
    return(buf ? len : -1);
}
#else
ssize_t
getline(bufp, bufsizep, fp)
    char **bufp;
    size_t *bufsizep;
    FILE *fp;
{
    char *buf;
    size_t bufsize;
    ssize_t len = 0;

    buf = *bufp;
    bufsize = *bufsizep;
    if (buf == NULL || bufsize == 0) {
	bufsize = LINE_MAX;
	buf = erealloc(buf, LINE_MAX);
    }

    for (;;) {
	if (fgets(buf + len, bufsize - len, fp) == NULL) {
	    len = -1;
	    break;
	}
	len = strlen(buf);
	if (!len || buf[len - 1] == '\n' || feof(fp))
	    break;
	bufsize *= 2;
	buf = erealloc(buf, bufsize);
    }
    *bufp = buf;
    *bufsizep = bufsize;
    return(len);
}
#endif
