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