xref: /titanic_52/usr/src/cmd/mandoc/compat_fgetln.c (revision 260e9a87725c090ba5835b1f9f0b62fa2f96036f)
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 *
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