altEngine
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
deflate_tinfl.h
Go to the documentation of this file.
1 #pragma once
2 /* tinfl.c v1.16 beta - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c)
3 See "unlicense" statement at the end of this file.
4 Rich Geldreich <richgel99@gmail.com>, last updated Oct. 19, 2013
5 Implements the decompression side of RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
6 
7 There entire decompressor coroutine function is implemented in a *single* C function: tinfl_decompress().
8 All other C functions in this file are optional high-level usage examples.
9 */
10 #ifndef TINFL_HEADER_INCLUDED
11 #define TINFL_HEADER_INCLUDED
12 
13 #include <stdlib.h>
14 
15 typedef unsigned char mz_uint8;
16 typedef signed short mz_int16;
17 typedef unsigned short mz_uint16;
18 typedef unsigned int mz_uint32;
19 typedef unsigned int mz_uint;
20 typedef unsigned long long mz_uint64;
21 
22 #if defined(_M_IX86) || defined(_M_X64)
23 // Set MINIZ_USE_UNALIGNED_LOADS_AND_STORES to 1 if integer loads and stores to unaligned addresses are acceptable on the target platform (slightly faster).
24 #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
25 // Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.
26 #define MINIZ_LITTLE_ENDIAN 1
27 #endif
28 
29 #if defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__)
30 // Set MINIZ_HAS_64BIT_REGISTERS to 1 if the processor has 64-bit general purpose registers (enables 64-bit bitbuffer in inflator)
31 #define MINIZ_HAS_64BIT_REGISTERS 1
32 #endif
33 
34 // Works around MSVC's spammy "warning C4127: conditional expression is constant" message.
35 #ifdef _MSC_VER
36 #define MZ_MACRO_END while (0, 0)
37 #else
38 #define MZ_MACRO_END while (0)
39 #endif
40 
41 // Decompression flags used by tinfl_decompress().
42 // TINFL_FLAG_PARSE_ZLIB_HEADER: If set, the input has a valid zlib header and ends with an adler32 checksum (it's a valid zlib stream). Otherwise, the input is a raw deflate stream.
43 // TINFL_FLAG_HAS_MORE_INPUT: If set, there are more input bytes available beyond the end of the supplied input buffer. If clear, the input buffer contains all remaining input.
44 // TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF: If set, the output buffer is large enough to hold the entire decompressed stream. If clear, the output buffer is at least the size of the dictionary (typically 32KB).
45 // TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.
46 enum
47 {
52 };
53 
54 // High level decompression functions:
55 // tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().
56 // On entry:
57 // pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.
58 // On return:
59 // Function returns a pointer to the decompressed data, or NULL on failure.
60 // *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.
61 // The caller must free() the returned block when it's no longer needed.
62 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
63 
64 // tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.
65 // Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.
66 #define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
67 size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags);
68 
69 // tinfl_decompress_mem_to_callback() decompresses a block in memory to an internal 32KB buffer, and a user provided callback function will be called to flush the buffer.
70 // Returns 1 on success or 0 on failure.
71 typedef int(*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);
72 int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags);
73 
75 
76 // Max size of LZ dictionary.
77 #define TINFL_LZ_DICT_SIZE 32768
78 
79 // Return status.
80 typedef enum
81 {
82  // This flags indicates the inflator needs 1 or more input bytes to make forward progress, but the caller is indicating that no more are available. The compressed data
83  // is probably corrupted. If you call the inflator again with more bytes it'll try to continue processing the input but this is a BAD sign (either the data is corrupted or you called it incorrectly).
84  // If you call it again with no input you'll just get TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS again.
86 
87  // This flag indicates that one or more of the input parameters was obviously bogus. (You can try calling it again, but if you get this error the calling code is wrong.)
89 
90  // This flags indicate the inflator is finished but the adler32 check of the uncompressed data didn't match. If you call it again it'll return TINFL_STATUS_DONE.
92 
93  // This flags indicate the inflator has somehow failed (bad code, corrupted input, etc.). If you call it again without resetting via tinfl_init() it it'll just keep on returning the same status failure code.
95 
96  // Any status code less than TINFL_STATUS_DONE must indicate a failure.
97 
98  // This flag indicates the inflator has returned every byte of uncompressed data that it can, has consumed every byte that it needed, has successfully reached the end of the deflate stream, and
99  // if zlib headers and adler32 checking enabled that it has successfully checked the uncompressed data's adler32. If you call it again you'll just get TINFL_STATUS_DONE over and over again.
101 
102  // This flag indicates the inflator MUST have more input data (even 1 byte) before it can make any more forward progress, or you need to clear the TINFL_FLAG_HAS_MORE_INPUT
103  // flag on the next call if you don't have any more source data. If the source data was somehow corrupted it's also possible (but unlikely) for the inflator to keep on demanding input to
104  // proceed, so be sure to properly set the TINFL_FLAG_HAS_MORE_INPUT flag.
106 
107  // This flag indicates the inflator definitely has 1 or more bytes of uncompressed data available, but it cannot write this data into the output buffer.
108  // Note if the source compressed data was corrupted it's possible for the inflator to return a lot of uncompressed data to the caller. I've been assuming you know how much uncompressed data to expect
109  // (either exact or worst case) and will stop calling the inflator and fail after receiving too much. In pure streaming scenarios where you have no idea how many bytes to expect this may not be possible
110  // so I may need to add some code to address this.
112 
113 } tinfl_status;
114 
115 // Initializes the decompressor to its initial state.
116 #define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
117 #define tinfl_get_adler32(r) (r)->m_check_adler32
118 
119 // Main low-level decompressor coroutine function. This is the only function actually needed for decompression. All the other functions are just high-level helpers for improved usability.
120 // This is a universal API, i.e. it can be used as a building block to build any desired higher level decompression API. In the limit case, it can be called once per every byte input or output.
121 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags);
122 
123 // Internal/private bits follow.
124 enum
125 {
128 };
129 
130 typedef struct
131 {
135 
136 #if MINIZ_HAS_64BIT_REGISTERS
137 #define TINFL_USE_64BIT_BITBUF 1
138 #endif
139 
140 #if TINFL_USE_64BIT_BITBUF
141 typedef mz_uint64 tinfl_bit_buf_t;
142 #define TINFL_BITBUF_SIZE (64)
143 #else
145 #define TINFL_BITBUF_SIZE (32)
146 #endif
147 
149 {
155 };
156 
157 #endif // #ifdef TINFL_HEADER_INCLUDED
158 
159 // ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)
160 
161 #ifndef TINFL_HEADER_FILE_ONLY
162 
163 #include <string.h>
164 
165 // MZ_MALLOC, etc. are only used by the optional high-level helper functions.
166 #ifdef MINIZ_NO_MALLOC
167 #define MZ_MALLOC(x) NULL
168 #define MZ_FREE(x) (void)x, ((void)0)
169 #define MZ_REALLOC(p, x) NULL
170 #else
171 #define MZ_MALLOC(x) malloc(x)
172 #define MZ_FREE(x) free(x)
173 #define MZ_REALLOC(p, x) realloc(p, x)
174 #endif
175 
176 #define MZ_MAX(a,b) (((a)>(b))?(a):(b))
177 #define MZ_MIN(a,b) (((a)<(b))?(a):(b))
178 #define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
179 
180 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
181 #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
182 #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
183 #else
184 #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
185 #define MZ_READ_LE32(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U) | ((mz_uint32)(((const mz_uint8 *)(p))[2]) << 16U) | ((mz_uint32)(((const mz_uint8 *)(p))[3]) << 24U))
186 #endif
187 
188 #define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
189 #define TINFL_MEMSET(p, c, l) memset(p, c, l)
190 
191 #define TINFL_CR_BEGIN switch(r->m_state) { case 0:
192 #define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
193 #define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
194 #define TINFL_CR_FINISH }
195 
196 #define TINFL_GET_BYTE(state_index, c) do { \
197  while (pIn_buf_cur >= pIn_buf_end) { \
198  TINFL_CR_RETURN(state_index, (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) ? TINFL_STATUS_NEEDS_MORE_INPUT : TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS); \
199  } c = *pIn_buf_cur++; } MZ_MACRO_END
200 
201 #define TINFL_NEED_BITS(state_index, n) do { mz_uint c; TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; } while (num_bits < (mz_uint)(n))
202 #define TINFL_SKIP_BITS(state_index, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
203 #define TINFL_GET_BITS(state_index, b, n) do { if (num_bits < (mz_uint)(n)) { TINFL_NEED_BITS(state_index, n); } b = bit_buf & ((1 << (n)) - 1); bit_buf >>= (n); num_bits -= (n); } MZ_MACRO_END
204 
205 // TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.
206 // It reads just enough bytes from the input stream that are needed to decode the next Huffman code (and absolutely no more). It works by trying to fully decode a
207 // Huffman code by using whatever bits are currently present in the bit buffer. If this fails, it reads another byte, and tries again until it succeeds or until the
208 // bit buffer contains >=15 bits (deflate's max. Huffman code size).
209 #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
210  do { \
211  temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
212  if (temp >= 0) { \
213  code_len = temp >> 9; \
214  if ((code_len) && (num_bits >= code_len)) \
215  break; \
216  } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
217  code_len = TINFL_FAST_LOOKUP_BITS; \
218  do { \
219  temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
220  } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
221  } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
222  } while (num_bits < 15);
223 
224 // TINFL_HUFF_DECODE() decodes the next Huffman coded symbol. It's more complex than you would initially expect because the zlib API expects the decompressor to never read
225 // beyond the final byte of the deflate stream. (In other words, when this macro wants to read another byte from the input, it REALLY needs another byte in order to fully
226 // decode the next Huffman code.) Handling this properly is particularly important on raw deflate (non-zlib) streams, which aren't followed by a byte aligned adler-32.
227 // The slow path is only executed at the very end of the input buffer.
228 // v1.16: The original macro handled the case at the very end of the passed-in input buffer, but we also need to handle the case where the user passes in 1+zillion bytes
229 // following the deflate data and our non-conservative read-ahead path won't kick in here on this code. This is much trickier.
230 #define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
231  int temp; mz_uint code_len, c; \
232  if (num_bits < 15) { \
233  if ((pIn_buf_end - pIn_buf_cur) < 2) { \
234  TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
235  } else { \
236  bit_buf |= (((tinfl_bit_buf_t)pIn_buf_cur[0]) << num_bits) | (((tinfl_bit_buf_t)pIn_buf_cur[1]) << (num_bits + 8)); pIn_buf_cur += 2; num_bits += 16; \
237  } \
238  } \
239  if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
240  code_len = temp >> 9, temp &= 511; \
241  else { \
242  code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
243  } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
244 
245 tinfl_status tinfl_decompress(tinfl_decompressor *r, const mz_uint8 *pIn_buf_next, size_t *pIn_buf_size, mz_uint8 *pOut_buf_start, mz_uint8 *pOut_buf_next, size_t *pOut_buf_size, const mz_uint32 decomp_flags)
246 {
247  static const int s_length_base[31] = { 3,4,5,6,7,8,9,10,11,13, 15,17,19,23,27,31,35,43,51,59, 67,83,99,115,131,163,195,227,258,0,0 };
248  static const int s_length_extra[31] = { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
249  static const int s_dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
250  static const int s_dist_extra[32] = { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
251  static const mz_uint8 s_length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
252  static const int s_min_table_sizes[3] = { 257, 1, 4 };
253 
254  tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
255  const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
256  mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
257  size_t out_buf_size_mask = (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF) ? (size_t)-1 : ((pOut_buf_next - pOut_buf_start) + *pOut_buf_size) - 1, dist_from_out_buf_start;
258 
259  // Ensure the output buffer's size is a power of 2, unless the output buffer is large enough to hold the entire output file (in which case it doesn't matter).
260  if (((out_buf_size_mask + 1) & out_buf_size_mask) || (pOut_buf_next < pOut_buf_start)) { *pIn_buf_size = *pOut_buf_size = 0; return TINFL_STATUS_BAD_PARAM; }
261 
262  num_bits = r->m_num_bits; bit_buf = r->m_bit_buf; dist = r->m_dist; counter = r->m_counter; num_extra = r->m_num_extra; dist_from_out_buf_start = r->m_dist_from_out_buf_start;
264 
265  bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
266  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
267  {
269  counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
270  if (!(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)) counter |= (((1U << (8U + (r->m_zhdr0 >> 4))) > 32768U) || ((out_buf_size_mask + 1) < (size_t)(1U << (8U + (r->m_zhdr0 >> 4)))));
271  if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
272  }
273 
274  do
275  {
276  TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
277  if (r->m_type == 0)
278  {
279  TINFL_SKIP_BITS(5, num_bits & 7);
280  for (counter = 0; counter < 4; ++counter) { if (num_bits) TINFL_GET_BITS(6, r->m_raw_header[counter], 8); else TINFL_GET_BYTE(7, r->m_raw_header[counter]); }
281  if ((counter = (r->m_raw_header[0] | (r->m_raw_header[1] << 8))) != (mz_uint)(0xFFFF ^ (r->m_raw_header[2] | (r->m_raw_header[3] << 8)))) { TINFL_CR_RETURN_FOREVER(39, TINFL_STATUS_FAILED); }
282  while ((counter) && (num_bits))
283  {
284  TINFL_GET_BITS(51, dist, 8);
285  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
286  *pOut_buf_cur++ = (mz_uint8)dist;
287  counter--;
288  }
289  while (counter)
290  {
291  size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
292  while (pIn_buf_cur >= pIn_buf_end)
293  {
295  }
296  n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
297  TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
298  }
299  }
300  else if (r->m_type == 3)
301  {
303  }
304  else
305  {
306  if (r->m_type == 1)
307  {
308  mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
309  r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
310  for (i = 0; i <= 143; ++i) *p++ = 8; for (; i <= 255; ++i) *p++ = 9; for (; i <= 279; ++i) *p++ = 7; for (; i <= 287; ++i) *p++ = 8;
311  }
312  else
313  {
314  for (counter = 0; counter < 3; counter++) { TINFL_GET_BITS(11, r->m_table_sizes[counter], "\05\05\04"[counter]); r->m_table_sizes[counter] += s_min_table_sizes[counter]; }
315  MZ_CLEAR_OBJ(r->m_tables[2].m_code_size); for (counter = 0; counter < r->m_table_sizes[2]; counter++) { mz_uint s; TINFL_GET_BITS(14, s, 3); r->m_tables[2].m_code_size[s_length_dezigzag[counter]] = (mz_uint8)s; }
316  r->m_table_sizes[2] = 19;
317  }
318  for (; (int)r->m_type >= 0; r->m_type--)
319  {
320  int tree_next, tree_cur; tinfl_huff_table *pTable;
321  mz_uint i, j, used_syms, total, sym_index, next_code[17], total_syms[16]; pTable = &r->m_tables[r->m_type]; MZ_CLEAR_OBJ(total_syms); MZ_CLEAR_OBJ(pTable->m_look_up); MZ_CLEAR_OBJ(pTable->m_tree);
322  for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
323  used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
324  for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
325  if ((65536 != total) && (used_syms > 1))
326  {
328  }
329  for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
330  {
331  mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
332  cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
333  if (code_size <= TINFL_FAST_LOOKUP_BITS) { mz_int16 k = (mz_int16)((code_size << 9) | sym_index); while (rev_code < TINFL_FAST_LOOKUP_SIZE) { pTable->m_look_up[rev_code] = k; rev_code += (1 << code_size); } continue; }
334  if (0 == (tree_cur = pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)])) { pTable->m_look_up[rev_code & (TINFL_FAST_LOOKUP_SIZE - 1)] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
335  rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
336  for (j = code_size; j >(TINFL_FAST_LOOKUP_BITS + 1); j--)
337  {
338  tree_cur -= ((rev_code >>= 1) & 1);
339  if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; }
340  else tree_cur = pTable->m_tree[-tree_cur - 1];
341  }
342  tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
343  }
344  if (r->m_type == 2)
345  {
346  for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )
347  {
348  mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
349  if ((dist == 16) && (!counter))
350  {
352  }
353  num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
354  TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
355  }
356  if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)
357  {
359  }
361  }
362  }
363  for (; ; )
364  {
365  mz_uint8 *pSrc;
366  for (; ; )
367  {
368  if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
369  {
370  TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
371  if (counter >= 256)
372  break;
373  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
374  *pOut_buf_cur++ = (mz_uint8)counter;
375  }
376  else
377  {
378  int sym2; mz_uint code_len;
379 #if TINFL_USE_64BIT_BITBUF
380  if (num_bits < 30) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE32(pIn_buf_cur)) << num_bits); pIn_buf_cur += 4; num_bits += 32; }
381 #else
382  if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
383 #endif
384  if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
385  code_len = sym2 >> 9;
386  else
387  {
388  code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
389  }
390  counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
391  if (counter & 256)
392  break;
393 
394 #if !TINFL_USE_64BIT_BITBUF
395  if (num_bits < 15) { bit_buf |= (((tinfl_bit_buf_t)MZ_READ_LE16(pIn_buf_cur)) << num_bits); pIn_buf_cur += 2; num_bits += 16; }
396 #endif
397  if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
398  code_len = sym2 >> 9;
399  else
400  {
401  code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
402  }
403  bit_buf >>= code_len; num_bits -= code_len;
404 
405  pOut_buf_cur[0] = (mz_uint8)counter;
406  if (sym2 & 256)
407  {
408  pOut_buf_cur++;
409  counter = sym2;
410  break;
411  }
412  pOut_buf_cur[1] = (mz_uint8)sym2;
413  pOut_buf_cur += 2;
414  }
415  }
416  if ((counter &= 511) == 256) break;
417 
418  num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
419  if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
420 
421  TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
422  num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
423  if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
424 
425  dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
426  if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
427  {
429  }
430 
431  pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
432 
433  if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
434  {
435  while (counter--)
436  {
437  while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
438  *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
439  }
440  continue;
441  }
442 #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
443  else if ((counter >= 9) && (counter <= dist))
444  {
445  const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
446  do
447  {
448  ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
449  ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
450  pOut_buf_cur += 8;
451  } while ((pSrc += 8) < pSrc_end);
452  if ((counter &= 7) < 3)
453  {
454  if (counter)
455  {
456  pOut_buf_cur[0] = pSrc[0];
457  if (counter > 1)
458  pOut_buf_cur[1] = pSrc[1];
459  pOut_buf_cur += counter;
460  }
461  continue;
462  }
463  }
464 #endif
465  do
466  {
467  pOut_buf_cur[0] = pSrc[0];
468  pOut_buf_cur[1] = pSrc[1];
469  pOut_buf_cur[2] = pSrc[2];
470  pOut_buf_cur += 3; pSrc += 3;
471  } while ((int)(counter -= 3) > 2);
472  if ((int)counter > 0)
473  {
474  pOut_buf_cur[0] = pSrc[0];
475  if ((int)counter > 1)
476  pOut_buf_cur[1] = pSrc[1];
477  pOut_buf_cur += counter;
478  }
479  }
480  }
481  } while (!(r->m_final & 1));
482 
483  // Ensure byte alignment and put back any bytes from the bitbuf if we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data.
484  // I'm being super conservative here. A number of simplifications can be made to the byte alignment part, and the Adler32 check shouldn't ever need to worry about reading from the bitbuf now.
485  TINFL_SKIP_BITS(32, num_bits & 7);
486  while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } bit_buf &= (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL);
487  //MZ_ASSERT(!num_bits); // if this assert fires then we've read beyond the end of non-deflate/zlib streams with following data (such as gzip streams).
488 
489  if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
490  {
491  for (counter = 0; counter < 4; ++counter) { mz_uint s; if (num_bits) TINFL_GET_BITS(41, s, 8); else TINFL_GET_BYTE(42, s); r->m_z_adler32 = (r->m_z_adler32 << 8) | s; }
492  }
494 
496 
497  common_exit :
498  // As long as we aren't telling the caller that we NEED more input to make forward progress:
499  // Put back any bytes from the bitbuf in case we've looked ahead too far on gzip, or other Deflate streams followed by arbitrary data.
500  // We need to be very careful here to NOT push back any bytes we definitely know we need to make forward progress, though, or we'll lock the caller up into an inf loop.
501  if ((status != TINFL_STATUS_NEEDS_MORE_INPUT) && (status != TINFL_STATUS_FAILED_CANNOT_MAKE_PROGRESS)) { while ((pIn_buf_cur > pIn_buf_next) && (num_bits >= 8)) { --pIn_buf_cur; num_bits -= 8; } }
502  r->m_num_bits = num_bits; r->m_bit_buf = bit_buf & (tinfl_bit_buf_t)((1ULL << num_bits) - 1ULL); r->m_dist = dist; r->m_counter = counter; r->m_num_extra = num_extra; r->m_dist_from_out_buf_start = dist_from_out_buf_start;
503  *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
504  if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
505  {
506  const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;
507  mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;
508  while (buf_len)
509  {
510  for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
511  {
512  s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
513  s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
514  }
515  for (; i < block_len; ++i) s1 += *ptr++, s2 += s1;
516  s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
517  }
518  r->m_check_adler32 = (s2 << 16) + s1; if ((status == TINFL_STATUS_DONE) && (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER) && (r->m_check_adler32 != r->m_z_adler32)) status = TINFL_STATUS_ADLER32_MISMATCH;
519  }
520  return status;
521 }
522 
523 // Higher level helper functions.
524 void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
525 {
526  tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;
527  *pOut_len = 0;
528  tinfl_init(&decomp);
529  for (; ; )
530  {
531  size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
532  tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf + src_buf_ofs, &src_buf_size, (mz_uint8*)pBuf, pBuf ? (mz_uint8*)pBuf + *pOut_len : NULL, &dst_buf_size,
534  if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))
535  {
536  MZ_FREE(pBuf); *pOut_len = 0; return NULL;
537  }
538  src_buf_ofs += src_buf_size;
539  *pOut_len += dst_buf_size;
540  if (status == TINFL_STATUS_DONE) break;
541  new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
542  pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);
543  if (!pNew_buf)
544  {
545  MZ_FREE(pBuf); *pOut_len = 0; return NULL;
546  }
547  pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
548  }
549  return pBuf;
550 }
551 
552 size_t tinfl_decompress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
553 {
554  tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);
555  status = tinfl_decompress(&decomp, (const mz_uint8*)pSrc_buf, &src_buf_len, (mz_uint8*)pOut_buf, (mz_uint8*)pOut_buf, &out_buf_len, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
556  return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;
557 }
558 
559 int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size, tinfl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
560 {
561  int result = 0;
562  tinfl_decompressor decomp;
563  mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;
564  if (!pDict)
565  return TINFL_STATUS_FAILED;
566  tinfl_init(&decomp);
567  for (; ; )
568  {
569  size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
570  tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
572  in_buf_ofs += in_buf_size;
573  if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
574  break;
575  if (status != TINFL_STATUS_HAS_MORE_OUTPUT)
576  {
577  result = (status == TINFL_STATUS_DONE);
578  break;
579  }
580  dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
581  }
582  MZ_FREE(pDict);
583  *pIn_buf_size = in_buf_ofs;
584  return result;
585 }
586 
587 #endif // #ifndef TINFL_HEADER_FILE_ONLY
588 
589 /*
590 This is free and unencumbered software released into the public domain.
591 
592 Anyone is free to copy, modify, publish, use, compile, sell, or
593 distribute this software, either in source code form or as a compiled
594 binary, for any purpose, commercial or non-commercial, and by any
595 means.
596 
597 In jurisdictions that recognize copyright laws, the author or authors
598 of this software dedicate any and all copyright interest in the
599 software to the public domain. We make this dedication for the benefit
600 of the public at large and to the detriment of our heirs and
601 successors. We intend this dedication to be an overt act of
602 relinquishment in perpetuity of all present and future rights to this
603 software under copyright law.
604 
605 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
606 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
607 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
608 IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
609 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
610 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
611 OTHER DEALINGS IN THE SOFTWARE.
612 
613 For more information, please refer to <http://unlicense.org/>
614 */