Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tools/build/cross-build/fgetln_fallback.c
39507 views
1
/*
2
* Copyright © 2005 Hector Garcia Alvarez
3
* Copyright © 2005, 2008-2012 Guillem Jover <[email protected]>
4
*
5
* Redistribution and use in source and binary forms, with or without
6
* modification, are permitted provided that the following conditions
7
* are met:
8
* 1. Redistributions of source code must retain the above copyright
9
* notice, this list of conditions and the following disclaimer.
10
* 2. Redistributions in binary form must reproduce the above copyright
11
* notice, this list of conditions and the following disclaimer in the
12
* documentation and/or other materials provided with the distribution.
13
* 3. The name of the author may not be used to endorse or promote products
14
* derived from this software without specific prior written permission.
15
*
16
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
17
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
18
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
19
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
*/
27
28
#include <stdio.h>
29
30
#include <sys/types.h>
31
#include <string.h>
32
33
#include "local-link.h"
34
35
#define HAVE_GETLINE 1
36
#ifdef HAVE_GETLINE
37
struct filebuf {
38
FILE *fp;
39
char *buf;
40
size_t len;
41
};
42
43
#define FILEBUF_POOL_ITEMS 32
44
45
static struct filebuf fb_pool[FILEBUF_POOL_ITEMS];
46
static int fb_pool_cur;
47
48
char *
49
fgetln(FILE *stream, size_t *len)
50
{
51
struct filebuf *fb;
52
ssize_t nread;
53
54
flockfile(stream);
55
56
/* Try to diminish the possibility of several fgetln() calls being
57
* used on different streams, by using a pool of buffers per file. */
58
fb = &fb_pool[fb_pool_cur];
59
if (fb->fp != stream && fb->fp != NULL) {
60
fb_pool_cur++;
61
fb_pool_cur %= FILEBUF_POOL_ITEMS;
62
fb = &fb_pool[fb_pool_cur];
63
}
64
fb->fp = stream;
65
66
nread = getline(&fb->buf, &fb->len, stream);
67
68
funlockfile(stream);
69
70
/* Note: the getdelim/getline API ensures nread != 0. */
71
if (nread == -1) {
72
*len = 0;
73
return NULL;
74
} else {
75
*len = (size_t)nread;
76
return fb->buf;
77
}
78
}
79
libbsd_link_warning(fgetln,
80
"This function cannot be safely ported, use getline(3) "
81
"instead, as it is supported by GNU and POSIX.1-2008.")
82
#else
83
#error "Function fgetln() needs to be ported."
84
#endif
85
86