131#ifndef MINIZ_HEADER_INCLUDED
132#define MINIZ_HEADER_INCLUDED
140#if !defined(MINIZ_NO_TIME) && !defined(MINIZ_NO_ARCHIVE_APIS)
172#if defined(_M_IX86) || defined(_M_X64) || defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i486) || defined(i386) || defined(__ia64__) || defined(__x86_64__)
174#define MINIZ_X86_OR_X64_CPU 1
177#if (__BYTE_ORDER__==__ORDER_LITTLE_ENDIAN__) || MINIZ_X86_OR_X64_CPU
179#define MINIZ_LITTLE_ENDIAN 1
182#if MINIZ_X86_OR_X64_CPU
184#define MINIZ_USE_UNALIGNED_LOADS_AND_STORES 1
187#if defined(_M_X64) || defined(_WIN64) || defined(__MINGW64__) || defined(_LP64) || defined(__LP64__) || defined(__ia64__) || defined(__x86_64__)
189#define MINIZ_HAS_64BIT_REGISTERS 1
194std::wstring GetUTF8WString(
const char* inString)
196 int size_needed = MultiByteToWideChar(CP_UTF8, 0, inString, (
int)strlen(inString)+1, NULL, 0);
197 std::wstring wstrTo( size_needed, 0 );
198 MultiByteToWideChar(CP_UTF8, 0, inString, (
int)strlen(inString)+1, &wstrTo[0], size_needed);
214typedef void *(*mz_alloc_func)(
void *opaque,
size_t items,
size_t size);
216typedef void *(*mz_realloc_func)(
void *opaque,
void *address,
size_t items,
size_t size);
218#define MZ_ADLER32_INIT (1)
222#define MZ_CRC32_INIT (0)
232#ifndef MINIZ_NO_ZLIB_APIS
234#define MZ_VERSION "9.1.14"
235#define MZ_VERNUM 0x91E0
236#define MZ_VER_MAJOR 9
237#define MZ_VER_MINOR 1
238#define MZ_VER_REVISION 14
239#define MZ_VER_SUBREVISION 0
251#define MZ_DEFAULT_WINDOW_BITS 15
253struct mz_internal_state;
370#ifndef MINIZ_NO_ZLIB_COMPATIBLE_NAMES
383 #define Z_NO_FLUSH MZ_NO_FLUSH
384 #define Z_PARTIAL_FLUSH MZ_PARTIAL_FLUSH
385 #define Z_SYNC_FLUSH MZ_SYNC_FLUSH
386 #define Z_FULL_FLUSH MZ_FULL_FLUSH
387 #define Z_FINISH MZ_FINISH
388 #define Z_BLOCK MZ_BLOCK
390 #define Z_STREAM_END MZ_STREAM_END
391 #define Z_NEED_DICT MZ_NEED_DICT
392 #define Z_ERRNO MZ_ERRNO
393 #define Z_STREAM_ERROR MZ_STREAM_ERROR
394 #define Z_DATA_ERROR MZ_DATA_ERROR
395 #define Z_MEM_ERROR MZ_MEM_ERROR
396 #define Z_BUF_ERROR MZ_BUF_ERROR
397 #define Z_VERSION_ERROR MZ_VERSION_ERROR
398 #define Z_PARAM_ERROR MZ_PARAM_ERROR
399 #define Z_NO_COMPRESSION MZ_NO_COMPRESSION
400 #define Z_BEST_SPEED MZ_BEST_SPEED
401 #define Z_BEST_COMPRESSION MZ_BEST_COMPRESSION
402 #define Z_DEFAULT_COMPRESSION MZ_DEFAULT_COMPRESSION
403 #define Z_DEFAULT_STRATEGY MZ_DEFAULT_STRATEGY
404 #define Z_FILTERED MZ_FILTERED
405 #define Z_HUFFMAN_ONLY MZ_HUFFMAN_ONLY
407 #define Z_FIXED MZ_FIXED
408 #define Z_DEFLATED MZ_DEFLATED
409 #define Z_DEFAULT_WINDOW_BITS MZ_DEFAULT_WINDOW_BITS
410 #define alloc_func mz_alloc_func
411 #define free_func mz_free_func
412 #define internal_state mz_internal_state
413 #define z_stream mz_stream
414 #define deflateInit mz_deflateInit
415 #define deflateInit2 mz_deflateInit2
416 #define deflateReset mz_deflateReset
417 #define deflate mz_deflate
418 #define deflateEnd mz_deflateEnd
419 #define deflateBound mz_deflateBound
420 #define compress mz_compress
421 #define compress2 mz_compress2
422 #define compressBound mz_compressBound
423 #define inflateInit mz_inflateInit
424 #define inflateInit2 mz_inflateInit2
425 #define inflate mz_inflate
426 #define inflateEnd mz_inflateEnd
427 #define uncompress mz_uncompress
428 #define crc32 mz_crc32
429 #define adler32 mz_adler32
431 #define MAX_MEM_LEVEL 9
432 #define zError mz_error
433 #define ZLIB_VERSION MZ_VERSION
434 #define ZLIB_VERNUM MZ_VERNUM
435 #define ZLIB_VER_MAJOR MZ_VER_MAJOR
436 #define ZLIB_VER_MINOR MZ_VER_MINOR
437 #define ZLIB_VER_REVISION MZ_VER_REVISION
438 #define ZLIB_VER_SUBREVISION MZ_VER_SUBREVISION
439 #define zlibVersion mz_version
440 #define zlib_version mz_version()
461 #define MZ_MACRO_END while (0, 0)
463 #define MZ_MACRO_END while (0)
468#ifndef MINIZ_NO_ARCHIVE_APIS
550#ifndef MINIZ_NO_STDIO
589#ifndef MINIZ_NO_STDIO
601#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
607#ifndef MINIZ_NO_STDIO
625#ifndef MINIZ_NO_STDIO
686#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED ((size_t)(-1))
697#define TINFL_LZ_DICT_SIZE 32768
711#define tinfl_init(r) do { (r)->m_state = 0; } MZ_MACRO_END
712#define tinfl_get_adler32(r) (r)->m_check_adler32
731#if MINIZ_HAS_64BIT_REGISTERS
732 #define TINFL_USE_64BIT_BITBUF 1
735#if TINFL_USE_64BIT_BITBUF
737 #define TINFL_BITBUF_SIZE (64)
740 #define TINFL_BITBUF_SIZE (32)
745 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];
755#define TDEFL_LESS_MEMORY 0
797size_t tdefl_compress_mem_to_mem(
void *pOut_buf,
size_t out_buf_len,
const void *pSrc_buf,
size_t src_buf_len,
int flags);
844 mz_uint m_saved_match_dist, m_saved_match_len, m_saved_lit, m_output_flush_ofs, m_output_flush_remaining, m_finished,
m_block_index, m_wants_to_finish;
880#ifndef MINIZ_NO_ZLIB_APIS
896#ifndef MINIZ_HEADER_FILE_ONLY
905#define MZ_ASSERT(x) assert(x)
907#ifdef MINIZ_NO_MALLOC
908 #define MZ_MALLOC(x) NULL
909 #define MZ_FREE(x) (void)x, ((void)0)
910 #define MZ_REALLOC(p, x) NULL
912 #define MZ_MALLOC(x) malloc(x)
913 #define MZ_FREE(x) free(x)
914 #define MZ_REALLOC(p, x) realloc(p, x)
917#define MZ_MAX(a,b) (((a)>(b))?(a):(b))
918#define MZ_MIN(a,b) (((a)<(b))?(a):(b))
919#define MZ_CLEAR_OBJ(obj) memset(&(obj), 0, sizeof(obj))
921#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
922 #define MZ_READ_LE16(p) *((const mz_uint16 *)(p))
923 #define MZ_READ_LE32(p) *((const mz_uint32 *)(p))
925 #define MZ_READ_LE16(p) ((mz_uint32)(((const mz_uint8 *)(p))[0]) | ((mz_uint32)(((const mz_uint8 *)(p))[1]) << 8U))
926 #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))
930 #define MZ_FORCEINLINE __forceinline
931#elif defined(__GNUC__)
932 #define MZ_FORCEINLINE __attribute__((__always_inline__))
934 #define MZ_FORCEINLINE inline
948 for (i = 0; i + 7 < block_len; i += 8, ptr += 8) {
949 s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
950 s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
952 for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
953 s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
955 return (s2 << 16) + s1;
961 static const mz_uint32 s_crc32[16] = { 0, 0x1db71064, 0x3b6e20c8, 0x26d930ac, 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c,
962 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c };
965 crcu32 = ~crcu32;
while (buf_len--) {
mz_uint8 b = *ptr++; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b & 0xF)]; crcu32 = (crcu32 >> 4) ^ s_crc32[(crcu32 & 0xF) ^ (b >> 4)]; }
969#ifndef MINIZ_NO_ZLIB_APIS
971static void *def_alloc_func(
void *opaque,
size_t items,
size_t size) { (void)opaque, (
void)items, (void)size;
return MZ_MALLOC(items * size); }
972static void def_free_func(
void *opaque,
void *address) { (void)opaque, (
void)address;
MZ_FREE(address); }
973static void *def_realloc_func(
void *opaque,
void *address,
size_t items,
size_t size) { (void)opaque, (
void)address, (void)items, (
void)size;
return MZ_REALLOC(address, items * size); }
1000 if (!pStream->
zfree) pStream->
zfree = def_free_func;
1006 pStream->
state = (
struct mz_internal_state *)pComp;
1027 size_t in_bytes, out_bytes;
1028 mz_ulong orig_total_in, orig_total_out;
1029 int mz_status =
MZ_OK;
1052 if (defl_status < 0)
1066 if ((flush) || (pStream->
total_in != orig_total_in) || (pStream->
total_out != orig_total_out))
1080 pStream->
state = NULL;
1089 return MZ_MAX(128 + (source_len * 110) / 100, 128 + source_len + ((source_len / (31 * 1024)) + 1) * 5);
1096 memset(&stream, 0,
sizeof(stream));
1099 if ((source_len | *pDest_len) > 0xFFFFFFFFU)
return MZ_PARAM_ERROR;
1107 if (status !=
MZ_OK)
return status;
1146 pStream->
msg = NULL;
1150 if (!pStream->
zalloc) pStream->
zalloc = def_alloc_func;
1151 if (!pStream->
zfree) pStream->
zfree = def_free_func;
1156 pStream->
state = (
struct mz_internal_state *)pDecomp;
1178 size_t in_bytes, out_bytes, orig_avail_in;
1195 if ((flush ==
MZ_FINISH) && (first_call))
1272 pStream->
state = NULL;
1281 memset(&stream, 0,
sizeof(stream));
1284 if ((source_len | *pDest_len) > 0xFFFFFFFFU)
return MZ_PARAM_ERROR;
1292 if (status !=
MZ_OK)
1308 static struct {
int m_err;
const char *m_pDesc; } s_error_descs[] =
1310 {
MZ_OK,
"" }, {
MZ_STREAM_END,
"stream end" }, {
MZ_NEED_DICT,
"need dictionary" }, {
MZ_ERRNO,
"file error" }, {
MZ_STREAM_ERROR,
"stream error" },
1313 mz_uint i;
for (i = 0; i <
sizeof(s_error_descs) /
sizeof(s_error_descs[0]); ++i)
if (s_error_descs[i].m_err == err)
return s_error_descs[i].m_pDesc;
1321#define TINFL_MEMCPY(d, s, l) memcpy(d, s, l)
1322#define TINFL_MEMSET(p, c, l) memset(p, c, l)
1324#define TINFL_CR_BEGIN switch(r->m_state) { case 0:
1325#define TINFL_CR_RETURN(state_index, result) do { status = result; r->m_state = state_index; goto common_exit; case state_index:; } MZ_MACRO_END
1326#define TINFL_CR_RETURN_FOREVER(state_index, result) do { for ( ; ; ) { TINFL_CR_RETURN(state_index, result); } } MZ_MACRO_END
1327#define TINFL_CR_FINISH }
1331#define TINFL_GET_BYTE(state_index, c) do { \
1332 if (pIn_buf_cur >= pIn_buf_end) { \
1334 if (decomp_flags & TINFL_FLAG_HAS_MORE_INPUT) { \
1335 TINFL_CR_RETURN(state_index, TINFL_STATUS_NEEDS_MORE_INPUT); \
1336 if (pIn_buf_cur < pIn_buf_end) { \
1337 c = *pIn_buf_cur++; \
1345 } else c = *pIn_buf_cur++; } MZ_MACRO_END
1331#define TINFL_GET_BYTE(state_index, c) do { \ …
1347#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))
1348#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
1349#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
1355#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \
1357 temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]; \
1359 code_len = temp >> 9; \
1360 if ((code_len) && (num_bits >= code_len)) \
1362 } else if (num_bits > TINFL_FAST_LOOKUP_BITS) { \
1363 code_len = TINFL_FAST_LOOKUP_BITS; \
1365 temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; \
1366 } while ((temp < 0) && (num_bits >= (code_len + 1))); if (temp >= 0) break; \
1367 } TINFL_GET_BYTE(state_index, c); bit_buf |= (((tinfl_bit_buf_t)c) << num_bits); num_bits += 8; \
1368 } while (num_bits < 15);
1355#define TINFL_HUFF_BITBUF_FILL(state_index, pHuff) \ …
1374#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \
1375 int temp; mz_uint code_len, c; \
1376 if (num_bits < 15) { \
1377 if ((pIn_buf_end - pIn_buf_cur) < 2) { \
1378 TINFL_HUFF_BITBUF_FILL(state_index, pHuff); \
1380 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; \
1383 if ((temp = (pHuff)->m_look_up[bit_buf & (TINFL_FAST_LOOKUP_SIZE - 1)]) >= 0) \
1384 code_len = temp >> 9, temp &= 511; \
1386 code_len = TINFL_FAST_LOOKUP_BITS; do { temp = (pHuff)->m_tree[~temp + ((bit_buf >> code_len++) & 1)]; } while (temp < 0); \
1387 } sym = temp; bit_buf >>= code_len; num_bits -= code_len; } MZ_MACRO_END
1374#define TINFL_HUFF_DECODE(state_index, sym, pHuff) do { \ …
1391 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 };
1392 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 };
1393 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};
1394 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};
1395 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 };
1396 static const int s_min_table_sizes[3] = { 257, 1, 4 };
1399 const mz_uint8 *pIn_buf_cur = pIn_buf_next, *
const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
1400 mz_uint8 *pOut_buf_cur = pOut_buf_next, *
const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
1404 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; }
1426 while ((counter) && (num_bits))
1436 while (pIn_buf_cur >= pIn_buf_end)
1447 n =
MZ_MIN(
MZ_MIN((
size_t)(pOut_buf_end - pOut_buf_cur), (
size_t)(pIn_buf_end - pIn_buf_cur)), counter);
1448 TINFL_MEMCPY(pOut_buf_cur, pIn_buf_cur, n); pIn_buf_cur += n; pOut_buf_cur += n; counter -= (
mz_uint)n;
1461 for ( i = 0; i <= 143; ++i) *p++ = 8;
1462 for ( ; i <= 255; ++i) *p++ = 9;
1463 for ( ; i <= 279; ++i) *p++ = 7;
1464 for ( ; i <= 287; ++i) *p++ = 8;
1477 used_syms = 0, total = 0; next_code[0] = next_code[1] = 0;
1478 for (i = 1; i <= 15; ++i) { used_syms += total_syms[i]; next_code[i + 1] = (total = ((total + total_syms[i]) << 1)); }
1479 if ((65536 != total) && (used_syms > 1))
1485 mz_uint rev_code = 0, l, cur_code, code_size = pTable->
m_code_size[sym_index];
if (!code_size)
continue;
1486 cur_code = next_code[code_size]++;
for (l = code_size; l > 0; l--, cur_code >>= 1) rev_code = (rev_code << 1) | (cur_code & 1);
1492 tree_cur -= ((rev_code >>= 1) & 1);
1493 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];
1495 tree_cur -= ((rev_code >>= 1) & 1); pTable->
m_tree[-tree_cur - 1] = (
mz_int16)sym_index;
1502 if ((dist == 16) && (!counter))
1506 num_extra =
"\02\03\07"[dist - 16];
TINFL_GET_BITS(18, s, num_extra); s +=
"\03\03\013"[dist - 16];
1521 if (((pIn_buf_end - pIn_buf_cur) < 4) || ((pOut_buf_end - pOut_buf_cur) < 2))
1527 *pOut_buf_cur++ = (
mz_uint8)counter;
1532#if TINFL_USE_64BIT_BITBUF
1538 code_len = sym2 >> 9;
1543 counter = sym2; bit_buf >>= code_len; num_bits -= code_len;
1547#if !TINFL_USE_64BIT_BITBUF
1551 code_len = sym2 >> 9;
1556 bit_buf >>= code_len; num_bits -= code_len;
1558 pOut_buf_cur[0] = (
mz_uint8)(counter&0xFF);
1565 pOut_buf_cur[1] = (
mz_uint8)(sym2&0xFF);
1569 if ((counter &= 511) == 256)
break;
1571 num_extra = s_length_extra[counter - 257]; counter = s_length_base[counter - 257];
1572 if (num_extra) {
mz_uint extra_bits;
TINFL_GET_BITS(25, extra_bits, num_extra); counter += extra_bits; }
1575 num_extra = s_dist_extra[dist]; dist = s_dist_base[dist];
1576 if (num_extra) {
mz_uint extra_bits;
TINFL_GET_BITS(27, extra_bits, num_extra); dist += extra_bits; }
1578 dist_from_out_buf_start = pOut_buf_cur - pOut_buf_start;
1584 pSrc = pOut_buf_start + ((dist_from_out_buf_start - dist) & out_buf_size_mask);
1586 if ((
MZ_MAX(pOut_buf_cur, pSrc) + counter) > pOut_buf_end)
1591 *pOut_buf_cur++ = pOut_buf_start[(dist_from_out_buf_start++ - dist) & out_buf_size_mask];
1595#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
1596 else if ((counter >= 9) && (counter <= dist))
1598 const mz_uint8 *pSrc_end = pSrc + (counter & ~7);
1604 }
while ((pSrc += 8) < pSrc_end);
1605 if ((counter &= 7) < 3)
1609 pOut_buf_cur[0] = pSrc[0];
1611 pOut_buf_cur[1] = pSrc[1];
1612 pOut_buf_cur += counter;
1620 pOut_buf_cur[0] = pSrc[0];
1621 pOut_buf_cur[1] = pSrc[1];
1622 pOut_buf_cur[2] = pSrc[2];
1623 pOut_buf_cur += 3; pSrc += 3;
1624 }
while ((
int)(counter -= 3) > 2);
1625 if ((
int)counter > 0)
1627 pOut_buf_cur[0] = pSrc[0];
1628 if ((
int)counter > 1)
1629 pOut_buf_cur[1] = pSrc[1];
1630 pOut_buf_cur += counter;
1644 *pIn_buf_size = pIn_buf_cur - pIn_buf_next; *pOut_buf_size = pOut_buf_cur - pOut_buf_next;
1647 const mz_uint8 *ptr = pOut_buf_next;
size_t buf_len = *pOut_buf_size;
1651 for (i = 0; i + 7 < block_len; i += 8, ptr += 8)
1653 s1 += ptr[0], s2 += s1; s1 += ptr[1], s2 += s1; s1 += ptr[2], s2 += s1; s1 += ptr[3], s2 += s1;
1654 s1 += ptr[4], s2 += s1; s1 += ptr[5], s2 += s1; s1 += ptr[6], s2 += s1; s1 += ptr[7], s2 += s1;
1656 for ( ; i < block_len; ++i) s1 += *ptr++, s2 += s1;
1657 s1 %= 65521U, s2 %= 65521U; buf_len -= block_len; block_len = 5552;
1667 tinfl_decompressor decomp;
void *pBuf = NULL, *pNew_buf;
size_t src_buf_ofs = 0, out_buf_capacity = 0;
1672 size_t src_buf_size = src_buf_len - src_buf_ofs, dst_buf_size = out_buf_capacity - *pOut_len, new_out_buf_capacity;
1677 MZ_FREE(pBuf); *pOut_len = 0;
return NULL;
1679 src_buf_ofs += src_buf_size;
1680 *pOut_len += dst_buf_size;
1682 new_out_buf_capacity = out_buf_capacity * 2;
if (new_out_buf_capacity < 128) new_out_buf_capacity = 128;
1683 pNew_buf =
MZ_REALLOC(pBuf, new_out_buf_capacity);
1686 MZ_FREE(pBuf); *pOut_len = 0;
return NULL;
1688 pBuf = pNew_buf; out_buf_capacity = new_out_buf_capacity;
1710 size_t in_buf_size = *pIn_buf_size - in_buf_ofs, dst_buf_size =
TINFL_LZ_DICT_SIZE - dict_ofs;
1713 in_buf_ofs += in_buf_size;
1714 if ((dst_buf_size) && (!(*pPut_buf_func)(pDict + dict_ofs, (
int)dst_buf_size, pPut_buf_user)))
1724 *pIn_buf_size = in_buf_ofs;
1731static const mz_uint16 s_tdefl_len_sym[256] = {
1732 257,258,259,260,261,262,263,264,265,265,266,266,267,267,268,268,269,269,269,269,270,270,270,270,271,271,271,271,272,272,272,272,
1733 273,273,273,273,273,273,273,273,274,274,274,274,274,274,274,274,275,275,275,275,275,275,275,275,276,276,276,276,276,276,276,276,
1734 277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,277,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,278,
1735 279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,279,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,280,
1736 281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,281,
1737 282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,282,
1738 283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,283,
1739 284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,284,285 };
1741static const mz_uint8 s_tdefl_len_extra[256] = {
1742 0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
1743 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
1744 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
1745 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,0 };
1747static const mz_uint8 s_tdefl_small_dist_sym[512] = {
1748 0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,
1749 11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,
1750 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,
1751 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
1752 14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,
1753 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,16,16,16,16,16,16,16,16,16,16,16,16,16,
1754 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
1755 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
1756 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1757 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1758 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
1759 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17 };
1761static const mz_uint8 s_tdefl_small_dist_extra[512] = {
1762 0,0,0,0,1,1,1,1,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,
1763 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
1764 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
1765 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1766 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1767 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1768 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
1771static const mz_uint8 s_tdefl_large_dist_sym[128] = {
1772 0,0,18,19,20,20,21,21,22,22,22,22,23,23,23,23,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,
1773 26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,
1774 28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29 };
1776static const mz_uint8 s_tdefl_large_dist_extra[128] = {
1777 0,0,8,8,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,
1778 12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,
1779 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13 };
1786 for (i = 0; i < num_syms; i++) {
mz_uint freq = pSyms0[i].
m_key; hist[freq & 0xFF]++; hist[256 + ((freq >> 8) & 0xFF)]++; }
1787 while ((total_passes > 1) && (num_syms == hist[(total_passes - 1) * 256])) total_passes--;
1788 for (pass_shift = 0, pass = 0; pass < total_passes; pass++, pass_shift += 8)
1790 const mz_uint32* pHist = &hist[pass << 8];
1791 mz_uint offsets[256], cur_ofs = 0;
1792 for (i = 0; i < 256; i++) { offsets[i] = cur_ofs; cur_ofs += pHist[i]; }
1793 for (i = 0; i < num_syms; i++) pNew_syms[offsets[(pCur_syms[i].m_key >> pass_shift) & 0xFF]++] = pCur_syms[i];
1794 {
tdefl_sym_freq* t = pCur_syms; pCur_syms = pNew_syms; pNew_syms = t; }
1800static void tdefl_calculate_minimum_redundancy(
tdefl_sym_freq *A,
int n)
1802 int root, leaf, next, avbl, used, dpth;
1803 if (n==0)
return;
else if (n==1) { A[0].
m_key = 1;
return; }
1804 A[0].
m_key += A[1].
m_key; root = 0; leaf = 2;
1805 for (next=1; next < n-1; next++)
1808 if (leaf>=n || (root<next && A[root].m_key<A[leaf].m_key)) { A[next].
m_key = (
mz_uint16)(A[next].m_key + A[root].m_key); A[root++].
m_key = (
mz_uint16)next; }
else A[next].
m_key = (
mz_uint16)(A[next].m_key + A[leaf++].m_key);
1810 A[n-2].
m_key = 0;
for (next=n-3; next>=0; next--) A[next].m_key = A[A[next].m_key].m_key+1;
1811 avbl = 1; used = dpth = 0; root = n-2; next = n-1;
1814 while (root>=0 && (
int)A[root].
m_key==dpth) { used++; root--; }
1815 while (avbl>used) { A[next--].
m_key = (
mz_uint16)(dpth); avbl--; }
1816 avbl = 2*used; dpth++; used = 0;
1822static void tdefl_huffman_enforce_max_code_size(
int *pNum_codes,
int code_list_len,
int max_code_size)
1824 int i;
mz_uint32 total = 0;
if (code_list_len <= 1)
return;
1826 for (i = max_code_size; i > 0; i--) total += (((
mz_uint32)pNum_codes[i]) << (max_code_size - i));
1827 while (total != (1UL << max_code_size))
1829 pNum_codes[max_code_size]--;
1830 for (i = max_code_size - 1; i > 0; i--)
if (pNum_codes[i]) { pNum_codes[i]--; pNum_codes[i + 1] += 2;
break; }
1835static void tdefl_optimize_huffman_table(
tdefl_compressor *d,
int table_num,
int table_len,
int code_size_limit,
int static_table)
1840 for (i = 0; i < table_len; i++) num_codes[d->
m_huff_code_sizes[table_num][i]]++;
1845 int num_used_syms = 0;
1849 pSyms = tdefl_radix_sort_syms(num_used_syms, syms0, syms1); tdefl_calculate_minimum_redundancy(pSyms, num_used_syms);
1851 for (i = 0; i < num_used_syms; i++) num_codes[pSyms[i].m_key]++;
1853 tdefl_huffman_enforce_max_code_size(num_codes, num_used_syms, code_size_limit);
1856 for (i = 1, j = num_used_syms; i <= code_size_limit; i++)
1860 next_code[1] = 0;
for (j = 0, i = 2; i <= code_size_limit; i++) next_code[i] = j = ((j + num_codes[i - 1]) << 1);
1862 for (i = 0; i < table_len; i++)
1865 code = next_code[code_size]++;
for (l = code_size; l > 0; l--, code >>= 1) rev_code = (rev_code << 1) | (code & 1);
1870#define TDEFL_PUT_BITS(b, l) do { \
1871 mz_uint bits = b; mz_uint len = l; MZ_ASSERT(bits <= ((1U << len) - 1U)); \
1872 d->m_bit_buffer |= (bits << d->m_bits_in); d->m_bits_in += len; \
1873 while (d->m_bits_in >= 8) { \
1874 if (d->m_pOutput_buf < d->m_pOutput_buf_end) \
1875 *d->m_pOutput_buf++ = (mz_uint8)(d->m_bit_buffer&0xFF); \
1876 d->m_bit_buffer >>= 8; \
1877 d->m_bits_in -= 8; \
1870#define TDEFL_PUT_BITS(b, l) do { \ …
1881#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \
1882 if (rle_repeat_count < 3) { \
1883 d->m_huff_count[2][prev_code_size] = (mz_uint16)(d->m_huff_count[2][prev_code_size] + rle_repeat_count); \
1884 while (rle_repeat_count--) packed_code_sizes[num_packed_code_sizes++] = prev_code_size; \
1886 d->m_huff_count[2][16] = (mz_uint16)(d->m_huff_count[2][16] + 1); packed_code_sizes[num_packed_code_sizes++] = 16; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_repeat_count - 3); \
1887} rle_repeat_count = 0; } }
1881#define TDEFL_RLE_PREV_CODE_SIZE() { if (rle_repeat_count) { \ …
1889#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \
1890 if (rle_z_count < 3) { \
1891 d->m_huff_count[2][0] = (mz_uint16)(d->m_huff_count[2][0] + rle_z_count); while (rle_z_count--) packed_code_sizes[num_packed_code_sizes++] = 0; \
1892 } else if (rle_z_count <= 10) { \
1893 d->m_huff_count[2][17] = (mz_uint16)(d->m_huff_count[2][17] + 1); packed_code_sizes[num_packed_code_sizes++] = 17; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 3); \
1895 d->m_huff_count[2][18] = (mz_uint16)(d->m_huff_count[2][18] + 1); packed_code_sizes[num_packed_code_sizes++] = 18; packed_code_sizes[num_packed_code_sizes++] = (mz_uint8)(rle_z_count - 11); \
1896} rle_z_count = 0; } }
1889#define TDEFL_RLE_ZERO_CODE_SIZE() { if (rle_z_count) { \ …
1898static mz_uint8 s_tdefl_packed_code_size_syms_swizzle[] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
1902 int num_lit_codes, num_dist_codes, num_bit_lengths;
mz_uint i, total_code_sizes_to_pack, num_packed_code_sizes, rle_z_count, rle_repeat_count, packed_code_sizes_index;
1910 for (num_lit_codes = 286; num_lit_codes > 257; num_lit_codes--)
if (d->
m_huff_code_sizes[0][num_lit_codes - 1])
break;
1911 for (num_dist_codes = 30; num_dist_codes > 1; num_dist_codes--)
if (d->
m_huff_code_sizes[1][num_dist_codes - 1])
break;
1914 memcpy(code_sizes_to_pack + num_lit_codes, &d->
m_huff_code_sizes[1][0], num_dist_codes);
1915 total_code_sizes_to_pack = num_lit_codes + num_dist_codes; num_packed_code_sizes = 0; rle_z_count = 0; rle_repeat_count = 0;
1918 for (i = 0; i < total_code_sizes_to_pack; i++)
1920 mz_uint8 code_size = code_sizes_to_pack[i];
1929 if (code_size != prev_code_size)
1934 else if (++rle_repeat_count == 6)
1939 prev_code_size = code_size;
1950 for (num_bit_lengths = 18; num_bit_lengths >= 0; num_bit_lengths--)
if (d->
m_huff_code_sizes[2][s_tdefl_packed_code_size_syms_swizzle[num_bit_lengths]])
break;
1954 for (packed_code_sizes_index = 0; packed_code_sizes_index < num_packed_code_sizes; )
1958 if (code >= 16)
TDEFL_PUT_BITS(packed_code_sizes[packed_code_sizes_index++],
"\02\03\07"[code - 16]);
1967 for (i = 0; i <= 143; ++i) *p++ = 8;
1968 for ( ; i <= 255; ++i) *p++ = 9;
1969 for ( ; i <= 279; ++i) *p++ = 7;
1970 for ( ; i <= 287; ++i) *p++ = 8;
1974 tdefl_optimize_huffman_table(d, 0, 288, 15,
MZ_TRUE);
1975 tdefl_optimize_huffman_table(d, 1, 32, 15,
MZ_TRUE);
1980static const mz_uint mz_bitmasks[17] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
1982#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN && MINIZ_HAS_64BIT_REGISTERS
1992#define TDEFL_PUT_BITS_FAST(b, l) { bit_buffer |= (((mz_uint64)(b)) << bits_in); bits_in += (l); }
1995 for (pLZ_codes = d->
m_lz_code_buf; pLZ_codes < pLZ_code_buf_end; flags >>= 1)
1998 flags = *pLZ_codes++ | 0x100;
2002 mz_uint s0, s1, n0, n1, sym, num_extra_bits;
2003 mz_uint match_len = pLZ_codes[0], match_dist = *(
const mz_uint16 *)(pLZ_codes + 1); pLZ_codes += 3;
2007 TDEFL_PUT_BITS_FAST(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
2010 s0 = s_tdefl_small_dist_sym[match_dist & 511];
2011 n0 = s_tdefl_small_dist_extra[match_dist & 511];
2012 s1 = s_tdefl_large_dist_sym[match_dist >> 8];
2013 n1 = s_tdefl_large_dist_extra[match_dist >> 8];
2014 sym = (match_dist < 512) ? s0 : s1;
2015 num_extra_bits = (match_dist < 512) ? n0 : n1;
2019 TDEFL_PUT_BITS_FAST(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
2027 if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))
2034 if (((flags & 2) == 0) && (pLZ_codes < pLZ_code_buf_end))
2048 pOutput_buf += (bits_in >> 3);
2049 bit_buffer >>= (bits_in & ~7);
2053#undef TDEFL_PUT_BITS_FAST
2081 flags = *pLZ_codes++ | 0x100;
2085 mz_uint match_len = pLZ_codes[0], match_dist = (pLZ_codes[1] | (pLZ_codes[2] << 8)); pLZ_codes += 3;
2089 TDEFL_PUT_BITS(match_len & mz_bitmasks[s_tdefl_len_extra[match_len]], s_tdefl_len_extra[match_len]);
2091 if (match_dist < 512)
2093 sym = s_tdefl_small_dist_sym[match_dist]; num_extra_bits = s_tdefl_small_dist_extra[match_dist];
2097 sym = s_tdefl_large_dist_sym[match_dist >> 8]; num_extra_bits = s_tdefl_large_dist_extra[match_dist >> 8];
2101 TDEFL_PUT_BITS(match_dist & mz_bitmasks[num_extra_bits], num_extra_bits);
2120 tdefl_start_static_block(d);
2122 tdefl_start_dynamic_block(d);
2123 return tdefl_compress_lz_codes(d);
2128 mz_uint saved_bit_buf, saved_bits_in;
2173 else if (!comp_block_succeeded)
2176 tdefl_compress_block(d,
MZ_TRUE);
2212 if ((n -= bytes_to_copy) != 0)
2227#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
2228#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16*)(p)
2234 mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->
m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);
2240 if (--num_probes_left == 0)
return;
2241 #define TDEFL_PROBE \
2242 next_probe_pos = d->m_next[probe_pos]; \
2243 if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
2244 probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
2245 if (TDEFL_READ_UNALIGNED_WORD(&d->m_dict[probe_pos + match_len - 1]) == c01) break;
2249 q = (
const mz_uint16*)(d->
m_dict + probe_pos);
if (TDEFL_READ_UNALIGNED_WORD(q) != s01)
continue; p = s; probe_len = 32;
2250 do { }
while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
2251 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );
2258 *pMatch_dist = dist;
if ((*pMatch_len = match_len =
MZ_MIN(max_match_len, probe_len)) == max_match_len)
break;
2259 c01 = TDEFL_READ_UNALIGNED_WORD(&d->
m_dict[pos + match_len - 1]);
2275 if (--num_probes_left == 0)
return;
2276 #define TDEFL_PROBE \
2277 next_probe_pos = d->m_next[probe_pos]; \
2278 if ((!next_probe_pos) || ((dist = (mz_uint16)(lookahead_pos - next_probe_pos)) > max_dist)) return; \
2279 probe_pos = next_probe_pos & TDEFL_LZ_DICT_SIZE_MASK; \
2280 if ((d->m_dict[probe_pos + match_len] == c0) && (d->m_dict[probe_pos + match_len - 1] == c1)) break;
2283 if (!dist)
break; p = s; q = d->
m_dict + probe_pos;
for (probe_len = 0; probe_len < max_match_len; probe_len++)
if (*p++ != *q++)
break;
2284 if (probe_len > match_len)
2286 *pMatch_dist = dist;
if ((*pMatch_len = match_len = probe_len) == max_match_len)
return;
2287 c0 = d->
m_dict[pos + match_len]; c1 = d->
m_dict[pos + match_len - 1];
2293#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
2303 const mz_uint TDEFL_COMP_FAST_LOOKAHEAD_SIZE = 4096;
2307 lookahead_size += num_bytes_to_process;
2309 while (num_bytes_to_process)
2317 num_bytes_to_process -= n;
2321 if ((!d->
m_flush) && (lookahead_size < TDEFL_COMP_FAST_LOOKAHEAD_SIZE))
break;
2323 while (lookahead_size >= 4)
2325 mz_uint cur_match_dist, cur_match_len = 1;
2337 do { }
while ( (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
2338 (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0) );
2346 *pLZ_code_buf++ = (
mz_uint8)first_trigram;
2347 *pLZ_flags = (
mz_uint8)(*pLZ_flags >> 1);
2353 cur_match_len =
MZ_MIN(cur_match_len, lookahead_size);
2362 *pLZ_flags = (
mz_uint8)((*pLZ_flags >> 1) | 0x80);
2364 s0 = s_tdefl_small_dist_sym[cur_match_dist & 511];
2365 s1 = s_tdefl_large_dist_sym[cur_match_dist >> 8];
2366 d->
m_huff_count[1][(cur_match_dist < 512) ? s0 : s1]++;
2373 *pLZ_code_buf++ = (
mz_uint8)first_trigram;
2374 *pLZ_flags = (
mz_uint8)(*pLZ_flags >> 1);
2378 if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
2380 total_lz_bytes += cur_match_len;
2381 lookahead_pos += cur_match_len;
2384 MZ_ASSERT(lookahead_size >= cur_match_len);
2385 lookahead_size -= cur_match_len;
2392 if ((n = tdefl_flush_block(d, 0)) != 0)
2398 while (lookahead_size)
2403 *pLZ_code_buf++ = lit;
2404 *pLZ_flags = (
mz_uint8)(*pLZ_flags >> 1);
2405 if (--num_flags_left == 0) { num_flags_left = 8; pLZ_flags = pLZ_code_buf++; }
2419 if ((n = tdefl_flush_block(d, 0)) != 0)
2456 s0 = s_tdefl_small_dist_sym[match_dist & 511]; s1 = s_tdefl_large_dist_sym[(match_dist >> 8) & 127];
2469 mz_uint len_to_move, cur_match_dist, cur_match_len, cur_pos;
2476 const mz_uint8 *pSrc_end = pSrc + num_bytes_to_process;
2477 src_buf_left -= num_bytes_to_process;
2479 while (pSrc != pSrc_end)
2516 cur_match_len = 0;
while (cur_match_len < d->m_lookahead_size) {
if (d->
m_dict[cur_pos + cur_match_len] != c)
break; cur_match_len++; }
2526 cur_match_dist = cur_match_len = 0;
2533 if (cur_match_len >= 128)
2535 tdefl_record_match(d, cur_match_len, cur_match_dist);
2549 else if (!cur_match_dist)
2553 tdefl_record_match(d, cur_match_len, cur_match_dist);
2554 len_to_move = cur_match_len;
2571 if ((n = tdefl_flush_block(d, 0)) != 0)
2605 if (pIn_buf_size) *pIn_buf_size = 0;
2606 if (pOut_buf_size) *pOut_buf_size = 0;
2617 (d->
m_wants_to_finish && (flush !=
TDEFL_FINISH)) || (pIn_buf_size && *pIn_buf_size && !pIn_buf) || (pOut_buf_size && *pOut_buf_size && !pOut_buf) )
2619 if (pIn_buf_size) *pIn_buf_size = 0;
2620 if (pOut_buf_size) *pOut_buf_size = 0;
2628#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES && MINIZ_LITTLE_ENDIAN
2633 if (!tdefl_compress_fast(d))
2639 if (!tdefl_compress_normal(d))
2648 if (tdefl_flush_block(d, flush) < 0)
2666 d->
m_max_probes[1] = 1 + (((flags & 0xFFF) >> 2) + 2) / 3;
2697 MZ_FREE(pComp);
return succeeded;
2707static mz_bool tdefl_output_buffer_putter(
const void *pBuf,
int len,
void *pUser)
2710 size_t new_size = p->
m_size + len;
2714 do { new_capacity =
MZ_MAX(128U, new_capacity << 1U); }
while (new_size > new_capacity);
2725 if (!pOut_len)
return MZ_FALSE;
else *pOut_len = 0;
2734 if (!pOut_buf)
return 0;
2740#ifndef MINIZ_NO_ZLIB_APIS
2741static const mz_uint s_tdefl_num_probes[11] = { 0, 1, 6, 32, 16, 32, 128, 256, 512, 768, 1500 };
2751 else if (strategy ==
MZ_HUFFMAN_ONLY) comp_flags &= ~TDEFL_MAX_PROBES_MASK;
2760#pragma warning (push)
2761#pragma warning (disable:4204)
2767#pragma warning (pop)
2772#ifndef MINIZ_NO_ARCHIVE_APIS
2774#ifdef MINIZ_NO_STDIO
2775 #define MZ_FILE void *
2778 #include <sys/stat.h>
2779 #if defined(_MSC_VER) || defined(__MINGW64__)
2780 #include <sys/utime.h>
2781 #define MZ_FILE FILE
2782 #define MZ_FOPEN fopen
2783 #define MZ_FCLOSE fclose
2784 #define MZ_FREAD fread
2785 #define MZ_FWRITE fwrite
2786 #define MZ_FTELL64 _ftelli64
2787 #define MZ_FSEEK64 _fseeki64
2788 #define MZ_FILE_STAT_STRUCT _stat
2789 #define MZ_FILE_STAT _stat
2790 #define MZ_FFLUSH fflush
2791 #define MZ_FREOPEN freopen
2792 #define MZ_DELETE_FILE remove
2793 #elif defined(__MINGW32__)
2794 #include <sys/utime.h>
2795 #define MZ_FILE FILE
2796 #define MZ_FOPEN fopen
2797 #define MZ_FCLOSE fclose
2798 #define MZ_FREAD fread
2799 #define MZ_FWRITE fwrite
2800 #define MZ_FTELL64 ftello64
2801 #define MZ_FSEEK64 fseeko64
2802 #define MZ_FILE_STAT_STRUCT _stat
2803 #define MZ_FILE_STAT _stat
2804 #define MZ_FFLUSH fflush
2805 #define MZ_FREOPEN freopen
2806 #define MZ_DELETE_FILE remove
2809 #define MZ_FILE FILE
2810 #define MZ_FOPEN fopen
2811 #define MZ_FCLOSE fclose
2812 #define MZ_FREAD fread
2813 #define MZ_FWRITE fwrite
2814 #define MZ_FTELL64 ftello
2815 #define MZ_FSEEK64 fseeko
2816 #define MZ_FILE_STAT_STRUCT stat
2817 #define MZ_FILE_STAT stat
2818 #define MZ_FFLUSH fflush
2819 #define MZ_FREOPEN freopen
2820 #define MZ_DELETE_FILE remove
2824#define MZ_TOLOWER(c) ((((c) >= 'A') && ((c) <= 'Z')) ? ((c) - 'A' + 'a') : (c))
2864#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size) (array_ptr)->m_element_size = element_size
2865#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index) ((element_type *)((array_ptr)->m_p))[index]
2876 if (growing) { new_capacity =
MZ_MAX(1, pArray->
m_capacity);
while (new_capacity < min_new_capacity) new_capacity *= 2; }
2884 if (new_capacity > pArray->
m_capacity) {
if (!mz_zip_array_ensure_capacity(pZip, pArray, new_capacity, growing))
return MZ_FALSE; }
2890 if (new_size > pArray->
m_capacity) {
if (!mz_zip_array_ensure_capacity(pZip, pArray, new_size, growing))
return MZ_FALSE; }
2891 pArray->
m_size = new_size;
2897 return mz_zip_array_reserve(pZip, pArray, pArray->
m_size + n,
MZ_TRUE);
2902 size_t orig_size = pArray->
m_size;
if (!mz_zip_array_resize(pZip, pArray, orig_size + n,
MZ_TRUE))
return MZ_FALSE;
2907#ifndef MINIZ_NO_TIME
2908static time_t mz_zip_dos_to_time_t(
int dos_time,
int dos_date)
2911 memset(&tm, 0,
sizeof(tm)); tm.tm_isdst = -1;
2912 tm.tm_year = ((dos_date >> 9) & 127) + 1980 - 1900; tm.tm_mon = ((dos_date >> 5) & 15) - 1; tm.tm_mday = dos_date & 31;
2913 tm.tm_hour = (dos_time >> 11) & 31; tm.tm_min = (dos_time >> 5) & 63; tm.tm_sec = (dos_time << 1) & 62;
2917static void mz_zip_time_to_dos_time(time_t time,
mz_uint16 *pDOS_time,
mz_uint16 *pDOS_date)
2919 struct tm *tm = localtime(&time);
2920 *pDOS_time = (
mz_uint16)(((tm->tm_hour) << 11) + ((tm->tm_min) << 5) + ((tm->tm_sec) >> 1));
2921 *pDOS_date = (
mz_uint16)(((tm->tm_year + 1900 - 1980) << 9) + ((tm->tm_mon + 1) << 5) + tm->tm_mday);
2925#ifndef MINIZ_NO_STDIO
2929 (void)pFilename; *pDOS_date = *pDOS_time = 0;
2932 mz_zip_time_to_dos_time(file_stat.st_mtime, pDOS_time, pDOS_date);
2937static mz_bool mz_zip_set_file_times(
const char *pFilename, time_t access_time, time_t modified_time)
2939#ifndef MINIZ_NO_TIME
2940 struct utimbuf t; t.actime = access_time; t.modtime = modified_time;
2941 return !utime(pFilename, &t);
2943 pFilename, access_time, modified_time;
2980 pE = pL +
MZ_MIN(l_len, r_len);
2987 return (pL == pE) ? (l_len < r_len) : (l < r);
2990#define MZ_SWAP_UINT32(a, b) do { mz_uint32 t = a; a = b; b = t; } MZ_MACRO_END
2993static void mz_zip_reader_sort_central_dir_offsets_by_filename(
mz_zip_archive *pZip)
3000 int start = (size - 2) >> 1, end;
3003 int child, root = start;
3006 if ((child = (root << 1) + 1) >= size)
3008 child += (((child + 1) < size) && (mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1])));
3009 if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))
3019 int child, root = 0;
3023 if ((child = (root << 1) + 1) >= end)
3025 child += (((child + 1) < end) && mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[child], pIndices[child + 1]));
3026 if (!mz_zip_reader_filename_less(pCentral_dir, pCentral_dir_offsets, pIndices[root], pIndices[child]))
3036 mz_uint cdir_size, num_this_disk, cdir_disk_index;
3051 for (i = n - 4; i >= 0; --i)
3061 cur_file_ofs =
MZ_MAX(cur_file_ofs - (
sizeof(buf_u32) - 3), 0);
3072 if (((num_this_disk | cdir_disk_index) != 0) && ((num_this_disk != 1) || (cdir_disk_index != 1)))
3099 mz_uint total_header_size, comp_size, decomp_size, disk_index;
3106 if (((!
MZ_READ_LE32(p +
MZ_ZIP_CDH_METHOD_OFS)) && (decomp_size != comp_size)) || (decomp_size && !comp_size) || (decomp_size == 0xFFFFFFFF) || (comp_size == 0xFFFFFFFF))
3109 if ((disk_index != num_this_disk) && (disk_index != 1))
3115 n -= total_header_size; p += total_header_size;
3120 mz_zip_reader_sort_central_dir_offsets_by_filename(pZip);
3127 if ((!pZip) || (!pZip->
m_pRead))
3129 if (!mz_zip_reader_init_internal(pZip, flags))
3132 if (!mz_zip_reader_read_central_dir(pZip, flags))
3140static size_t mz_zip_mem_read_func(
void *pOpaque,
mz_uint64 file_ofs,
void *pBuf,
size_t n)
3143 size_t s = (file_ofs >= pZip->
m_archive_size) ? 0 : (size_t)
MZ_MIN(pZip->m_archive_size - file_ofs, n);
3150 if (!mz_zip_reader_init_internal(pZip, flags))
3153 pZip->
m_pRead = mz_zip_mem_read_func;
3157 if (!mz_zip_reader_read_central_dir(pZip, flags))
3165#ifndef MINIZ_NO_STDIO
3166static size_t mz_zip_file_read_func(
void *pOpaque,
mz_uint64 file_ofs,
void *pBuf,
size_t n)
3182 if (NULL == (pFile = _wfopen(GetUTF8WString(pFilename).c_str(), L
"rb"))) {
3192 if (!mz_zip_reader_init_internal(pZip, flags))
3197 pZip->
m_pRead = mz_zip_file_read_func;
3201 if (!mz_zip_reader_read_central_dir(pZip, flags))
3225 const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
3229 return (m_bit_flag & 1);
3234 mz_uint filename_len, internal_attr, external_attr;
3235 const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
3241 if ((!internal_attr) && ((external_attr & 0x10) != 0))
3257 const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
3258 if ((!p) || (!pStat))
3268#ifndef MINIZ_NO_TIME
3292 const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
3293 if (!p) {
if (filename_buf_size) pFilename[0] =
'\0';
return 0; }
3295 if (filename_buf_size)
3297 n =
MZ_MIN(n, filename_buf_size - 1);
3299 pFilename[n] =
'\0';
3308 return 0 == memcmp(pA, pB, len);
3309 for (i = 0; i < len; ++i)
3321 pE = pL +
MZ_MIN(l_len, r_len);
3328 return (pL == pE) ? (int)(l_len - r_len) : (l - r);
3331static int mz_zip_reader_locate_file_binary_search(
mz_zip_archive *pZip,
const char *pFilename)
3339 int l = 0, h = size - 1;
3342 int m = (l + h) >> 1, file_index = pIndices[m], comp = mz_zip_reader_filename_compare(pCentral_dir, pCentral_dir_offsets, file_index, pFilename, filename_len);
3355 mz_uint file_index;
size_t name_len, comment_len;
3359 return mz_zip_reader_locate_file_binary_search(pZip, pName);
3360 name_len = strlen(pName);
if (name_len > 0xFFFF)
return -1;
3361 comment_len = pComment ? strlen(pComment) : 0;
if (comment_len > 0xFFFF)
return -1;
3362 for (file_index = 0; file_index < pZip->
m_total_files; file_index++)
3367 if (filename_len < name_len)
3372 const char *pFile_comment = pFilename + filename_len + file_extra_len;
3373 if ((file_comment_len != comment_len) || (!mz_zip_reader_string_equal(pComment, pFile_comment, file_comment_len, flags)))
3378 int ofs = filename_len - 1;
3381 if ((pFilename[ofs] ==
'/') || (pFilename[ofs] ==
'\\') || (pFilename[ofs] ==
':'))
3383 }
while (--ofs >= 0);
3385 pFilename += ofs; filename_len -= ofs;
3387 if ((filename_len == name_len) && (mz_zip_reader_string_equal(pName, pFilename, filename_len, flags)))
3396 mz_uint64 needed_size, cur_file_ofs, comp_remaining, out_buf_ofs = 0, read_buf_size, read_buf_ofs = 0, read_buf_avail;
3402 if ((buf_size) && (!pBuf))
3421 if (buf_size < needed_size)
3438 if (pZip->
m_pRead(pZip->
m_pIO_opaque, cur_file_ofs, pBuf, (
size_t)needed_size) != needed_size)
3450 read_buf_size = read_buf_avail = file_stat.
m_comp_size;
3453 else if (pUser_read_buf)
3456 if (!user_read_buf_size)
3458 pRead_buf = (
mz_uint8 *)pUser_read_buf;
3459 read_buf_size = user_read_buf_size;
3468 if (((0,
sizeof(
size_t) ==
sizeof(
mz_uint32))) && (read_buf_size > 0x7FFFFFFF))
3470 if (((
sizeof(
size_t) ==
sizeof(
mz_uint32))) && (read_buf_size > 0x7FFFFFFF))
3481 size_t in_buf_size, out_buf_size = (size_t)(file_stat.
m_uncomp_size - out_buf_ofs);
3484 read_buf_avail =
MZ_MIN(read_buf_size, comp_remaining);
3485 if (pZip->
m_pRead(pZip->
m_pIO_opaque, cur_file_ofs, pRead_buf, (
size_t)read_buf_avail) != read_buf_avail)
3490 cur_file_ofs += read_buf_avail;
3491 comp_remaining -= read_buf_avail;
3494 in_buf_size = (size_t)read_buf_avail;
3496 read_buf_avail -= in_buf_size;
3497 read_buf_ofs += in_buf_size;
3498 out_buf_ofs += out_buf_size;
3534 mz_uint64 comp_size, uncomp_size, alloc_size;
3535 const mz_uint8 *p = mz_zip_reader_get_cdh(pZip, file_index);
3548 if (((0,
sizeof(
size_t) ==
sizeof(
mz_uint32))) && (alloc_size > 0x7FFFFFFF))
3550 if (((
sizeof(
size_t) ==
sizeof(
mz_uint32))) && (alloc_size > 0x7FFFFFFF))
3562 if (pSize) *pSize = (size_t)alloc_size;
3571 if (pSize) *pSize = 0;
3580 mz_uint64 read_buf_size, read_buf_ofs = 0, read_buf_avail, comp_remaining, out_buf_ofs = 0, cur_file_ofs;
3582 void *pRead_buf = NULL;
void *pWrite_buf = NULL;
3614 read_buf_size = read_buf_avail = file_stat.
m_comp_size;
3647 while (comp_remaining)
3649 read_buf_avail =
MZ_MIN(read_buf_size, comp_remaining);
3650 if (pZip->
m_pRead(pZip->
m_pIO_opaque, cur_file_ofs, pRead_buf, (
size_t)read_buf_avail) != read_buf_avail)
3659 if (pCallback(pOpaque, out_buf_ofs, pRead_buf, (
size_t)read_buf_avail) != read_buf_avail)
3664 cur_file_ofs += read_buf_avail;
3665 out_buf_ofs += read_buf_avail;
3666 comp_remaining -= read_buf_avail;
3685 read_buf_avail =
MZ_MIN(read_buf_size, comp_remaining);
3686 if (pZip->
m_pRead(pZip->
m_pIO_opaque, cur_file_ofs, pRead_buf, (
size_t)read_buf_avail) != read_buf_avail)
3691 cur_file_ofs += read_buf_avail;
3692 comp_remaining -= read_buf_avail;
3696 in_buf_size = (size_t)read_buf_avail;
3698 read_buf_avail -= in_buf_size;
3699 read_buf_ofs += in_buf_size;
3703 if (pCallback(pOpaque, out_buf_ofs, pWrite_buf_cur, out_buf_size) != out_buf_size)
3709 if ((out_buf_ofs += out_buf_size) > file_stat.
m_uncomp_size)
3742#ifndef MINIZ_NO_STDIO
3743static size_t mz_zip_file_write_callback(
void *pOpaque,
mz_uint64 ofs,
const void *pBuf,
size_t n)
3755 pFile =
MZ_FOPEN(pDst_filename,
"wb");
3759 if (NULL == (pFile = _wfopen(GetUTF8WString(pDst_filename).c_str(), L
"wb"))) {
3770#ifndef MINIZ_NO_TIME
3772 mz_zip_set_file_times(pDst_filename, file_stat.
m_time, file_stat.
m_time);
3790#ifndef MINIZ_NO_STDIO
3805#ifndef MINIZ_NO_STDIO
3817#ifndef MINIZ_NO_ARCHIVE_WRITING_APIS
3821#define MZ_WRITE_LE16(p, v) mz_write_le16((mz_uint8 *)(p), (mz_uint16)(v))
3822#define MZ_WRITE_LE32(p, v) mz_write_le32((mz_uint8 *)(p), (mz_uint32)(v))
3854static size_t mz_zip_heap_write_func(
void *pOpaque,
mz_uint64 file_ofs,
const void *pBuf,
size_t n)
3860 if ((!n) || ((0,
sizeof(
size_t) ==
sizeof(
mz_uint32)) && (new_size > 0x7FFFFFFF)))
3862 if ((!n) || ((
sizeof(
size_t) ==
sizeof(
mz_uint32)) && (new_size > 0x7FFFFFFF)))
3868 size_t new_capacity =
MZ_MAX(64, pState->
m_mem_capacity);
while (new_capacity < new_size) new_capacity *= 2;
3880 pZip->
m_pWrite = mz_zip_heap_write_func;
3884 if (0 != (initial_allocation_size =
MZ_MAX(initial_allocation_size, size_to_reserve_at_beginning)))
3896#ifndef MINIZ_NO_STDIO
3897static size_t mz_zip_file_write_func(
void *pOpaque,
mz_uint64 file_ofs,
const void *pBuf,
size_t n)
3909 pZip->
m_pWrite = mz_zip_file_write_func;
3913 if (NULL == (pFile =
MZ_FOPEN(pFilename,
"wb")))
3916 if (NULL == (pFile = _wfopen(GetUTF8WString(pFilename).c_str(), L
"wb"))) {
3925 if (size_to_reserve_at_beginning)
3930 size_t n = (size_t)
MZ_MIN(
sizeof(buf), size_to_reserve_at_beginning);
3936 cur_ofs += n; size_to_reserve_at_beginning -= n;
3937 }
while (size_to_reserve_at_beginning);
3956#ifdef MINIZ_NO_STDIO
3964 pZip->
m_pWrite = mz_zip_file_write_func;
3969 if (NULL == (tempFile = _wfreopen(GetUTF8WString(pFilename).c_str(), L
"r+b", pState->
m_pFile))) {
3987 pZip->
m_pWrite = mz_zip_heap_write_func;
4013static mz_bool mz_zip_writer_add_put_buf_callback(
const void* pBuf,
int len,
void *pUser)
4023static mz_bool mz_zip_writer_create_local_dir_header(
mz_zip_archive *pZip,
mz_uint8 *pDst,
mz_uint16 filename_size,
mz_uint16 extra_size,
mz_uint64 uncomp_size,
mz_uint64 comp_size,
mz_uint32 uncomp_crc32,
mz_uint16 method,
mz_uint16 bit_flags,
mz_uint16 dos_time,
mz_uint16 dos_date)
4041static mz_bool mz_zip_writer_create_central_dir_header(
mz_zip_archive *pZip,
mz_uint8 *pDst,
mz_uint16 filename_size,
mz_uint16 extra_size,
mz_uint16 comment_size,
mz_uint64 uncomp_size,
mz_uint64 comp_size,
mz_uint32 uncomp_crc32,
mz_uint16 method,
mz_uint16 bit_flags,
mz_uint16 dos_time,
mz_uint16 dos_date,
mz_uint64 local_header_ofs,
mz_uint32 ext_attributes)
4062static mz_bool mz_zip_writer_add_to_central_dir(
mz_zip_archive *pZip,
const char *pFilename,
mz_uint16 filename_size,
const void *pExtra,
mz_uint16 extra_size,
const void *pComment,
mz_uint16 comment_size,
mz_uint64 uncomp_size,
mz_uint64 comp_size,
mz_uint32 uncomp_crc32,
mz_uint16 method,
mz_uint16 bit_flags,
mz_uint16 dos_time,
mz_uint16 dos_date,
mz_uint64 local_header_ofs,
mz_uint32 ext_attributes)
4073 if (!mz_zip_writer_create_central_dir_header(pZip, central_dir_header, filename_size, extra_size, comment_size, uncomp_size, comp_size, uncomp_crc32, method, bit_flags, dos_time, dos_date, local_header_ofs, ext_attributes))
4077 (!mz_zip_array_push_back(pZip, &pState->
m_central_dir, pFilename, filename_size)) ||
4078 (!mz_zip_array_push_back(pZip, &pState->
m_central_dir, pExtra, extra_size)) ||
4079 (!mz_zip_array_push_back(pZip, &pState->
m_central_dir, pComment, comment_size)) ||
4090static mz_bool mz_zip_writer_validate_archive_name(
const char *pArchive_name)
4093 if (*pArchive_name ==
'/')
4095 while (*pArchive_name)
4097 if ((*pArchive_name ==
'\\') || (*pArchive_name ==
':'))
4116 memset(buf, 0,
MZ_MIN(
sizeof(buf), n));
4122 cur_file_ofs += s; n -= s;
4129 mz_uint16 method = 0, dos_time = 0, dos_date = 0;
4130 mz_uint level, ext_attributes = 0, num_alignment_padding_bytes;
4132 size_t archive_name_size;
4135 mz_bool store_data_uncompressed;
4138 if ((
int)level_and_flags < 0)
4140 level = level_and_flags & 0xF;
4151 if ((buf_size > 0xFFFFFFFF) || (uncomp_size > 0xFFFFFFFF))
4153 if (!mz_zip_writer_validate_archive_name(pArchive_name))
4156#ifndef MINIZ_NO_TIME
4158 time_t cur_time; time(&cur_time);
4159 mz_zip_time_to_dos_time(cur_time, &dos_time, &dos_date);
4163 archive_name_size = strlen(pArchive_name);
4164 if (archive_name_size > 0xFFFF)
4167 num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
4173 if ((archive_name_size) && (pArchive_name[archive_name_size - 1] ==
'/'))
4176 ext_attributes |= 0x10;
4178 if ((buf_size) || (uncomp_size))
4186 if ((!store_data_uncompressed) && (buf_size))
4192 if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes +
sizeof(local_dir_header)))
4197 local_dir_header_ofs += num_alignment_padding_bytes;
4199 cur_archive_file_ofs += num_alignment_padding_bytes +
sizeof(local_dir_header);
4202 if (pZip->
m_pWrite(pZip->
m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)
4207 cur_archive_file_ofs += archive_name_size;
4212 uncomp_size = buf_size;
4213 if (uncomp_size <= 3)
4216 store_data_uncompressed =
MZ_TRUE;
4220 if (store_data_uncompressed)
4228 cur_archive_file_ofs += buf_size;
4229 comp_size = buf_size;
4259 if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
4262 if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (
mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
4265 if (pZip->
m_pWrite(pZip->
m_pIO_opaque, local_dir_header_ofs, local_dir_header,
sizeof(local_dir_header)) !=
sizeof(local_dir_header))
4268 if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (
mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))
4277#ifndef MINIZ_NO_STDIO
4281 mz_uint16 method = 0, dos_time = 0, dos_date = 0, ext_attributes = 0;
4283 size_t archive_name_size;
4287 if ((
int)level_and_flags < 0)
4289 level = level_and_flags & 0xF;
4295 if (!mz_zip_writer_validate_archive_name(pArchive_name))
4298 archive_name_size = strlen(pArchive_name);
4299 if (archive_name_size > 0xFFFF)
4302 num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
4308 if (!mz_zip_get_file_modified_time(pSrc_filename, &dos_time, &dos_date))
4311 pSrc_file =
MZ_FOPEN(pSrc_filename,
"rb");
4315 if (NULL == (pSrc_file = _wfopen(GetUTF8WString(pSrc_filename).c_str(), L
"rb"))) {
4326 if (uncomp_size > 0xFFFFFFFF)
4332 if (uncomp_size <= 3)
4335 if (!mz_zip_writer_write_zeros(pZip, cur_archive_file_ofs, num_alignment_padding_bytes +
sizeof(local_dir_header)))
4337 local_dir_header_ofs += num_alignment_padding_bytes;
4339 cur_archive_file_ofs += num_alignment_padding_bytes +
sizeof(local_dir_header);
4342 if (pZip->
m_pWrite(pZip->
m_pIO_opaque, cur_archive_file_ofs, pArchive_name, archive_name_size) != archive_name_size)
4347 cur_archive_file_ofs += archive_name_size;
4351 mz_uint64 uncomp_remaining = uncomp_size;
4361 while (uncomp_remaining)
4371 uncomp_remaining -= n;
4372 cur_archive_file_ofs += n;
4374 comp_size = uncomp_size;
4405 if (
MZ_FREAD(pRead_buf, 1, in_buf_size, pSrc_file) != in_buf_size)
4409 uncomp_remaining -= in_buf_size;
4442 if ((comp_size > 0xFFFFFFFF) || (cur_archive_file_ofs > 0xFFFFFFFF))
4445 if (!mz_zip_writer_create_local_dir_header(pZip, local_dir_header, (
mz_uint16)archive_name_size, 0, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date))
4448 if (pZip->
m_pWrite(pZip->
m_pIO_opaque, local_dir_header_ofs, local_dir_header,
sizeof(local_dir_header)) !=
sizeof(local_dir_header))
4451 if (!mz_zip_writer_add_to_central_dir(pZip, pArchive_name, (
mz_uint16)archive_name_size, NULL, 0, pComment, comment_size, uncomp_size, comp_size, uncomp_crc32, method, 0, dos_time, dos_date, local_dir_header_ofs, ext_attributes))
4463 mz_uint n, bit_flags, num_alignment_padding_bytes;
4464 mz_uint64 comp_bytes_remaining, local_dir_header_ofs;
4465 mz_uint64 cur_src_file_ofs, cur_dst_file_ofs;
4468 size_t orig_central_dir_size;
4470 void *pBuf;
const mz_uint8 *pSrc_central_header;
4474 if (NULL == (pSrc_central_header = mz_zip_reader_get_cdh(pSource_zip, file_index)))
4478 num_alignment_padding_bytes = mz_zip_writer_compute_padding_needed_for_file_alignment(pZip);
4493 if (!mz_zip_writer_write_zeros(pZip, cur_dst_file_ofs, num_alignment_padding_bytes))
4495 cur_dst_file_ofs += num_alignment_padding_bytes;
4496 local_dir_header_ofs = cur_dst_file_ofs;
4509 while (comp_bytes_remaining)
4517 cur_src_file_ofs += n;
4524 cur_dst_file_ofs += n;
4526 comp_bytes_remaining -= n;
4546 cur_src_file_ofs += n;
4547 cur_dst_file_ofs += n;
4552 if (cur_dst_file_ofs > 0xFFFFFFFF)
4587 mz_uint64 central_dir_ofs, central_dir_size;
4599 central_dir_ofs = 0;
4600 central_dir_size = 0;
4622#ifndef MINIZ_NO_STDIO
4635 if ((!pZip) || (!pZip->
m_pState) || (!pBuf) || (!pSize))
4637 if (pZip->
m_pWrite != mz_zip_heap_write_func)
4662#ifndef MINIZ_NO_STDIO
4670 if ((pZip->
m_pWrite == mz_zip_heap_write_func) && (pState->
m_pMem))
4681#ifndef MINIZ_NO_STDIO
4690 if ((
int)level_and_flags < 0)
4692 if ((!pZip_filename) || (!pArchive_name) || ((buf_size) && (!pBuf)) || ((comment_size) && (!pComment)) || ((level_and_flags & 0xF) >
MZ_UBER_COMPRESSION))
4694 if (!mz_zip_writer_validate_archive_name(pArchive_name))
4697 DWORD resp = GetFileAttributesW(GetUTF8WString(pZip_filename).c_str());
4698 if (resp & FILE_ATTRIBUTE_DEVICE)
4706 created_new_archive =
MZ_TRUE;
4719 status =
mz_zip_writer_add_mem_ex(&zip_archive, pArchive_name, pBuf, buf_size, pComment, comment_size, level_and_flags, 0, 0);
4725 if ((!status) && (created_new_archive))
4729 (void)ignoredStatus;
4743 if ((!pZip_filename) || (!pArchive_name))
unsigned long mz_ulong
Definition miniz.c:210
@ MZ_MEM_ERROR
Definition miniz.c:245
@ MZ_PARAM_ERROR
Definition miniz.c:245
@ MZ_NEED_DICT
Definition miniz.c:245
@ MZ_VERSION_ERROR
Definition miniz.c:245
@ MZ_STREAM_END
Definition miniz.c:245
@ MZ_ERRNO
Definition miniz.c:245
@ MZ_OK
Definition miniz.c:245
@ MZ_BUF_ERROR
Definition miniz.c:245
@ MZ_STREAM_ERROR
Definition miniz.c:245
@ MZ_DATA_ERROR
Definition miniz.c:245
#define MZ_WRITE_LE32(p, v)
Definition miniz.c:3822
@ TDEFL_FORCE_ALL_RAW_BLOCKS
Definition miniz.c:781
@ TDEFL_GREEDY_PARSING_FLAG
Definition miniz.c:776
@ TDEFL_FORCE_ALL_STATIC_BLOCKS
Definition miniz.c:780
@ TDEFL_COMPUTE_ADLER32
Definition miniz.c:775
@ TDEFL_FILTER_MATCHES
Definition miniz.c:779
@ TDEFL_WRITE_ZLIB_HEADER
Definition miniz.c:774
@ TDEFL_NONDETERMINISTIC_PARSING_FLAG
Definition miniz.c:777
@ TDEFL_RLE_MATCHES
Definition miniz.c:778
#define MZ_FILE_STAT
Definition miniz.c:2817
#define MZ_FOPEN
Definition miniz.c:2810
mz_ulong mz_adler32(mz_ulong adler, const unsigned char *ptr, size_t buf_len)
Definition miniz.c:943
#define MZ_MALLOC(x)
Definition miniz.c:912
mz_zip_flags
Definition miniz.c:536
@ MZ_ZIP_FLAG_COMPRESSED_DATA
Definition miniz.c:539
@ MZ_ZIP_FLAG_DO_NOT_SORT_CENTRAL_DIRECTORY
Definition miniz.c:540
@ MZ_ZIP_FLAG_CASE_SENSITIVE
Definition miniz.c:537
@ MZ_ZIP_FLAG_IGNORE_PATH
Definition miniz.c:538
mz_bool mz_zip_reader_end(mz_zip_archive *pZip)
Definition miniz.c:3778
mz_bool mz_zip_writer_finalize_archive(mz_zip_archive *pZip)
Definition miniz.c:4584
#define MZ_READ_LE16(p)
Definition miniz.c:925
#define MZ_REALLOC(p, x)
Definition miniz.c:914
void *(* mz_alloc_func)(void *opaque, size_t items, size_t size)
Definition miniz.c:214
mz_bool tdefl_compress_mem_to_output(const void *pBuf, size_t buf_len, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
Definition miniz.c:2691
struct mz_stream_s mz_stream
@ TDEFL_MAX_MATCH_LEN
Definition miniz.c:807
@ TDEFL_MAX_HUFF_TABLES
Definition miniz.c:807
@ TDEFL_MAX_HUFF_SYMBOLS_0
Definition miniz.c:807
@ TDEFL_LZ_DICT_SIZE_MASK
Definition miniz.c:807
@ TDEFL_LZ_DICT_SIZE
Definition miniz.c:807
@ TDEFL_MIN_MATCH_LEN
Definition miniz.c:807
@ TDEFL_MAX_HUFF_SYMBOLS_1
Definition miniz.c:807
@ TDEFL_MAX_HUFF_SYMBOLS_2
Definition miniz.c:807
void * mz_zip_extract_archive_file_to_heap(const char *pZip_filename, const char *pArchive_name, size_t *pSize, mz_uint zip_flags)
Definition miniz.c:4734
#define TINFL_CR_BEGIN
Definition miniz.c:1324
mz_uint mz_zip_reader_get_num_files(mz_zip_archive *pZip)
Definition miniz.c:3210
mz_bool mz_zip_writer_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint64 size_to_reserve_at_beginning)
Definition miniz.c:3906
#define MZ_WRITE_LE16(p, v)
Definition miniz.c:3821
void * tdefl_compress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
Definition miniz.c:2722
size_t(* mz_file_write_func)(void *pOpaque, mz_uint64 file_ofs, const void *pBuf, size_t n)
Definition miniz.c:500
mz_bool mz_zip_reader_init_file(mz_zip_archive *pZip, const char *pFilename, mz_uint32 flags)
Definition miniz.c:3175
int mz_deflateReset(mz_streamp pStream)
Definition miniz.c:1017
#define TINFL_GET_BYTE(state_index, c)
Definition miniz.c:1331
#define MZ_ZIP_ARRAY_SET_ELEMENT_SIZE(array_ptr, element_size)
Definition miniz.c:2864
#define MZ_FALSE
Definition miniz.c:456
#define MZ_FORCEINLINE
Definition miniz.c:934
#define MZ_FFLUSH
Definition miniz.c:2818
int mz_inflateInit(mz_streamp pStream)
Definition miniz.c:1169
int mz_inflate(mz_streamp pStream, int flush)
Definition miniz.c:1174
int mz_compress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
Definition miniz.c:1120
mz_uint32 tdefl_get_adler32(tdefl_compressor *d)
Definition miniz.c:2686
mz_bool mz_zip_reader_extract_file_to_callback(mz_zip_archive *pZip, const char *pFilename, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)
Definition miniz.c:3734
#define TDEFL_RLE_ZERO_CODE_SIZE()
Definition miniz.c:1889
mz_ulong mz_compressBound(mz_ulong source_len)
Definition miniz.c:1125
#define MZ_ASSERT(x)
Definition miniz.c:905
mz_bool mz_zip_add_mem_to_archive_file_in_place(const char *pZip_filename, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)
Definition miniz.c:4682
int mz_deflateEnd(mz_streamp pStream)
Definition miniz.c:1074
size_t tdefl_compress_mem_to_mem(void *pOut_buf, size_t out_buf_len, const void *pSrc_buf, size_t src_buf_len, int flags)
Definition miniz.c:2731
#define tinfl_init(r)
Definition miniz.c:711
@ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF
Definition miniz.c:670
@ TINFL_FLAG_HAS_MORE_INPUT
Definition miniz.c:669
@ TINFL_FLAG_COMPUTE_ADLER32
Definition miniz.c:671
@ TINFL_FLAG_PARSE_ZLIB_HEADER
Definition miniz.c:668
tinfl_status
Definition miniz.c:701
@ TINFL_STATUS_ADLER32_MISMATCH
Definition miniz.c:703
@ TINFL_STATUS_FAILED
Definition miniz.c:704
@ TINFL_STATUS_NEEDS_MORE_INPUT
Definition miniz.c:706
@ TINFL_STATUS_HAS_MORE_OUTPUT
Definition miniz.c:707
@ TINFL_STATUS_BAD_PARAM
Definition miniz.c:702
@ TINFL_STATUS_DONE
Definition miniz.c:705
mz_bool mz_zip_writer_add_from_zip_reader(mz_zip_archive *pZip, mz_zip_archive *pSource_zip, mz_uint file_index)
Definition miniz.c:4461
#define TINFL_LZ_DICT_SIZE
Definition miniz.c:697
tdefl_status tdefl_init(tdefl_compressor *d, tdefl_put_buf_func_ptr pPut_buf_func, void *pPut_buf_user, int flags)
Definition miniz.c:2662
#define MZ_CLEAR_OBJ(obj)
Definition miniz.c:919
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)
Definition miniz.c:1700
#define MZ_DEFLATED
Definition miniz.c:230
mz_bool mz_zip_reader_is_file_a_directory(mz_zip_archive *pZip, mz_uint file_index)
Definition miniz.c:3232
void * tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len, size_t *pOut_len, int flags)
Definition miniz.c:1665
unsigned int mz_uint
Definition miniz.c:451
mz_bool mz_zip_reader_extract_to_mem_no_alloc(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
Definition miniz.c:3393
unsigned char mz_validate_uint32[sizeof(mz_uint32)==4 ? 1 :-1]
Definition miniz.c:899
mz_bool mz_zip_writer_add_mem_ex(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags, mz_uint64 uncomp_size, mz_uint32 uncomp_crc32)
Definition miniz.c:4127
#define TINFL_MEMCPY(d, s, l)
Definition miniz.c:1321
#define TINFL_GET_BITS(state_index, b, n)
Definition miniz.c:1349
#define MZ_ADLER32_INIT
Definition miniz.c:218
#define MZ_CRC32_INIT
Definition miniz.c:222
int(* tinfl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser)
Definition miniz.c:691
tdefl_status tdefl_get_prev_return_status(tdefl_compressor *d)
Definition miniz.c:2681
mz_bool mz_zip_writer_init_heap(mz_zip_archive *pZip, size_t size_to_reserve_at_beginning, size_t initial_allocation_size)
Definition miniz.c:3878
#define MZ_FREAD
Definition miniz.c:2812
#define tinfl_get_adler32(r)
Definition miniz.c:712
unsigned long long mz_uint64
Definition miniz.c:453
signed short mz_int16
Definition miniz.c:448
#define TINFL_HUFF_DECODE(state_index, sym, pHuff)
Definition miniz.c:1374
mz_ulong uLong
Definition miniz.c:373
mz_bool mz_zip_reader_init_mem(mz_zip_archive *pZip, const void *pMem, size_t size, mz_uint32 flags)
Definition miniz.c:3148
mz_bool mz_zip_reader_extract_file_to_file(mz_zip_archive *pZip, const char *pArchive_filename, const char *pDst_filename, mz_uint flags)
Definition miniz.c:3806
#define MZ_FWRITE
Definition miniz.c:2813
tdefl_status tdefl_compress_buffer(tdefl_compressor *d, const void *pIn_buf, size_t in_buf_size, tdefl_flush flush)
Definition miniz.c:2657
#define MZ_DEFAULT_WINDOW_BITS
Definition miniz.c:251
mz_bool mz_zip_reader_extract_to_callback(mz_zip_archive *pZip, mz_uint file_index, mz_file_write_func pCallback, void *pOpaque, mz_uint flags)
Definition miniz.c:3577
#define MZ_TOLOWER(c)
Definition miniz.c:2824
@ MZ_FILTERED
Definition miniz.c:227
@ MZ_FIXED
Definition miniz.c:227
@ MZ_DEFAULT_STRATEGY
Definition miniz.c:227
@ MZ_RLE
Definition miniz.c:227
@ MZ_HUFFMAN_ONLY
Definition miniz.c:227
int mz_deflateInit2(mz_streamp pStream, int level, int method, int window_bits, int mem_level, int strategy)
Definition miniz.c:985
const char * mz_version(void)
Definition miniz.c:975
#define MZ_VERSION
Definition miniz.c:234
int mz_deflateInit(mz_streamp pStream, int level)
Definition miniz.c:980
#define MZ_FILE
Definition miniz.c:2809
#define MZ_FSEEK64
Definition miniz.c:2815
@ MZ_SYNC_FLUSH
Definition miniz.c:242
@ MZ_BLOCK
Definition miniz.c:242
@ MZ_FULL_FLUSH
Definition miniz.c:242
@ MZ_FINISH
Definition miniz.c:242
@ MZ_PARTIAL_FLUSH
Definition miniz.c:242
@ MZ_NO_FLUSH
Definition miniz.c:242
void * mz_zip_reader_extract_to_heap(mz_zip_archive *pZip, mz_uint file_index, size_t *pSize, mz_uint flags)
Definition miniz.c:3532
int mz_compress2(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len, int level)
Definition miniz.c:1092
mz_bool mz_zip_writer_end(mz_zip_archive *pZip)
Definition miniz.c:4649
int intf
Definition miniz.c:377
#define TINFL_MEMSET(p, c, l)
Definition miniz.c:1322
mz_bool mz_zip_writer_add_file(mz_zip_archive *pZip, const char *pArchive_name, const char *pSrc_filename, const void *pComment, mz_uint16 comment_size, mz_uint level_and_flags)
Definition miniz.c:4278
@ MZ_ZIP_CDH_FILENAME_LEN_OFS
Definition miniz.c:2835
@ MZ_ZIP_LOCAL_DIR_HEADER_SIG
Definition miniz.c:2830
@ MZ_ZIP_CDH_FILE_DATE_OFS
Definition miniz.c:2834
@ MZ_ZIP_LDH_CRC32_OFS
Definition miniz.c:2839
@ MZ_ZIP_LDH_BIT_FLAG_OFS
Definition miniz.c:2838
@ MZ_ZIP_ECDH_NUM_DISK_CDIR_OFS
Definition miniz.c:2842
@ MZ_ZIP_CDH_VERSION_NEEDED_OFS
Definition miniz.c:2833
@ MZ_ZIP_CDH_LOCAL_HEADER_OFS
Definition miniz.c:2836
@ MZ_ZIP_CDH_COMPRESSED_SIZE_OFS
Definition miniz.c:2835
@ MZ_ZIP_ECDH_CDIR_NUM_ENTRIES_ON_DISK_OFS
Definition miniz.c:2842
@ MZ_ZIP_CDH_SIG_OFS
Definition miniz.c:2833
@ MZ_ZIP_CDH_DECOMPRESSED_SIZE_OFS
Definition miniz.c:2835
@ MZ_ZIP_ECDH_CDIR_SIZE_OFS
Definition miniz.c:2843
@ MZ_ZIP_CDH_METHOD_OFS
Definition miniz.c:2834
@ MZ_ZIP_LDH_FILENAME_LEN_OFS
Definition miniz.c:2840
@ MZ_ZIP_LDH_FILE_TIME_OFS
Definition miniz.c:2838
@ MZ_ZIP_CDH_EXTRA_LEN_OFS
Definition miniz.c:2835
@ MZ_ZIP_LDH_FILE_DATE_OFS
Definition miniz.c:2839
@ MZ_ZIP_LDH_METHOD_OFS
Definition miniz.c:2838
@ MZ_ZIP_LDH_COMPRESSED_SIZE_OFS
Definition miniz.c:2839
@ MZ_ZIP_CDH_FILE_TIME_OFS
Definition miniz.c:2834
@ MZ_ZIP_ECDH_CDIR_TOTAL_ENTRIES_OFS
Definition miniz.c:2843
@ MZ_ZIP_CENTRAL_DIR_HEADER_SIG
Definition miniz.c:2830
@ MZ_ZIP_ECDH_SIG_OFS
Definition miniz.c:2842
@ MZ_ZIP_ECDH_COMMENT_SIZE_OFS
Definition miniz.c:2843
@ MZ_ZIP_LDH_SIG_OFS
Definition miniz.c:2838
@ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIG
Definition miniz.c:2830
@ MZ_ZIP_CDH_CRC32_OFS
Definition miniz.c:2834
@ MZ_ZIP_CDH_DISK_START_OFS
Definition miniz.c:2836
@ MZ_ZIP_CDH_INTERNAL_ATTR_OFS
Definition miniz.c:2836
@ MZ_ZIP_LDH_VERSION_NEEDED_OFS
Definition miniz.c:2838
@ MZ_ZIP_ECDH_CDIR_OFS_OFS
Definition miniz.c:2843
@ MZ_ZIP_LDH_EXTRA_LEN_OFS
Definition miniz.c:2840
@ MZ_ZIP_CDH_EXTERNAL_ATTR_OFS
Definition miniz.c:2836
@ MZ_ZIP_END_OF_CENTRAL_DIR_HEADER_SIZE
Definition miniz.c:2831
@ MZ_ZIP_LOCAL_DIR_HEADER_SIZE
Definition miniz.c:2831
@ MZ_ZIP_LDH_DECOMPRESSED_SIZE_OFS
Definition miniz.c:2839
@ MZ_ZIP_CDH_BIT_FLAG_OFS
Definition miniz.c:2833
@ MZ_ZIP_CDH_COMMENT_LEN_OFS
Definition miniz.c:2836
@ MZ_ZIP_CENTRAL_DIR_HEADER_SIZE
Definition miniz.c:2831
@ MZ_ZIP_CDH_VERSION_MADE_BY_OFS
Definition miniz.c:2833
@ MZ_ZIP_ECDH_NUM_THIS_DISK_OFS
Definition miniz.c:2842
uInt uIntf
Definition miniz.c:375
int mz_zip_reader_locate_file(mz_zip_archive *pZip, const char *pName, const char *pComment, mz_uint flags)
Definition miniz.c:3353
char charf
Definition miniz.c:376
unsigned int uInt
Definition miniz.c:372
size_t(* mz_file_read_func)(void *pOpaque, mz_uint64 file_ofs, void *pBuf, size_t n)
Definition miniz.c:499
int mz_bool
Definition miniz.c:454
mz_bool mz_zip_reader_is_file_encrypted(mz_zip_archive *pZip, mz_uint file_index)
Definition miniz.c:3222
mz_bool mz_zip_writer_init(mz_zip_archive *pZip, mz_uint64 existing_size)
Definition miniz.c:3824
const char * mz_error(int err)
Definition miniz.c:1306
unsigned char mz_uint8
Definition miniz.c:447
int mz_inflateInit2(mz_streamp pStream, int window_bits)
Definition miniz.c:1138
#define TINFL_CR_FINISH
Definition miniz.c:1327
mz_bool mz_zip_reader_extract_to_mem(mz_zip_archive *pZip, mz_uint file_index, void *pBuf, size_t buf_size, mz_uint flags)
Definition miniz.c:3522
#define TINFL_CR_RETURN(state_index, result)
Definition miniz.c:1325
#define TINFL_CR_RETURN_FOREVER(state_index, result)
Definition miniz.c:1326
tdefl_flush
Definition miniz.c:827
@ TDEFL_SYNC_FLUSH
Definition miniz.c:829
@ TDEFL_NO_FLUSH
Definition miniz.c:828
@ TDEFL_FULL_FLUSH
Definition miniz.c:830
@ TDEFL_FINISH
Definition miniz.c:831
int mz_uncompress(unsigned char *pDest, mz_ulong *pDest_len, const unsigned char *pSource, mz_ulong source_len)
Definition miniz.c:1277
mz_bool mz_zip_reader_init(mz_zip_archive *pZip, mz_uint64 size, mz_uint32 flags)
Definition miniz.c:3125
mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index, mz_zip_archive_file_stat *pStat)
Definition miniz.c:3254
@ TDEFL_MAX_SUPPORTED_HUFF_CODESIZE
Definition miniz.c:1821
@ MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE
Definition miniz.c:474
@ MZ_ZIP_MAX_IO_BUF_SIZE
Definition miniz.c:472
@ MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE
Definition miniz.c:473
unsigned int mz_uint32
Definition miniz.c:450
unsigned char mz_validate_uint64[sizeof(mz_uint64)==8 ? 1 :-1]
Definition miniz.c:900
int mz_inflateEnd(mz_streamp pStream)
Definition miniz.c:1265
void *(* mz_realloc_func)(void *opaque, void *address, size_t items, size_t size)
Definition miniz.c:216
mz_bool mz_zip_writer_add_mem(mz_zip_archive *pZip, const char *pArchive_name, const void *pBuf, size_t buf_size, mz_uint level_and_flags)
Definition miniz.c:4001
void * mz_zip_reader_extract_file_to_heap(mz_zip_archive *pZip, const char *pFilename, size_t *pSize, mz_uint flags)
Definition miniz.c:3566
int mz_deflate(mz_streamp pStream, int flush)
Definition miniz.c:1025
unsigned short mz_uint16
Definition miniz.c:449
@ TDEFL_MAX_HUFF_SYMBOLS
Definition miniz.c:813
@ TDEFL_LEVEL1_HASH_SIZE_MASK
Definition miniz.c:813
@ TDEFL_LZ_HASH_BITS
Definition miniz.c:813
@ TDEFL_LZ_HASH_SIZE
Definition miniz.c:813
@ TDEFL_LZ_CODE_BUF_SIZE
Definition miniz.c:813
@ TDEFL_LZ_HASH_SHIFT
Definition miniz.c:813
@ TDEFL_OUT_BUF_SIZE
Definition miniz.c:813
mz_bool mz_zip_reader_extract_file_to_mem(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags)
Definition miniz.c:3527
#define MZ_FILE_STAT_STRUCT
Definition miniz.c:2816
#define TINFL_DECOMPRESS_MEM_TO_MEM_FAILED
Definition miniz.c:686
@ TINFL_MAX_HUFF_SYMBOLS_2
Definition miniz.c:721
@ TINFL_FAST_LOOKUP_SIZE
Definition miniz.c:722
@ TINFL_MAX_HUFF_SYMBOLS_0
Definition miniz.c:721
@ TINFL_MAX_HUFF_SYMBOLS_1
Definition miniz.c:721
@ TINFL_MAX_HUFF_TABLES
Definition miniz.c:721
@ TINFL_FAST_LOOKUP_BITS
Definition miniz.c:722
#define MZ_MIN(a, b)
Definition miniz.c:918
tdefl_status
Definition miniz.c:818
@ TDEFL_STATUS_OKAY
Definition miniz.c:821
@ TDEFL_STATUS_DONE
Definition miniz.c:822
@ TDEFL_STATUS_BAD_PARAM
Definition miniz.c:819
@ TDEFL_STATUS_PUT_BUF_FAILED
Definition miniz.c:820
@ MZ_BEST_SPEED
Definition miniz.c:248
@ MZ_NO_COMPRESSION
Definition miniz.c:248
@ MZ_UBER_COMPRESSION
Definition miniz.c:248
@ MZ_DEFAULT_LEVEL
Definition miniz.c:248
@ MZ_BEST_COMPRESSION
Definition miniz.c:248
@ MZ_DEFAULT_COMPRESSION
Definition miniz.c:248
void(* mz_free_func)(void *opaque, void *address)
Definition miniz.c:215
mz_bool mz_zip_reader_extract_file_to_mem_no_alloc(mz_zip_archive *pZip, const char *pFilename, void *pBuf, size_t buf_size, mz_uint flags, void *pUser_read_buf, size_t user_read_buf_size)
Definition miniz.c:3514
@ TDEFL_DEFAULT_MAX_PROBES
Definition miniz.c:761
@ TDEFL_HUFFMAN_ONLY
Definition miniz.c:761
@ TDEFL_MAX_PROBES_MASK
Definition miniz.c:761
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)
Definition miniz.c:1693
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)
Definition miniz.c:1389
#define MZ_SWAP_UINT32(a, b)
Definition miniz.c:2990
Byte Bytef
Definition miniz.c:374
#define MZ_FREE(x)
Definition miniz.c:913
#define MZ_FCLOSE
Definition miniz.c:2811
void * voidpf
Definition miniz.c:378
mz_ulong mz_deflateBound(mz_streamp pStream, mz_ulong source_len)
Definition miniz.c:1085
mz_ulong mz_crc32(mz_ulong crc, const unsigned char *ptr, size_t buf_len)
Definition miniz.c:959
uLong uLongf
Definition miniz.c:379
mz_uint tdefl_create_comp_flags_from_zip_params(int level, int window_bits, int strategy)
Definition miniz.c:2744
#define MZ_READ_LE32(p)
Definition miniz.c:926
#define MZ_ZIP_ARRAY_ELEMENT(array_ptr, element_type, index)
Definition miniz.c:2865
mz_zip_mode
Definition miniz.c:506
@ MZ_ZIP_MODE_WRITING
Definition miniz.c:509
@ MZ_ZIP_MODE_READING
Definition miniz.c:508
@ MZ_ZIP_MODE_INVALID
Definition miniz.c:507
@ MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED
Definition miniz.c:510
mz_bool(* tdefl_put_buf_func_ptr)(const void *pBuf, int len, void *pUser)
Definition miniz.c:802
mz_bool mz_zip_writer_finalize_heap_archive(mz_zip_archive *pZip, void **pBuf, size_t *pSize)
Definition miniz.c:4633
#define MZ_FREOPEN
Definition miniz.c:2819
unsigned char mz_validate_uint16[sizeof(mz_uint16)==2 ? 1 :-1]
Definition miniz.c:898
unsigned char Byte
Definition miniz.c:371
tdefl_status tdefl_compress(tdefl_compressor *d, const void *pIn_buf, size_t *pIn_buf_size, void *pOut_buf, size_t *pOut_buf_size, tdefl_flush flush)
Definition miniz.c:2601
mz_bool mz_zip_writer_init_from_reader(mz_zip_archive *pZip, const char *pFilename)
Definition miniz.c:3943
mz_stream * mz_streamp
Definition miniz.c:278
#define MZ_MAX(a, b)
Definition miniz.c:917
#define TINFL_SKIP_BITS(state_index, n)
Definition miniz.c:1348
#define MZ_TRUE
Definition miniz.c:457
long long mz_int64
Definition miniz.c:452
void * voidp
Definition miniz.c:380
#define TDEFL_RLE_PREV_CODE_SIZE()
Definition miniz.c:1881
mz_bool mz_zip_reader_extract_to_file(mz_zip_archive *pZip, mz_uint file_index, const char *pDst_filename, mz_uint flags)
Definition miniz.c:3748
#define MZ_FTELL64
Definition miniz.c:2814
mz_uint mz_zip_reader_get_filename(mz_zip_archive *pZip, mz_uint file_index, char *pFilename, mz_uint filename_buf_size)
Definition miniz.c:3289
mz_uint32 tinfl_bit_buf_t
Definition miniz.c:739
#define TDEFL_PUT_BITS(b, l)
Definition miniz.c:1870
#define MZ_DELETE_FILE
Definition miniz.c:2820
void *const voidpc
Definition miniz.c:381
int m_window_bits
Definition miniz.c:1133
mz_uint m_dict_ofs
Definition miniz.c:1133
mz_uint m_has_flushed
Definition miniz.c:1133
mz_uint m_dict_avail
Definition miniz.c:1133
mz_uint8 m_dict[TINFL_LZ_DICT_SIZE]
Definition miniz.c:1134
mz_uint m_first_call
Definition miniz.c:1133
tinfl_status m_last_status
Definition miniz.c:1135
tinfl_decompressor m_decomp
Definition miniz.c:1132
mz_ulong adler
Definition miniz.c:274
unsigned char * next_out
Definition miniz.c:262
void * opaque
Definition miniz.c:271
int data_type
Definition miniz.c:273
mz_free_func zfree
Definition miniz.c:270
mz_ulong total_out
Definition miniz.c:264
unsigned int avail_out
Definition miniz.c:263
struct mz_internal_state * state
Definition miniz.c:267
const unsigned char * next_in
Definition miniz.c:258
unsigned int avail_in
Definition miniz.c:259
mz_alloc_func zalloc
Definition miniz.c:269
mz_ulong total_in
Definition miniz.c:260
char * msg
Definition miniz.c:266
mz_ulong reserved
Definition miniz.c:275
mz_uint32 m_external_attr
Definition miniz.c:492
mz_uint16 m_version_needed
Definition miniz.c:482
time_t m_time
Definition miniz.c:486
mz_uint16 m_version_made_by
Definition miniz.c:481
mz_uint32 m_file_index
Definition miniz.c:479
mz_uint32 m_central_dir_ofs
Definition miniz.c:480
mz_uint64 m_uncomp_size
Definition miniz.c:490
mz_uint32 m_comment_size
Definition miniz.c:494
mz_uint16 m_bit_flag
Definition miniz.c:483
mz_uint64 m_local_header_ofs
Definition miniz.c:493
mz_uint16 m_internal_attr
Definition miniz.c:491
mz_uint16 m_method
Definition miniz.c:484
mz_uint64 m_comp_size
Definition miniz.c:489
char m_filename[MZ_ZIP_MAX_ARCHIVE_FILENAME_SIZE]
Definition miniz.c:495
mz_uint32 m_crc32
Definition miniz.c:488
char m_comment[MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE]
Definition miniz.c:496
mz_uint64 m_central_directory_file_ofs
Definition miniz.c:516
mz_alloc_func m_pAlloc
Definition miniz.c:522
mz_uint m_total_files
Definition miniz.c:517
mz_zip_mode m_zip_mode
Definition miniz.c:518
mz_uint m_file_offset_alignment
Definition miniz.c:520
mz_uint64 m_archive_size
Definition miniz.c:515
void * m_pIO_opaque
Definition miniz.c:529
void * m_pAlloc_opaque
Definition miniz.c:525
mz_file_write_func m_pWrite
Definition miniz.c:528
mz_zip_internal_state * m_pState
Definition miniz.c:531
mz_free_func m_pFree
Definition miniz.c:523
mz_realloc_func m_pRealloc
Definition miniz.c:524
mz_file_read_func m_pRead
Definition miniz.c:527
size_t m_size
Definition miniz.c:2849
void * m_p
Definition miniz.c:2848
size_t m_capacity
Definition miniz.c:2849
mz_uint m_element_size
Definition miniz.c:2850
mz_zip_array m_sorted_central_dir_offsets
Definition miniz.c:2857
size_t m_mem_size
Definition miniz.c:2860
mz_zip_array m_central_dir_offsets
Definition miniz.c:2856
mz_zip_array m_central_dir
Definition miniz.c:2855
size_t m_mem_capacity
Definition miniz.c:2861
MZ_FILE * m_pFile
Definition miniz.c:2858
void * m_pMem
Definition miniz.c:2859
mz_uint64 m_cur_archive_file_ofs
Definition miniz.c:4009
mz_uint64 m_comp_size
Definition miniz.c:4010
mz_zip_archive * m_pZip
Definition miniz.c:4008
mz_uint m_max_probes[2]
Definition miniz.c:839
mz_uint m_block_index
Definition miniz.c:844
mz_uint m_saved_lit
Definition miniz.c:844
mz_uint m_saved_match_dist
Definition miniz.c:844
size_t * m_pOut_buf_size
Definition miniz.c:848
mz_uint16 m_hash[TDEFL_LZ_HASH_SIZE]
Definition miniz.c:858
const mz_uint8 * m_pSrc
Definition miniz.c:850
mz_uint16 m_huff_codes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]
Definition miniz.c:854
mz_uint m_output_flush_remaining
Definition miniz.c:844
mz_uint m_num_flags_left
Definition miniz.c:843
mz_uint m_lookahead_pos
Definition miniz.c:841
mz_uint m_wants_to_finish
Definition miniz.c:844
mz_uint m_finished
Definition miniz.c:844
mz_uint m_total_lz_bytes
Definition miniz.c:843
size_t m_src_buf_left
Definition miniz.c:851
tdefl_status m_prev_return_status
Definition miniz.c:845
mz_uint8 m_dict[TDEFL_LZ_DICT_SIZE+TDEFL_MAX_MATCH_LEN - 1]
Definition miniz.c:852
tdefl_put_buf_func_ptr m_pPut_buf_func
Definition miniz.c:837
tdefl_flush m_flush
Definition miniz.c:849
mz_uint m_output_flush_ofs
Definition miniz.c:844
size_t m_out_buf_ofs
Definition miniz.c:851
mz_uint m_bit_buffer
Definition miniz.c:843
mz_uint m_bits_in
Definition miniz.c:843
mz_uint16 m_next[TDEFL_LZ_DICT_SIZE]
Definition miniz.c:857
mz_uint8 * m_pOutput_buf_end
Definition miniz.c:842
mz_uint m_lookahead_size
Definition miniz.c:841
mz_uint8 * m_pLZ_flags
Definition miniz.c:842
mz_uint m_saved_match_len
Definition miniz.c:844
mz_uint16 m_huff_count[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]
Definition miniz.c:853
void * m_pOut_buf
Definition miniz.c:847
mz_uint m_lz_code_buf_dict_pos
Definition miniz.c:843
const void * m_pIn_buf
Definition miniz.c:846
mz_uint m_flags
Definition miniz.c:839
mz_uint8 m_lz_code_buf[TDEFL_LZ_CODE_BUF_SIZE]
Definition miniz.c:856
int m_greedy_parsing
Definition miniz.c:840
void * m_pPut_buf_user
Definition miniz.c:838
mz_uint8 * m_pLZ_code_buf
Definition miniz.c:842
mz_uint m_dict_size
Definition miniz.c:841
mz_uint8 m_huff_code_sizes[TDEFL_MAX_HUFF_TABLES][TDEFL_MAX_HUFF_SYMBOLS]
Definition miniz.c:855
size_t * m_pIn_buf_size
Definition miniz.c:848
mz_uint m_adler32
Definition miniz.c:841
mz_uint8 m_output_buf[TDEFL_OUT_BUF_SIZE]
Definition miniz.c:859
mz_uint8 * m_pOutput_buf
Definition miniz.c:842
mz_bool m_expandable
Definition miniz.c:2704
mz_uint8 * m_pBuf
Definition miniz.c:2703
size_t m_capacity
Definition miniz.c:2702
size_t m_size
Definition miniz.c:2702
mz_uint16 m_sym_index
Definition miniz.c:1782
mz_uint16 m_key
Definition miniz.c:1782
mz_uint32 m_type
Definition miniz.c:745
mz_uint32 m_final
Definition miniz.c:745
mz_uint32 m_zhdr0
Definition miniz.c:745
tinfl_bit_buf_t m_bit_buf
Definition miniz.c:746
mz_uint32 m_counter
Definition miniz.c:745
size_t m_dist_from_out_buf_start
Definition miniz.c:747
mz_uint32 m_check_adler32
Definition miniz.c:745
mz_uint32 m_state
Definition miniz.c:745
tinfl_huff_table m_tables[TINFL_MAX_HUFF_TABLES]
Definition miniz.c:748
mz_uint8 m_raw_header[4]
Definition miniz.c:749
mz_uint32 m_zhdr1
Definition miniz.c:745
mz_uint32 m_num_bits
Definition miniz.c:745
mz_uint32 m_z_adler32
Definition miniz.c:745
mz_uint32 m_table_sizes[TINFL_MAX_HUFF_TABLES]
Definition miniz.c:745
mz_uint32 m_dist
Definition miniz.c:745
mz_uint8 m_len_codes[TINFL_MAX_HUFF_SYMBOLS_0+TINFL_MAX_HUFF_SYMBOLS_1+137]
Definition miniz.c:749
mz_uint32 m_num_extra
Definition miniz.c:745
mz_int16 m_tree[TINFL_MAX_HUFF_SYMBOLS_0 *2]
Definition miniz.c:728
mz_uint8 m_code_size[TINFL_MAX_HUFF_SYMBOLS_0]
Definition miniz.c:727
mz_int16 m_look_up[TINFL_FAST_LOOKUP_SIZE]
Definition miniz.c:728