Lines Matching refs:state

91 bigger_buffer (struct unzip_state *state, size_t start)
93 size_t more = state->size ? state->size * 2 : start;
94 char *b = realloc (state->buffer, more);
95 while (unlikely (b == NULL) && more >= state->size + 1024)
96 b = realloc (state->buffer, more -= 1024);
99 state->buffer = b;
100 state->size = more;
105 smaller_buffer (struct unzip_state *state, size_t end)
107 state->buffer =
108 realloc (state->buffer, end) ?: end == 0 ? NULL : state->buffer;
109 state->size = end;
113 fail (struct unzip_state *state, Dwfl_Error failure)
115 if (state->input_pos == (off_t) state->mapped_size)
116 *state->whole = state->input_buffer;
119 free (state->input_buffer);
120 *state->whole = NULL;
122 free (state->buffer);
128 zlib_fail (struct unzip_state *state, int result)
133 return fail (state, DWFL_E_NOMEM);
135 return fail (state, DWFL_E_ERRNO);
137 return fail (state, DWFL_E_ZLIB);
144 open_stream (int fd, off_t start_offset, struct unzip_state *state)
158 state->zf = gzdopen (d, "r");
159 if (unlikely (state->zf == NULL))
183 struct unzip_state state =
198 if (*state.whole == NULL)
200 state.input_buffer = malloc (READ_SIZE);
201 if (unlikely (state.input_buffer == NULL))
204 ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE, start_offset);
206 return fail (&state, DWFL_E_ERRNO);
208 state.input_pos = n;
209 mapped = state.input_buffer;
210 state.mapped_size = n;
214 state.input_buffer = *state.whole;
215 state.input_pos = state.mapped_size = *whole_size;
220 (state.mapped_size <= sizeof magic || \
237 size_t avail_in = state.mapped_size;
245 return fail (&state, DWFL_E_NOMEM);
249 if (avail_in == 0 && state.input_buffer != NULL)
251 ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE,
252 start_offset + state.input_pos);
256 return fail (&state, DWFL_E_ERRNO);
258 next_in = state.input_buffer;
260 state.input_pos += n;
264 ptrdiff_t pos = (void *) next_out - state.buffer;
265 if (!bigger_buffer (&state, avail_in))
268 return fail (&state, DWFL_E_NOMEM);
270 next_out = state.buffer + pos;
271 avail_out = state.size - pos;
295 return fail (&state, DWFL_E_ZSTD);
297 smaller_buffer (&state, total_out);
305 z_stream z = { .next_in = mapped, .avail_in = state.mapped_size };
310 return zlib_fail (&state, result);
315 if (z.avail_in == 0 && state.input_buffer != NULL)
317 ssize_t n = pread_retry (fd, state.input_buffer, READ_SIZE,
318 start_offset + state.input_pos);
322 return zlib_fail (&state, Z (ERRNO));
324 z.next_in = state.input_buffer;
326 state.input_pos += n;
330 ptrdiff_t pos = (void *) z.next_out - state.buffer;
331 if (!bigger_buffer (&state, z.avail_in))
336 z.next_out = state.buffer + pos;
337 z.avail_out = state.size - pos;
345 smaller_buffer (&state, total_out);
347 smaller_buffer (&state, z.total_out);
353 return zlib_fail (&state, result);
359 Dwfl_Error result = open_stream (fd, start_offset, &state);
361 if (result == DWFL_E_NOERROR && gzdirect (state.zf))
363 gzclose (state.zf);
365 return fail (&state, DWFL_E_BADELF);
369 return fail (&state, result);
374 if (!bigger_buffer (&state, 1024))
376 gzclose (state.zf);
377 return zlib_fail (&state, Z (MEM_ERROR));
379 int n = gzread (state.zf, state.buffer + pos, state.size - pos);
383 gzerror (state.zf, &code);
384 gzclose (state.zf);
385 return zlib_fail (&state, code);
392 gzclose (state.zf);
393 smaller_buffer (&state, pos);
396 free (state.input_buffer);
398 *state.whole = state.buffer;
399 *whole_size = state.size;