1
2
3
4
5
6
7
8
9
10
11#include "libbb.h"
12
13char* FAST_FUNC bb_get_chunk_from_file(FILE *file, size_t *end)
14{
15 int ch;
16 size_t idx = 0;
17 char *linebuf = NULL;
18
19 while ((ch = getc(file)) != EOF) {
20
21 if (!(idx & 0xff)) {
22 if (idx == ((size_t)-1) - 0xff)
23 bb_die_memory_exhausted();
24 linebuf = xrealloc(linebuf, idx + 0x100);
25 }
26 linebuf[idx++] = (char) ch;
27 if (ch == '\0')
28 break;
29 if (end && ch == '\n')
30 break;
31 }
32 if (end)
33 *end = idx;
34 if (linebuf) {
35
36
37
38
39
40
41 linebuf = xrealloc(linebuf, idx + 1);
42 linebuf[idx] = '\0';
43 }
44 return linebuf;
45}
46
47
48char* FAST_FUNC xmalloc_fgets(FILE *file)
49{
50 size_t i;
51
52 return bb_get_chunk_from_file(file, &i);
53}
54
55char* FAST_FUNC xmalloc_fgetline(FILE *file)
56{
57 size_t i;
58 char *c = bb_get_chunk_from_file(file, &i);
59
60 if (i && c[--i] == '\n')
61 c[i] = '\0';
62
63 return c;
64}
65
66#if 0
67
68
69
70char* FAST_FUNC xmalloc_fgets(FILE *file)
71{
72 char *res_buf = NULL;
73 size_t res_sz;
74
75 if (getline(&res_buf, &res_sz, file) == -1) {
76 free(res_buf);
77 res_buf = NULL;
78 }
79
80 return res_buf;
81}
82
83char* FAST_FUNC xmalloc_fgetline(FILE *file)
84{
85 char *res_buf = NULL;
86 size_t res_sz;
87
88 res_sz = getline(&res_buf, &res_sz, file);
89
90 if ((ssize_t)res_sz != -1) {
91 if (res_buf[res_sz - 1] == '\n')
92 res_buf[--res_sz] = '\0';
93
94 } else {
95 free(res_buf);
96 res_buf = NULL;
97 }
98 return res_buf;
99}
100
101#endif
102
103#if 0
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123static char* xmalloc_fgets_internal(FILE *file, int *sizep)
124{
125 int len;
126 int idx = 0;
127 char *linebuf = NULL;
128
129 while (1) {
130 char *r;
131
132 linebuf = xrealloc(linebuf, idx + 0x100);
133 r = fgets(&linebuf[idx], 0x100, file);
134 if (!r) {
135
136
137 linebuf[idx] = '\0';
138 break;
139 }
140
141 len = strlen(&linebuf[idx]);
142 idx += len;
143 if (len != 0xff || linebuf[idx - 1] == '\n')
144 break;
145 }
146 *sizep = idx;
147 if (idx) {
148
149 return linebuf;
150 }
151 free(linebuf);
152 return NULL;
153}
154
155
156char* FAST_FUNC xmalloc_fgetline_fast(FILE *file)
157{
158 int sz;
159 char *r = xmalloc_fgets_internal(file, &sz);
160 if (r && r[sz - 1] == '\n')
161 r[--sz] = '\0';
162 return r;
163}
164
165char* FAST_FUNC xmalloc_fgets(FILE *file)
166{
167 int sz;
168 return xmalloc_fgets_internal(file, &sz);
169}
170
171
172char* FAST_FUNC xmalloc_fgetline(FILE *file)
173{
174 int sz;
175 char *r = xmalloc_fgets_internal(file, &sz);
176 if (!r)
177 return r;
178 if (r[sz - 1] == '\n')
179 r[--sz] = '\0';
180 return xrealloc(r, sz + 1);
181}
182#endif
183