tinfl.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. /* tinfl.c v1.11 - public domain inflate with zlib header parsing/adler32 checking (inflate-only subset of miniz.c)
  2. See "unlicense" statement at the end of this file.
  3. Rich Geldreich <richgel99@gmail.com>, last updated May 20, 2011
  4. Implements RFC 1950: http://www.ietf.org/rfc/rfc1950.txt and RFC 1951: http://www.ietf.org/rfc/rfc1951.txt
  5. The entire decompressor coroutine is implemented in tinfl_decompress(). The other functions are optional high-level helpers.
  6. */
  7. #ifndef TINFL_HEADER_INCLUDED
  8. #define TINFL_HEADER_INCLUDED
  9. #include <stdlib.h>
  10. typedef unsigned char mz_uint8;
  11. typedef signed short mz_int16;
  12. typedef unsigned short mz_uint16;
  13. typedef unsigned int mz_uint32;
  14. typedef unsigned int mz_uint;
  15. typedef unsigned long long mz_uint64;
  16. #if defined(_M_IX86) || defined(_M_X64)
  17. // 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).
  18. #define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
  19. // Set MINIZ_LITTLE_ENDIAN to 1 if the processor is little endian.
  20. #define MINIZ_LITTLE_ENDIAN 1
  21. #endif
  22. #if defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__)
  23. // Set MINIZ_HAS_64BIT_REGISTERS to 1 if the processor has 64-bit general purpose registers (enables 64-bit bitbuffer in inflator)
  24. #define MINIZ_HAS_64BIT_REGISTERS 1
  25. #endif
  26. // Works around MSVC's spammy "warning C4127: conditional expression is constant" message.
  27. #ifdef _MSC_VER
  28. #define MZ_MACRO_END while (0, 0)
  29. #else
  30. #define MZ_MACRO_END while (0)
  31. #endif
  32. // Decompression flags used by tinfl_decompress().
  33. // 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.
  34. // 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.
  35. // 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).
  36. // TINFL_FLAG_COMPUTE_ADLER32: Force adler-32 checksum computation of the decompressed bytes.
  37. enum
  38. {
  39. TINFL_FLAG_PARSE_ZLIB_HEADER = 1,
  40. TINFL_FLAG_HAS_MORE_INPUT = 2,
  41. TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF = 4,
  42. TINFL_FLAG_COMPUTE_ADLER32 = 8
  43. };
  44. // High level decompression functions:
  45. // tinfl_decompress_mem_to_heap() decompresses a block in memory to a heap block allocated via malloc().
  46. // On entry:
  47. // pSrc_buf, src_buf_len: Pointer and size of the Deflate or zlib source data to decompress.
  48. // On return:
  49. // Function returns a pointer to the decompressed data, or NULL on failure.
  50. // *pOut_len will be set to the decompressed data's size, which could be larger than src_buf_len on uncompressible data.
  51. // The caller must free() the returned block when it's no longer needed.
  52. void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags);
  53. // tinfl_decompress_mem_to_mem() decompresses a block in memory to another block in memory.
  54. // Returns TINFL_DECOMPRESS_MEM_TO_MEM_FAILED on failure, or the number of bytes written on success.
  55. #define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
  56. 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);
  57. // 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.
  58. // Returns 1 on success or 0 on failure.
  59. typedef int (*tinfl_put_buf_func_ptr)(const void* pBuf, int len, void *pUser);
  60. 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);
  61. struct tinfl_decompressor_tag; typedef struct tinfl_decompressor_tag tinfl_decompressor;
  62. // Max size of LZ dictionary.
  63. #define TINFL_LZ_DICT_SIZE 32768
  64. // Return status.
  65. typedef enum
  66. {
  67. TINFL_STATUS_BAD_PARAM = -3,
  68. TINFL_STATUS_ADLER32_MISMATCH = -2,
  69. TINFL_STATUS_FAILED = -1,
  70. TINFL_STATUS_DONE = 0,
  71. TINFL_STATUS_NEEDS_MORE_INPUT = 1,
  72. TINFL_STATUS_HAS_MORE_OUTPUT = 2
  73. } tinfl_status;
  74. // Initializes the decompressor to its initial state.
  75. #define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
  76. #define tinfl_get_adler32(r) (r)->m_check_adler32
  77. // 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.
  78. // 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.
  79. 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);
  80. // Internal/private bits follow.
  81. enum
  82. {
  83. TINFL_MAX_HUFF_TABLES = 3, TINFL_MAX_HUFF_SYMBOLS_0 = 288, TINFL_MAX_HUFF_SYMBOLS_1 = 32, TINFL_MAX_HUFF_SYMBOLS_2 = 19,
  84. TINFL_FAST_LOOKUP_BITS = 10, TINFL_FAST_LOOKUP_SIZE = 1 << TINFL_FAST_LOOKUP_BITS
  85. };
  86. typedef struct
  87. {
  88. mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0];
  89. mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE], m_tree[TINFL_MAX_HUFF_SYMBOLS_0 * 2];
  90. } tinfl_huff_table;
  91. #if MINIZ_HAS_64BIT_REGISTERS
  92. #define TINFL_USE_64BIT_BITBUF 1
  93. #endif
  94. #if TINFL_USE_64BIT_BITBUF
  95. typedef mz_uint64 tinfl_bit_buf_t;
  96. #define TINFL_BITBUF_SIZE (64)
  97. #else
  98. typedef mz_uint32 tinfl_bit_buf_t;
  99. #define TINFL_BITBUF_SIZE (32)
  100. #endif
  101. struct tinfl_decompressor_tag
  102. {
  103. mz_uint32 m_state, m_num_bits, m_zhdr0, m_zhdr1, m_z_adler32, m_final, m_type, m_check_adler32, m_dist, m_counter, m_num_extra, m_table_sizes[TINFL_MAX_HUFF_TABLES];
  104. tinfl_bit_buf_t m_bit_buf;
  105. size_t m_dist_from_out_buf_start;
  106. tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES];
  107. mz_uint8 m_raw_header[4], m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0 + TINFL_MAX_HUFF_SYMBOLS_1 + 137];
  108. };
  109. #endif // #ifdef TINFL_HEADER_INCLUDED
  110. // ------------------- End of Header: Implementation follows. (If you only want the header, define MINIZ_HEADER_FILE_ONLY.)
  111. #ifndef TINFL_HEADER_FILE_ONLY
  112. #include <string.h>
  113. // MZ_MALLOC, etc. are only used by the optional high-level helper functions.
  114. #ifdef MINIZ_NO_MALLOC
  115. #define MZ_MALLOC(x) NULL
  116. #define MZ_FREE(x) x, ((void)0)
  117. #define MZ_REALLOC(p, x) NULL
  118. #else
  119. #define MZ_MALLOC(x) malloc(x)
  120. #define MZ_FREE(x) free(x)
  121. #define MZ_REALLOC(p, x) realloc(p, x)
  122. #endif
  123. #define MZ_MAX(a,b) (((a)>(b))?(a):(b))
  124. #define MZ_MIN(a,b) (((a)<(b))?(a):(b))
  125. #define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
  126. #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
  127. #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
  128. #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
  129. #else
  130. #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
  131. #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))
  132. #endif
  133. #define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
  134. #define TINFL_MEMSET(p, c, l) memset(p, c, l)
  135. #define TINFL_CR_BEGIN switch(r->m_state) { case 0:
  136. #define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
  137. #define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
  138. #define TINFL_CR_FINISH }
  139. // TODO: If the caller has indicated that there's no more input, and we attempt to read beyond the input buf, then something is wrong with the input because the inflator never
  140. // reads ahead more than it needs to. Currently TINFL_GET_BYTE() pads the end of the stream with 0's in this scenario.
  141. #define TINFL_GET_BYTE(state_index, c) do { \
  142. if (pIn_buf_cur >= pIn_buf_end) { \
  143. for ( ; ; ) { \
  144. if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
  145. TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
  146. if (pIn_buf_cur < pIn_buf_end) { \
  147. c = *pIn_buf_cur++; \
  148. break; \
  149. } \
  150. } else { \
  151. c = 0; \
  152. break; \
  153. } \
  154. } \
  155. } else c = *pIn_buf_cur++; } MZ_MACRO_END
  156. #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))
  157. #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
  158. #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
  159. // TINFL_HUFF_BITBUF_FILL() is only used rarely, when the number of bytes remaining in the input buffer falls below 2.
  160. // 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
  161. // 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
  162. // bit buffer contains >=15 bits (deflate's max. Huffman code size).
  163. #define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
  164. do { \
  165. temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
  166. if (temp >= 0) { \
  167. code_len = temp >> 9; \
  168. if ((code_len) && (num_bits >= code_len)) \
  169. break; \
  170. } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
  171. code_len = TINFL_FAST_LOOKUP_BITS; \
  172. do { \
  173. temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
  174. } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
  175. } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
  176. } while (num_bits < 15);
  177. // 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
  178. // 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
  179. // 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.
  180. // The slow path is only executed at the very end of the input buffer.
  181. #define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
  182. int temp; mz_uint code_len, c; \
  183. if (num_bits < 15) { \
  184. if ((pIn_buf_end - pIn_buf_cur) < 2) { \
  185. TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
  186. } else { \
  187. 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; \
  188. } \
  189. } \
  190. if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
  191. code_len = temp >> 9, temp &= 511; \
  192. else { \
  193. code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
  194. } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
  195. 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)
  196. {
  197. 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 };
  198. 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 };
  199. 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};
  200. 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};
  201. 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 };
  202. static const int s_min_table_sizes[3] = { 257, 1, 4 };
  203. tinfl_status status = TINFL_STATUS_FAILED; mz_uint32 num_bits, dist, counter, num_extra; tinfl_bit_buf_t bit_buf;
  204. const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
  205. mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
  206. 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;
  207. // 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).
  208. 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; }
  209. 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;
  210. TINFL_CR_BEGIN
  211. bit_buf = num_bits = dist = counter = num_extra = r->m_zhdr0 = r->m_zhdr1 = 0; r->m_z_adler32 = r->m_check_adler32 = 1;
  212. if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
  213. {
  214. TINFL_GET_BYTE(1, r->m_zhdr0); TINFL_GET_BYTE(2, r->m_zhdr1);
  215. counter = (((r->m_zhdr0 * 256 + r->m_zhdr1) % 31 != 0) || (r->m_zhdr1 & 32) || ((r->m_zhdr0 & 15) != 8));
  216. 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)))));
  217. if (counter) { TINFL_CR_RETURN_FOREVER(36, TINFL_STATUS_FAILED); }
  218. }
  219. do
  220. {
  221. TINFL_GET_BITS(3, r->m_final, 3); r->m_type = r->m_final >> 1;
  222. if (r->m_type == 0)
  223. {
  224. TINFL_SKIP_BITS(5, num_bits & 7);
  225. 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]); }
  226. 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); }
  227. while ((counter) && (num_bits))
  228. {
  229. TINFL_GET_BITS(51, dist, 8);
  230. while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(52, TINFL_STATUS_HAS_MORE_OUTPUT); }
  231. *pOut_buf_cur++ = (mz_uint8)dist;
  232. counter--;
  233. }
  234. while (counter)
  235. {
  236. size_t n; while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(9, TINFL_STATUS_HAS_MORE_OUTPUT); }
  237. while (pIn_buf_cur >= pIn_buf_end)
  238. {
  239. if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT)
  240. {
  241. TINFL_CR_RETURN(38, TINFL_STATUS_NEEDS_MORE_INPUT);
  242. }
  243. else
  244. {
  245. TINFL_CR_RETURN_FOREVER(40, TINFL_STATUS_FAILED);
  246. }
  247. }
  248. n = MZ_MIN(MZ_MIN((size_t)(pOut_buf_end - pOut_buf_cur), (size_t)(pIn_buf_end - pIn_buf_cur)), counter);
  249. TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (mz_uint)n;
  250. }
  251. }
  252. else if (r->m_type == 3)
  253. {
  254. TINFL_CR_RETURN_FOREVER(10, TINFL_STATUS_FAILED);
  255. }
  256. else
  257. {
  258. if (r->m_type == 1)
  259. {
  260. mz_uint8 *p = r->m_tables[0].m_code_size; mz_uint i;
  261. r->m_table_sizes[0] = 288; r->m_table_sizes[1] = 32; TINFL_MEMSET(r->m_tables[1].m_code_size, 5, 32);
  262. 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;
  263. }
  264. else
  265. {
  266. 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]; }
  267. 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; }
  268. r->m_table_sizes[2] = 19;
  269. }
  270. for ( ; (int)r->m_type >= 0; r->m_type--)
  271. {
  272. int tree_next, tree_cur; tinfl_huff_table *pTable;
  273. 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);
  274. for (i = 0; i < r->m_table_sizes[r->m_type]; ++i) total_syms[pTable->m_code_size[i]]++;
  275. used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
  276. for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
  277. if ((65536 != total) && (used_syms > 1))
  278. {
  279. TINFL_CR_RETURN_FOREVER(35, TINFL_STATUS_FAILED);
  280. }
  281. for (tree_next = -1, sym_index = 0; sym_index < r->m_table_sizes[r->m_type]; ++sym_index)
  282. {
  283. mz_uint rev_code = 0, l, cur_code, code_size = pTable->m_code_size[sym_index]; if (!code_size) continue;
  284. cur_code = next_code[code_size]++; for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
  285. 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; }
  286. 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; }
  287. rev_code >>= (TINFL_FAST_LOOKUP_BITS - 1);
  288. for (j = code_size; j > (TINFL_FAST_LOOKUP_BITS + 1); j--)
  289. {
  290. tree_cur -= ((rev_code >>= 1) & 1);
  291. if (!pTable->m_tree[-tree_cur - 1]) { pTable->m_tree[-tree_cur - 1] = (mz_int16)tree_next; tree_cur = tree_next; tree_next -= 2; } else tree_cur = pTable->m_tree[-tree_cur - 1];
  292. }
  293. tree_cur -= ((rev_code >>= 1) & 1); pTable->m_tree[-tree_cur - 1] = (mz_int16)sym_index;
  294. }
  295. if (r->m_type == 2)
  296. {
  297. for (counter = 0; counter < (r->m_table_sizes[0] + r->m_table_sizes[1]); )
  298. {
  299. mz_uint s; TINFL_HUFF_DECODE(16, dist, &r->m_tables[2]); if (dist < 16) { r->m_len_codes[counter++] = (mz_uint8)dist; continue; }
  300. if ((dist == 16) && (!counter))
  301. {
  302. TINFL_CR_RETURN_FOREVER(17, TINFL_STATUS_FAILED);
  303. }
  304. num_extra = "\02\03\07"[dist - 16]; TINFL_GET_BITS(18, s, num_extra); s += "\03\03\013"[dist - 16];
  305. TINFL_MEMSET(r->m_len_codes + counter, (dist == 16) ? r->m_len_codes[counter - 1] : 0, s); counter += s;
  306. }
  307. if ((r->m_table_sizes[0] + r->m_table_sizes[1]) != counter)
  308. {
  309. TINFL_CR_RETURN_FOREVER(21, TINFL_STATUS_FAILED);
  310. }
  311. TINFL_MEMCPY(r->m_tables[0].m_code_size, r->m_len_codes, r->m_table_sizes[0]); TINFL_MEMCPY(r->m_tables[1].m_code_size, r->m_len_codes + r->m_table_sizes[0], r->m_table_sizes[1]);
  312. }
  313. }
  314. for ( ; ; )
  315. {
  316. mz_uint8 *pSrc;
  317. for ( ; ; )
  318. {
  319. if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
  320. {
  321. TINFL_HUFF_DECODE(23, counter, &r->m_tables[0]);
  322. if (counter >= 256)
  323. break;
  324. while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(24, TINFL_STATUS_HAS_MORE_OUTPUT); }
  325. *pOut_buf_cur++ = (mz_uint8)counter;
  326. }
  327. else
  328. {
  329. int sym2; mz_uint code_len;
  330. #if TINFL_USE_64BIT_BITBUF
  331. 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; }
  332. #else
  333. 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; }
  334. #endif
  335. if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
  336. code_len = sym2 >> 9;
  337. else
  338. {
  339. code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
  340. }
  341. counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
  342. if (counter & 256)
  343. break;
  344. #if !TINFL_USE_64BIT_BITBUF
  345. 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; }
  346. #endif
  347. if ((sym2 = r->m_tables[0].m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0)
  348. code_len = sym2 >> 9;
  349. else
  350. {
  351. code_len = TINFL_FAST_LOOKUP_BITS; do { sym2 = r->m_tables[0].m_tree[~sym2 + ((bit_buf >> code_len++) & 1)]; } while (sym2 < 0);
  352. }
  353. bit_buf >>= code_len; num_bits -= code_len;
  354. pOut_buf_cur[0] = (mz_uint8)counter;
  355. if (sym2 & 256)
  356. {
  357. pOut_buf_cur++;
  358. counter = sym2;
  359. break;
  360. }
  361. pOut_buf_cur[1] = (mz_uint8)sym2;
  362. pOut_buf_cur += 2;
  363. }
  364. }
  365. if ((counter &= 511) == 256) break;
  366. num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
  367. if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
  368. TINFL_HUFF_DECODE(26, dist, &r->m_tables[1]);
  369. num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
  370. if (num_extra) { mz_uint extra_bits; TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
  371. dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
  372. if ((dist > dist_from_out_buf_start) && (decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF))
  373. {
  374. TINFL_CR_RETURN_FOREVER(37, TINFL_STATUS_FAILED);
  375. }
  376. pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
  377. if ((MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
  378. {
  379. while (counter--)
  380. {
  381. while (pOut_buf_cur >= pOut_buf_end) { TINFL_CR_RETURN(53, TINFL_STATUS_HAS_MORE_OUTPUT); }
  382. *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
  383. }
  384. continue;
  385. }
  386. #if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
  387. else if ((counter >= 9) && (counter <= dist))
  388. {
  389. const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
  390. do
  391. {
  392. ((mz_uint32 *)pOut_buf_cur)[0] = ((const mz_uint32 *)pSrc)[0];
  393. ((mz_uint32 *)pOut_buf_cur)[1] = ((const mz_uint32 *)pSrc)[1];
  394. pOut_buf_cur += 8;
  395. } while ((pSrc += 8) < pSrc_end);
  396. if ((counter &= 7) < 3)
  397. {
  398. if (counter)
  399. {
  400. pOut_buf_cur[0] = pSrc[0];
  401. if (counter > 1)
  402. pOut_buf_cur[1] = pSrc[1];
  403. pOut_buf_cur += counter;
  404. }
  405. continue;
  406. }
  407. }
  408. #endif
  409. do
  410. {
  411. pOut_buf_cur[0] = pSrc[0];
  412. pOut_buf_cur[1] = pSrc[1];
  413. pOut_buf_cur[2] = pSrc[2];
  414. pOut_buf_cur += 3; pSrc += 3;
  415. } while ((int)(counter -= 3) > 2);
  416. if ((int)counter > 0)
  417. {
  418. pOut_buf_cur[0] = pSrc[0];
  419. if ((int)counter > 1)
  420. pOut_buf_cur[1] = pSrc[1];
  421. pOut_buf_cur += counter;
  422. }
  423. }
  424. }
  425. } while (!(r->m_final & 1));
  426. if (decomp_flags & TINFL_FLAG_PARSE_ZLIB_HEADER)
  427. {
  428. TINFL_SKIP_BITS(32, num_bits & 7); 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; }
  429. }
  430. TINFL_CR_RETURN_FOREVER(34, TINFL_STATUS_DONE);
  431. TINFL_CR_FINISH
  432. common_exit:
  433. r->m_num_bits = num_bits; r->m_bit_buf = bit_buf; 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;
  434. *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
  435. if ((decomp_flags & (TINFL_FLAG_PARSE_ZLIB_HEADER | TINFL_FLAG_COMPUTE_ADLER32)) && (status >= 0))
  436. {
  437. const mz_uint8 *ptr = pOut_buf_next; size_t buf_len = *pOut_buf_size;
  438. mz_uint32 i, s1 = r->m_check_adler32 & 0xffff, s2 = r->m_check_adler32 >> 16; size_t block_len = buf_len % 5552;
  439. while (buf_len)
  440. {
  441. for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
  442. {
  443. s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
  444. s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
  445. }
  446. for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
  447. s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
  448. }
  449. 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;
  450. }
  451. return status;
  452. }
  453. // Higher level helper functions.
  454. void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
  455. {
  456. tinfl_decompressor decomp; void *pBuf = NULL, *pNew_buf; size_t src_buf_ofs = 0, out_buf_capacity = 0;
  457. *pOut_len = 0;
  458. tinfl_init(&decomp);
  459. for ( ; ; )
  460. {
  461. size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
  462. 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,
  463. (flags & ~TINFL_FLAG_HAS_MORE_INPUT) | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
  464. if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT))
  465. {
  466. MZ_FREE(pBuf); *pOut_len = 0; return NULL;
  467. }
  468. src_buf_ofs += src_buf_size;
  469. *pOut_len += dst_buf_size;
  470. if (status == TINFL_STATUS_DONE) break;
  471. new_out_buf_capacity = out_buf_capacity * 2; if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
  472. pNew_buf = MZ_REALLOC(pBuf, new_out_buf_capacity);
  473. if (!pNew_buf)
  474. {
  475. MZ_FREE(pBuf); *pOut_len = 0; return NULL;
  476. }
  477. pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
  478. }
  479. return pBuf;
  480. }
  481. 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)
  482. {
  483. tinfl_decompressor decomp; tinfl_status status; tinfl_init(&decomp);
  484. 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);
  485. return (status != TINFL_STATUS_DONE) ? TINFL_DECOMPRESS_MEM_TO_MEM_FAILED : out_buf_len;
  486. }
  487. 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)
  488. {
  489. int result = 0;
  490. tinfl_decompressor decomp;
  491. mz_uint8 *pDict = (mz_uint8*)MZ_MALLOC(TINFL_LZ_DICT_SIZE); size_t in_buf_ofs = 0, dict_ofs = 0;
  492. if (!pDict)
  493. return TINFL_STATUS_FAILED;
  494. tinfl_init(&decomp);
  495. for ( ; ; )
  496. {
  497. size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size = TINFL_LZ_DICT_SIZE - dict_ofs;
  498. tinfl_status status = tinfl_decompress(&decomp, (const mz_uint8*)pIn_buf + in_buf_ofs, &in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
  499. (flags & ~(TINFL_FLAG_HAS_MORE_INPUT | TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
  500. in_buf_ofs += in_buf_size;
  501. if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
  502. break;
  503. if (status != TINFL_STATUS_HAS_MORE_OUTPUT)
  504. {
  505. result = (status == TINFL_STATUS_DONE);
  506. break;
  507. }
  508. dict_ofs = (dict_ofs + dst_buf_size) & (TINFL_LZ_DICT_SIZE - 1);
  509. }
  510. MZ_FREE(pDict);
  511. *pIn_buf_size = in_buf_ofs;
  512. return result;
  513. }
  514. #endif // #ifndef TINFL_HEADER_FILE_ONLY
  515. /*
  516. This is free and unencumbered software released into the public domain.
  517. Anyone is free to copy, modify, publish, use, compile, sell, or
  518. distribute this software, either in source code form or as a compiled
  519. binary, for any purpose, commercial or non-commercial, and by any
  520. means.
  521. In jurisdictions that recognize copyright laws, the author or authors
  522. of this software dedicate any and all copyright interest in the
  523. software to the public domain. We make this dedication for the benefit
  524. of the public at large and to the detriment of our heirs and
  525. successors. We intend this dedication to be an overt act of
  526. relinquishment in perpetuity of all present and future rights to this
  527. software under copyright law.
  528. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  529. EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  530. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  531. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  532. OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  533. ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  534. OTHER DEALINGS IN THE SOFTWARE.
  535. For more information, please refer to <http://unlicense.org/>
  536. */