136 unsigned char *output,
137 size_t *output_length)
140 const unsigned char *input_ptr;
141 unsigned char *output_ptr;
142 const unsigned char *match_ptr;
143 const unsigned char *
const input_ptr_end =
input + input_length;
144 unsigned char *
const output_ptr_end = output + *output_length;
152 goto input_too_large;
170 z += 15 + *input_ptr++;
176 const size_t len = z + 3;
179 memcpy(output_ptr, input_ptr, len);
190 match_ptr -= *input_ptr++ << 2;
194 *output_ptr++ = *match_ptr++;
195 *output_ptr++ = *match_ptr++;
196 *output_ptr++ = *match_ptr;
206 match_ptr = output_ptr - 1;
207 match_ptr -= (z >> 2) & 7;
208 match_ptr -= *input_ptr++ << 3;
223 z += 31 + *input_ptr++;
226 match_ptr = output_ptr - 1;
227 match_ptr -=
get_u16(input_ptr) >> 2;
232 match_ptr = output_ptr;
233 match_ptr -= (z & 8) << 11;
244 z += 7 + *input_ptr++;
247 match_ptr -=
get_u16(input_ptr) >> 2;
255 match_ptr = output_ptr - 1;
257 match_ptr -= *input_ptr++ << 2;
261 *output_ptr++ = *match_ptr++;
262 *output_ptr++ = *match_ptr;
272 const size_t len = z + 2;
278 z = input_ptr[-2] & 3;
288 *output_ptr++ = *input_ptr++;
291 *output_ptr++ = *input_ptr++;
293 *output_ptr++ = *input_ptr++;
302 z = *input_ptr++ - 17;
310 *output_ptr++ = *input_ptr++;
312 goto initial_literal;
315 *output_length =
ptr_diff(output_ptr, output);
320 *output_length =
ptr_diff(output_ptr, output);
321 return (input_ptr == input_ptr_end
326 *output_length =
ptr_diff(output_ptr, output);
330 *output_length =
ptr_diff(output_ptr, output);
334 *output_length =
ptr_diff(output_ptr, output);