Home | History | Annotate | Download | only in libdwfl

Lines Matching refs:state

83 bigger_buffer (struct unzip_state *state, size_t start)
85 size_t more = state->size ? state->size * 2 : start;
86 char *b = realloc (state->buffer, more);
87 while (unlikely (b == NULL) && more >= state->size + 1024)
88 b = realloc (state->buffer, more -= 1024);
91 state->buffer = b;
92 state->size = more;
97 smaller_buffer (struct unzip_state *state, size_t end)
99 state->buffer =
100 realloc (state->buffer, end) ?: end == 0 ? NULL : state->buffer;
101 state->size = end;
105 fail (struct unzip_state *state, Dwfl_Error failure)
107 if (state->input_pos == (off_t) state->mapped_size)
108 *state->whole = state->input_buffer;
111 free (state->input_buffer);
112 *state->whole = NULL;
114 free (state->buffer);
119 zlib_fail (struct unzip_state *state, int result)
124 return fail (state, DWFL_E_NOMEM);
126 return fail (state, DWFL_E_ERRNO);
128 return fail (state, DWFL_E_ZLIB);
134 open_stream (int fd, off_t start_offset, struct unzip_state *state)
148 state->zf = gzdopen (d, "r");
149 if (unlikely (state->zf == NULL))
152 return zlib_fail (state, Z (MEM_ERROR));
173 struct unzip_state state =
188 if (*state.whole == NULL)
190 state.input_buffer = malloc (READ_SIZE);
191 if (unlikely (state.input_buffer == NULL))
194 ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, start_offset);
196 return zlib_fail (&state, Z (ERRNO));
198 state.input_pos = n;
199 mapped = state.input_buffer;
200 state.mapped_size = n;
204 state.input_buffer = *state.whole;
205 state.input_pos = state.mapped_size = *whole_size;
210 (state.mapped_size <= sizeof magic || \
228 z_stream z = { .next_in = mapped, .avail_in = state.mapped_size };
233 return zlib_fail (&state, result);
238 if (z.avail_in == 0 && state.input_buffer != NULL)
240 ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE,
241 start_offset + state.input_pos);
245 return zlib_fail (&state, Z (ERRNO));
247 z.next_in = state.input_buffer;
249 state.input_pos += n;
253 ptrdiff_t pos = (void *) z.next_out - state.buffer;
254 if (!bigger_buffer (&state, z.avail_in))
259 z.next_out = state.buffer + pos;
260 z.avail_out = state.size - pos;
268 smaller_buffer (&state, total_out);
270 smaller_buffer (&state, z.total_out);
276 return zlib_fail (&state, result);
282 Dwfl_Error result = open_stream (fd, start_offset, &state);
284 if (result == DWFL_E_NOERROR && gzdirect (state.zf))
286 gzclose (state.zf);
287 return fail (&state, DWFL_E_BADELF);
291 return fail (&state, result);
296 if (!bigger_buffer (&state, 1024))
298 gzclose (state.zf);
299 return zlib_fail (&state, Z (MEM_ERROR));
301 int n = gzread (state.zf, state.buffer + pos, state.size - pos);
305 gzerror (state.zf, &code);
306 gzclose (state.zf);
307 return zlib_fail (&state, code);
314 gzclose (state.zf);
315 smaller_buffer (&state, pos);
318 free (state.input_buffer);
320 *state.whole = state.buffer;
321 *whole_size = state.size;