Annotation of mandoc/compat_fgetln.c, Revision 1.2
1.2 ! kristaps 1: #ifdef HAVE_CONFIG_H
! 2: #include "config.h"
! 3: #endif
! 4:
1.1 kristaps 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
CVSweb