1*260e9a87SYuri Pankov #include "config.h"
2*260e9a87SYuri Pankov
3*260e9a87SYuri Pankov #if HAVE_FGETLN
4*260e9a87SYuri Pankov
5*260e9a87SYuri Pankov int dummy;
6*260e9a87SYuri Pankov
7*260e9a87SYuri Pankov #else
8*260e9a87SYuri Pankov
9*260e9a87SYuri Pankov /* $NetBSD: fgetln.c,v 1.3 2006/09/25 07:18:17 lukem Exp $ */
10*260e9a87SYuri Pankov
11*260e9a87SYuri Pankov /*-
12*260e9a87SYuri Pankov * Copyright (c) 1998 The NetBSD Foundation, Inc.
13*260e9a87SYuri Pankov * All rights reserved.
14*260e9a87SYuri Pankov *
15*260e9a87SYuri Pankov * This code is derived from software contributed to The NetBSD Foundation
16*260e9a87SYuri Pankov * by Christos Zoulas.
17*260e9a87SYuri Pankov *
18*260e9a87SYuri Pankov * Redistribution and use in source and binary forms, with or without
19*260e9a87SYuri Pankov * modification, are permitted provided that the following conditions
20*260e9a87SYuri Pankov * are met:
21*260e9a87SYuri Pankov * 1. Redistributions of source code must retain the above copyright
22*260e9a87SYuri Pankov * notice, this list of conditions and the following disclaimer.
23*260e9a87SYuri Pankov * 2. Redistributions in binary form must reproduce the above copyright
24*260e9a87SYuri Pankov * notice, this list of conditions and the following disclaimer in the
25*260e9a87SYuri Pankov * documentation and/or other materials provided with the distribution.
26*260e9a87SYuri Pankov * 3. Neither the name of The NetBSD Foundation nor the names of its
27*260e9a87SYuri Pankov * contributors may be used to endorse or promote products derived
28*260e9a87SYuri Pankov * from this software without specific prior written permission.
29*260e9a87SYuri Pankov *
30*260e9a87SYuri Pankov * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
31*260e9a87SYuri Pankov * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
32*260e9a87SYuri Pankov * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
33*260e9a87SYuri Pankov * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
34*260e9a87SYuri Pankov * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
35*260e9a87SYuri Pankov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
36*260e9a87SYuri Pankov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
37*260e9a87SYuri Pankov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
38*260e9a87SYuri Pankov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
39*260e9a87SYuri Pankov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
40*260e9a87SYuri Pankov * POSSIBILITY OF SUCH DAMAGE.
41*260e9a87SYuri Pankov */
42*260e9a87SYuri Pankov
43*260e9a87SYuri Pankov #include <sys/types.h>
44*260e9a87SYuri Pankov
45*260e9a87SYuri Pankov #include <errno.h>
46*260e9a87SYuri Pankov #include <stdio.h>
47*260e9a87SYuri Pankov #include <stdlib.h>
48*260e9a87SYuri Pankov #include <string.h>
49*260e9a87SYuri Pankov
50*260e9a87SYuri Pankov char *
fgetln(fp,len)51*260e9a87SYuri Pankov fgetln(fp, len)
52*260e9a87SYuri Pankov FILE *fp;
53*260e9a87SYuri Pankov size_t *len;
54*260e9a87SYuri Pankov {
55*260e9a87SYuri Pankov static char *buf = NULL;
56*260e9a87SYuri Pankov static size_t bufsiz = 0;
57*260e9a87SYuri Pankov char *ptr;
58*260e9a87SYuri Pankov
59*260e9a87SYuri Pankov
60*260e9a87SYuri Pankov if (buf == NULL) {
61*260e9a87SYuri Pankov bufsiz = BUFSIZ;
62*260e9a87SYuri Pankov if ((buf = malloc(bufsiz)) == NULL)
63*260e9a87SYuri Pankov return NULL;
64*260e9a87SYuri Pankov }
65*260e9a87SYuri Pankov
66*260e9a87SYuri Pankov if (fgets(buf, bufsiz, fp) == NULL)
67*260e9a87SYuri Pankov return NULL;
68*260e9a87SYuri Pankov
69*260e9a87SYuri Pankov *len = 0;
70*260e9a87SYuri Pankov while ((ptr = strchr(&buf[*len], '\n')) == NULL) {
71*260e9a87SYuri Pankov size_t nbufsiz = bufsiz + BUFSIZ;
72*260e9a87SYuri Pankov char *nbuf = realloc(buf, nbufsiz);
73*260e9a87SYuri Pankov
74*260e9a87SYuri Pankov if (nbuf == NULL) {
75*260e9a87SYuri Pankov int oerrno = errno;
76*260e9a87SYuri Pankov free(buf);
77*260e9a87SYuri Pankov errno = oerrno;
78*260e9a87SYuri Pankov buf = NULL;
79*260e9a87SYuri Pankov return NULL;
80*260e9a87SYuri Pankov } else
81*260e9a87SYuri Pankov buf = nbuf;
82*260e9a87SYuri Pankov
83*260e9a87SYuri Pankov *len = bufsiz;
84*260e9a87SYuri Pankov if (fgets(&buf[bufsiz], BUFSIZ, fp) == NULL)
85*260e9a87SYuri Pankov return buf;
86*260e9a87SYuri Pankov
87*260e9a87SYuri Pankov bufsiz = nbufsiz;
88*260e9a87SYuri Pankov }
89*260e9a87SYuri Pankov
90*260e9a87SYuri Pankov *len = (ptr - buf) + 1;
91*260e9a87SYuri Pankov return buf;
92*260e9a87SYuri Pankov }
93*260e9a87SYuri Pankov
94*260e9a87SYuri Pankov #endif
95