2017-07-18 20:53:00 +00:00
/**************************************************************************
*
* Copyright 2013 - 2014 RAD Game Tools and Valve Software
* Copyright 2010 - 2014 Rich Geldreich and Tenacious Software LLC
* All Rights Reserved .
*
* Permission is hereby granted , free of charge , to any person obtaining a copy
* of this software and associated documentation files ( the " Software " ) , to deal
* in the Software without restriction , including without limitation the rights
* to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
* copies of the Software , and to permit persons to whom the Software is
* furnished to do so , subject to the following conditions :
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software .
*
* THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
* IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
* LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE .
*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2017-08-06 13:44:47 +00:00
# define MINIZ_NO_ARCHIVE_APIS
# define MINIZ_NO_ARCHIVE_WRITING_APIS
# define MINIZ_NO_STDIO
2018-04-23 06:35:34 +00:00
# include "miniz.h"
2017-07-18 20:53:00 +00:00
typedef unsigned char mz_validate_uint16 [ sizeof ( mz_uint16 ) = = 2 ? 1 : - 1 ] ;
typedef unsigned char mz_validate_uint32 [ sizeof ( mz_uint32 ) = = 4 ? 1 : - 1 ] ;
typedef unsigned char mz_validate_uint64 [ sizeof ( mz_uint64 ) = = 8 ? 1 : - 1 ] ;
# ifdef __cplusplus
extern " C " {
# endif
/* ------------------- zlib-style API's */
mz_ulong mz_adler32 ( mz_ulong adler , const unsigned char * ptr , size_t buf_len )
{
mz_uint32 i , s1 = ( mz_uint32 ) ( adler & 0xffff ) , s2 = ( mz_uint32 ) ( adler > > 16 ) ;
size_t block_len = buf_len % 5552 ;
if ( ! ptr )
return MZ_ADLER32_INIT ;
while ( buf_len )
{
for ( i = 0 ; i + 7 < block_len ; i + = 8 , ptr + = 8 )
{
s1 + = ptr [ 0 ] , s2 + = s1 ;
s1 + = ptr [ 1 ] , s2 + = s1 ;
s1 + = ptr [ 2 ] , s2 + = s1 ;
s1 + = ptr [ 3 ] , s2 + = s1 ;
s1 + = ptr [ 4 ] , s2 + = s1 ;
s1 + = ptr [ 5 ] , s2 + = s1 ;
s1 + = ptr [ 6 ] , s2 + = s1 ;
s1 + = ptr [ 7 ] , s2 + = s1 ;
}
for ( ; i < block_len ; + + i )
s1 + = * ptr + + , s2 + = s1 ;
s1 % = 65521U , s2 % = 65521U ;
buf_len - = block_len ;
block_len = 5552 ;
}
return ( s2 < < 16 ) + s1 ;
}
/* Karl Malbrain's compact CRC-32. See "A compact CCITT crc16 and crc32 C implementation that balances processor cache usage against speed": http://www.geocities.com/malbrain/ */
#if 0
mz_ulong mz_crc32 ( mz_ulong crc , const mz_uint8 * ptr , size_t buf_len )
{
static const mz_uint32 s_crc32 [ 16 ] = { 0 , 0x1db71064 , 0x3b6e20c8 , 0x26d930ac , 0x76dc4190 , 0x6b6b51f4 , 0x4db26158 , 0x5005713c ,
0xedb88320 , 0xf00f9344 , 0xd6d6a3e8 , 0xcb61b38c , 0x9b64c2b0 , 0x86d3d2d4 , 0xa00ae278 , 0xbdbdf21c } ;
mz_uint32 crcu32 = ( mz_uint32 ) crc ;
if ( ! ptr )
return MZ_CRC32_INIT ;
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 ) ] ;
}
return ~ crcu32 ;
}
# else
/* Faster, but larger CPU cache footprint.
*/
mz_ulong mz_crc32 ( mz_ulong crc , const mz_uint8 * ptr , size_t buf_len )
{
static const mz_uint32 s_crc_table [ 256 ] =
{
0x00000000 , 0x77073096 , 0xEE0E612C , 0x990951BA , 0x076DC419 , 0x706AF48F , 0xE963A535 ,
0x9E6495A3 , 0x0EDB8832 , 0x79DCB8A4 , 0xE0D5E91E , 0x97D2D988 , 0x09B64C2B , 0x7EB17CBD ,
0xE7B82D07 , 0x90BF1D91 , 0x1DB71064 , 0x6AB020F2 , 0xF3B97148 , 0x84BE41DE , 0x1ADAD47D ,
0x6DDDE4EB , 0xF4D4B551 , 0x83D385C7 , 0x136C9856 , 0x646BA8C0 , 0xFD62F97A , 0x8A65C9EC ,
0x14015C4F , 0x63066CD9 , 0xFA0F3D63 , 0x8D080DF5 , 0x3B6E20C8 , 0x4C69105E , 0xD56041E4 ,
0xA2677172 , 0x3C03E4D1 , 0x4B04D447 , 0xD20D85FD , 0xA50AB56B , 0x35B5A8FA , 0x42B2986C ,
0xDBBBC9D6 , 0xACBCF940 , 0x32D86CE3 , 0x45DF5C75 , 0xDCD60DCF , 0xABD13D59 , 0x26D930AC ,
0x51DE003A , 0xC8D75180 , 0xBFD06116 , 0x21B4F4B5 , 0x56B3C423 , 0xCFBA9599 , 0xB8BDA50F ,
0x2802B89E , 0x5F058808 , 0xC60CD9B2 , 0xB10BE924 , 0x2F6F7C87 , 0x58684C11 , 0xC1611DAB ,
0xB6662D3D , 0x76DC4190 , 0x01DB7106 , 0x98D220BC , 0xEFD5102A , 0x71B18589 , 0x06B6B51F ,
0x9FBFE4A5 , 0xE8B8D433 , 0x7807C9A2 , 0x0F00F934 , 0x9609A88E , 0xE10E9818 , 0x7F6A0DBB ,
0x086D3D2D , 0x91646C97 , 0xE6635C01 , 0x6B6B51F4 , 0x1C6C6162 , 0x856530D8 , 0xF262004E ,
0x6C0695ED , 0x1B01A57B , 0x8208F4C1 , 0xF50FC457 , 0x65B0D9C6 , 0x12B7E950 , 0x8BBEB8EA ,
0xFCB9887C , 0x62DD1DDF , 0x15DA2D49 , 0x8CD37CF3 , 0xFBD44C65 , 0x4DB26158 , 0x3AB551CE ,
0xA3BC0074 , 0xD4BB30E2 , 0x4ADFA541 , 0x3DD895D7 , 0xA4D1C46D , 0xD3D6F4FB , 0x4369E96A ,
0x346ED9FC , 0xAD678846 , 0xDA60B8D0 , 0x44042D73 , 0x33031DE5 , 0xAA0A4C5F , 0xDD0D7CC9 ,
0x5005713C , 0x270241AA , 0xBE0B1010 , 0xC90C2086 , 0x5768B525 , 0x206F85B3 , 0xB966D409 ,
0xCE61E49F , 0x5EDEF90E , 0x29D9C998 , 0xB0D09822 , 0xC7D7A8B4 , 0x59B33D17 , 0x2EB40D81 ,
0xB7BD5C3B , 0xC0BA6CAD , 0xEDB88320 , 0x9ABFB3B6 , 0x03B6E20C , 0x74B1D29A , 0xEAD54739 ,
0x9DD277AF , 0x04DB2615 , 0x73DC1683 , 0xE3630B12 , 0x94643B84 , 0x0D6D6A3E , 0x7A6A5AA8 ,
0xE40ECF0B , 0x9309FF9D , 0x0A00AE27 , 0x7D079EB1 , 0xF00F9344 , 0x8708A3D2 , 0x1E01F268 ,
0x6906C2FE , 0xF762575D , 0x806567CB , 0x196C3671 , 0x6E6B06E7 , 0xFED41B76 , 0x89D32BE0 ,
0x10DA7A5A , 0x67DD4ACC , 0xF9B9DF6F , 0x8EBEEFF9 , 0x17B7BE43 , 0x60B08ED5 , 0xD6D6A3E8 ,
0xA1D1937E , 0x38D8C2C4 , 0x4FDFF252 , 0xD1BB67F1 , 0xA6BC5767 , 0x3FB506DD , 0x48B2364B ,
0xD80D2BDA , 0xAF0A1B4C , 0x36034AF6 , 0x41047A60 , 0xDF60EFC3 , 0xA867DF55 , 0x316E8EEF ,
0x4669BE79 , 0xCB61B38C , 0xBC66831A , 0x256FD2A0 , 0x5268E236 , 0xCC0C7795 , 0xBB0B4703 ,
0x220216B9 , 0x5505262F , 0xC5BA3BBE , 0xB2BD0B28 , 0x2BB45A92 , 0x5CB36A04 , 0xC2D7FFA7 ,
0xB5D0CF31 , 0x2CD99E8B , 0x5BDEAE1D , 0x9B64C2B0 , 0xEC63F226 , 0x756AA39C , 0x026D930A ,
0x9C0906A9 , 0xEB0E363F , 0x72076785 , 0x05005713 , 0x95BF4A82 , 0xE2B87A14 , 0x7BB12BAE ,
0x0CB61B38 , 0x92D28E9B , 0xE5D5BE0D , 0x7CDCEFB7 , 0x0BDBDF21 , 0x86D3D2D4 , 0xF1D4E242 ,
0x68DDB3F8 , 0x1FDA836E , 0x81BE16CD , 0xF6B9265B , 0x6FB077E1 , 0x18B74777 , 0x88085AE6 ,
0xFF0F6A70 , 0x66063BCA , 0x11010B5C , 0x8F659EFF , 0xF862AE69 , 0x616BFFD3 , 0x166CCF45 ,
0xA00AE278 , 0xD70DD2EE , 0x4E048354 , 0x3903B3C2 , 0xA7672661 , 0xD06016F7 , 0x4969474D ,
0x3E6E77DB , 0xAED16A4A , 0xD9D65ADC , 0x40DF0B66 , 0x37D83BF0 , 0xA9BCAE53 , 0xDEBB9EC5 ,
0x47B2CF7F , 0x30B5FFE9 , 0xBDBDF21C , 0xCABAC28A , 0x53B39330 , 0x24B4A3A6 , 0xBAD03605 ,
0xCDD70693 , 0x54DE5729 , 0x23D967BF , 0xB3667A2E , 0xC4614AB8 , 0x5D681B02 , 0x2A6F2B94 ,
0xB40BBE37 , 0xC30C8EA1 , 0x5A05DF1B , 0x2D02EF8D
} ;
mz_uint32 crc32 = ( mz_uint32 ) crc ^ 0xFFFFFFFF ;
const mz_uint8 * pByte_buf = ( const mz_uint8 * ) ptr ;
while ( buf_len > = 4 )
{
crc32 = ( crc32 > > 8 ) ^ s_crc_table [ ( crc32 ^ pByte_buf [ 0 ] ) & 0xFF ] ;
crc32 = ( crc32 > > 8 ) ^ s_crc_table [ ( crc32 ^ pByte_buf [ 1 ] ) & 0xFF ] ;
crc32 = ( crc32 > > 8 ) ^ s_crc_table [ ( crc32 ^ pByte_buf [ 2 ] ) & 0xFF ] ;
crc32 = ( crc32 > > 8 ) ^ s_crc_table [ ( crc32 ^ pByte_buf [ 3 ] ) & 0xFF ] ;
pByte_buf + = 4 ;
buf_len - = 4 ;
}
while ( buf_len )
{
crc32 = ( crc32 > > 8 ) ^ s_crc_table [ ( crc32 ^ pByte_buf [ 0 ] ) & 0xFF ] ;
+ + pByte_buf ;
- - buf_len ;
}
return ~ crc32 ;
}
# endif
void mz_free ( void * p )
{
MZ_FREE ( p ) ;
}
void * miniz_def_alloc_func ( void * opaque , size_t items , size_t size )
{
( void ) opaque , ( void ) items , ( void ) size ;
return MZ_MALLOC ( items * size ) ;
}
void miniz_def_free_func ( void * opaque , void * address )
{
( void ) opaque , ( void ) address ;
MZ_FREE ( address ) ;
}
void * miniz_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 ) ;
}
const char * mz_version ( void )
{
return MZ_VERSION ;
}
# ifndef MINIZ_NO_ZLIB_APIS
int mz_deflateInit ( mz_streamp pStream , int level )
{
return mz_deflateInit2 ( pStream , level , MZ_DEFLATED , MZ_DEFAULT_WINDOW_BITS , 9 , MZ_DEFAULT_STRATEGY ) ;
}
int mz_deflateInit2 ( mz_streamp pStream , int level , int method , int window_bits , int mem_level , int strategy )
{
tdefl_compressor * pComp ;
mz_uint comp_flags = TDEFL_COMPUTE_ADLER32 | tdefl_create_comp_flags_from_zip_params ( level , window_bits , strategy ) ;
if ( ! pStream )
return MZ_STREAM_ERROR ;
if ( ( method ! = MZ_DEFLATED ) | | ( ( mem_level < 1 ) | | ( mem_level > 9 ) ) | | ( ( window_bits ! = MZ_DEFAULT_WINDOW_BITS ) & & ( - window_bits ! = MZ_DEFAULT_WINDOW_BITS ) ) )
return MZ_PARAM_ERROR ;
pStream - > data_type = 0 ;
pStream - > adler = MZ_ADLER32_INIT ;
pStream - > msg = NULL ;
pStream - > reserved = 0 ;
pStream - > total_in = 0 ;
pStream - > total_out = 0 ;
if ( ! pStream - > zalloc )
pStream - > zalloc = miniz_def_alloc_func ;
if ( ! pStream - > zfree )
pStream - > zfree = miniz_def_free_func ;
pComp = ( tdefl_compressor * ) pStream - > zalloc ( pStream - > opaque , 1 , sizeof ( tdefl_compressor ) ) ;
if ( ! pComp )
return MZ_MEM_ERROR ;
pStream - > state = ( struct mz_internal_state * ) pComp ;
if ( tdefl_init ( pComp , NULL , NULL , comp_flags ) ! = TDEFL_STATUS_OKAY )
{
mz_deflateEnd ( pStream ) ;
return MZ_PARAM_ERROR ;
}
return MZ_OK ;
}
int mz_deflateReset ( mz_streamp pStream )
{
if ( ( ! pStream ) | | ( ! pStream - > state ) | | ( ! pStream - > zalloc ) | | ( ! pStream - > zfree ) )
return MZ_STREAM_ERROR ;
pStream - > total_in = pStream - > total_out = 0 ;
tdefl_init ( ( tdefl_compressor * ) pStream - > state , NULL , NULL , ( ( tdefl_compressor * ) pStream - > state ) - > m_flags ) ;
return MZ_OK ;
}
int mz_deflate ( mz_streamp pStream , int flush )
{
size_t in_bytes , out_bytes ;
mz_ulong orig_total_in , orig_total_out ;
int mz_status = MZ_OK ;
if ( ( ! pStream ) | | ( ! pStream - > state ) | | ( flush < 0 ) | | ( flush > MZ_FINISH ) | | ( ! pStream - > next_out ) )
return MZ_STREAM_ERROR ;
if ( ! pStream - > avail_out )
return MZ_BUF_ERROR ;
if ( flush = = MZ_PARTIAL_FLUSH )
flush = MZ_SYNC_FLUSH ;
if ( ( ( tdefl_compressor * ) pStream - > state ) - > m_prev_return_status = = TDEFL_STATUS_DONE )
return ( flush = = MZ_FINISH ) ? MZ_STREAM_END : MZ_BUF_ERROR ;
orig_total_in = pStream - > total_in ;
orig_total_out = pStream - > total_out ;
for ( ; ; )
{
tdefl_status defl_status ;
in_bytes = pStream - > avail_in ;
out_bytes = pStream - > avail_out ;
defl_status = tdefl_compress ( ( tdefl_compressor * ) pStream - > state , pStream - > next_in , & in_bytes , pStream - > next_out , & out_bytes , ( tdefl_flush ) flush ) ;
pStream - > next_in + = ( mz_uint ) in_bytes ;
pStream - > avail_in - = ( mz_uint ) in_bytes ;
pStream - > total_in + = ( mz_uint ) in_bytes ;
pStream - > adler = tdefl_get_adler32 ( ( tdefl_compressor * ) pStream - > state ) ;
pStream - > next_out + = ( mz_uint ) out_bytes ;
pStream - > avail_out - = ( mz_uint ) out_bytes ;
pStream - > total_out + = ( mz_uint ) out_bytes ;
if ( defl_status < 0 )
{
mz_status = MZ_STREAM_ERROR ;
break ;
}
else if ( defl_status = = TDEFL_STATUS_DONE )
{
mz_status = MZ_STREAM_END ;
break ;
}
else if ( ! pStream - > avail_out )
break ;
else if ( ( ! pStream - > avail_in ) & & ( flush ! = MZ_FINISH ) )
{
if ( ( flush ) | | ( pStream - > total_in ! = orig_total_in ) | | ( pStream - > total_out ! = orig_total_out ) )
break ;
return MZ_BUF_ERROR ; /* Can't make forward progress without some input.
*/
}
}
return mz_status ;
}
int mz_deflateEnd ( mz_streamp pStream )
{
if ( ! pStream )
return MZ_STREAM_ERROR ;
if ( pStream - > state )
{
pStream - > zfree ( pStream - > opaque , pStream - > state ) ;
pStream - > state = NULL ;
}
return MZ_OK ;
}
mz_ulong mz_deflateBound ( mz_streamp pStream , mz_ulong source_len )
{
( void ) pStream ;
/* This is really over conservative. (And lame, but it's actually pretty tricky to compute a true upper bound given the way tdefl's blocking works.) */
return MZ_MAX ( 128 + ( source_len * 110 ) / 100 , 128 + source_len + ( ( source_len / ( 31 * 1024 ) ) + 1 ) * 5 ) ;
}
int mz_compress2 ( unsigned char * pDest , mz_ulong * pDest_len , const unsigned char * pSource , mz_ulong source_len , int level )
{
int status ;
mz_stream stream ;
memset ( & stream , 0 , sizeof ( stream ) ) ;
/* In case mz_ulong is 64-bits (argh I hate longs). */
if ( ( source_len | * pDest_len ) > 0xFFFFFFFFU )
return MZ_PARAM_ERROR ;
stream . next_in = pSource ;
stream . avail_in = ( mz_uint32 ) source_len ;
stream . next_out = pDest ;
stream . avail_out = ( mz_uint32 ) * pDest_len ;
status = mz_deflateInit ( & stream , level ) ;
if ( status ! = MZ_OK )
return status ;
status = mz_deflate ( & stream , MZ_FINISH ) ;
if ( status ! = MZ_STREAM_END )
{
mz_deflateEnd ( & stream ) ;
return ( status = = MZ_OK ) ? MZ_BUF_ERROR : status ;
}
* pDest_len = stream . total_out ;
return mz_deflateEnd ( & stream ) ;
}
int mz_compress ( unsigned char * pDest , mz_ulong * pDest_len , const unsigned char * pSource , mz_ulong source_len )
{
return mz_compress2 ( pDest , pDest_len , pSource , source_len , MZ_DEFAULT_COMPRESSION ) ;
}
mz_ulong mz_compressBound ( mz_ulong source_len )
{
return mz_deflateBound ( NULL , source_len ) ;
}
typedef struct
{
tinfl_decompressor m_decomp ;
mz_uint m_dict_ofs , m_dict_avail , m_first_call , m_has_flushed ;
int m_window_bits ;
mz_uint8 m_dict [ TINFL_LZ_DICT_SIZE ] ;
tinfl_status m_last_status ;
} inflate_state ;
int mz_inflateInit2 ( mz_streamp pStream , int window_bits )
{
inflate_state * pDecomp ;
if ( ! pStream )
return MZ_STREAM_ERROR ;
if ( ( window_bits ! = MZ_DEFAULT_WINDOW_BITS ) & & ( - window_bits ! = MZ_DEFAULT_WINDOW_BITS ) )
return MZ_PARAM_ERROR ;
pStream - > data_type = 0 ;
pStream - > adler = 0 ;
pStream - > msg = NULL ;
pStream - > total_in = 0 ;
pStream - > total_out = 0 ;
pStream - > reserved = 0 ;
if ( ! pStream - > zalloc )
pStream - > zalloc = miniz_def_alloc_func ;
if ( ! pStream - > zfree )
pStream - > zfree = miniz_def_free_func ;
pDecomp = ( inflate_state * ) pStream - > zalloc ( pStream - > opaque , 1 , sizeof ( inflate_state ) ) ;
if ( ! pDecomp )
return MZ_MEM_ERROR ;
pStream - > state = ( struct mz_internal_state * ) pDecomp ;
tinfl_init ( & pDecomp - > m_decomp ) ;
pDecomp - > m_dict_ofs = 0 ;
pDecomp - > m_dict_avail = 0 ;
pDecomp - > m_last_status = TINFL_STATUS_NEEDS_MORE_INPUT ;
pDecomp - > m_first_call = 1 ;
pDecomp - > m_has_flushed = 0 ;
pDecomp - > m_window_bits = window_bits ;
return MZ_OK ;
}
int mz_inflateInit ( mz_streamp pStream )
{
return mz_inflateInit2 ( pStream , MZ_DEFAULT_WINDOW_BITS ) ;
}
int mz_inflate ( mz_streamp pStream , int flush )
{
inflate_state * pState ;
mz_uint n , first_call , decomp_flags = TINFL_FLAG_COMPUTE_ADLER32 ;
size_t in_bytes , out_bytes , orig_avail_in ;
tinfl_status status ;
if ( ( ! pStream ) | | ( ! pStream - > state ) )
return MZ_STREAM_ERROR ;
if ( flush = = MZ_PARTIAL_FLUSH )
flush = MZ_SYNC_FLUSH ;
if ( ( flush ) & & ( flush ! = MZ_SYNC_FLUSH ) & & ( flush ! = MZ_FINISH ) )
return MZ_STREAM_ERROR ;
pState = ( inflate_state * ) pStream - > state ;
if ( pState - > m_window_bits > 0 )
decomp_flags | = TINFL_FLAG_PARSE_ZLIB_HEADER ;
orig_avail_in = pStream - > avail_in ;
first_call = pState - > m_first_call ;
pState - > m_first_call = 0 ;
if ( pState - > m_last_status < 0 )
return MZ_DATA_ERROR ;
if ( pState - > m_has_flushed & & ( flush ! = MZ_FINISH ) )
return MZ_STREAM_ERROR ;
pState - > m_has_flushed | = ( flush = = MZ_FINISH ) ;
if ( ( flush = = MZ_FINISH ) & & ( first_call ) )
{
/* MZ_FINISH on the first call implies that the input and output buffers are large enough to hold the entire compressed/decompressed file. */
decomp_flags | = TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF ;
in_bytes = pStream - > avail_in ;
out_bytes = pStream - > avail_out ;
status = tinfl_decompress ( & pState - > m_decomp , pStream - > next_in , & in_bytes , pStream - > next_out , pStream - > next_out , & out_bytes , decomp_flags ) ;
pState - > m_last_status = status ;
pStream - > next_in + = ( mz_uint ) in_bytes ;
pStream - > avail_in - = ( mz_uint ) in_bytes ;
pStream - > total_in + = ( mz_uint ) in_bytes ;
pStream - > adler = tinfl_get_adler32 ( & pState - > m_decomp ) ;
pStream - > next_out + = ( mz_uint ) out_bytes ;
pStream - > avail_out - = ( mz_uint ) out_bytes ;
pStream - > total_out + = ( mz_uint ) out_bytes ;
if ( status < 0 )
return MZ_DATA_ERROR ;
else if ( status ! = TINFL_STATUS_DONE )
{
pState - > m_last_status = TINFL_STATUS_FAILED ;
return MZ_BUF_ERROR ;
}
return MZ_STREAM_END ;
}
/* flush != MZ_FINISH then we must assume there's more input. */
if ( flush ! = MZ_FINISH )
decomp_flags | = TINFL_FLAG_HAS_MORE_INPUT ;
if ( pState - > m_dict_avail )
{
n = MZ_MIN ( pState - > m_dict_avail , pStream - > avail_out ) ;
memcpy ( pStream - > next_out , pState - > m_dict + pState - > m_dict_ofs , n ) ;
pStream - > next_out + = n ;
pStream - > avail_out - = n ;
pStream - > total_out + = n ;
pState - > m_dict_avail - = n ;
pState - > m_dict_ofs = ( pState - > m_dict_ofs + n ) & ( TINFL_LZ_DICT_SIZE - 1 ) ;
return ( ( pState - > m_last_status = = TINFL_STATUS_DONE ) & & ( ! pState - > m_dict_avail ) ) ? MZ_STREAM_END : MZ_OK ;
}
for ( ; ; )
{
in_bytes = pStream - > avail_in ;
out_bytes = TINFL_LZ_DICT_SIZE - pState - > m_dict_ofs ;
status = tinfl_decompress ( & pState - > m_decomp , pStream - > next_in , & in_bytes , pState - > m_dict , pState - > m_dict + pState - > m_dict_ofs , & out_bytes , decomp_flags ) ;
pState - > m_last_status = status ;
pStream - > next_in + = ( mz_uint ) in_bytes ;
pStream - > avail_in - = ( mz_uint ) in_bytes ;
pStream - > total_in + = ( mz_uint ) in_bytes ;
pStream - > adler = tinfl_get_adler32 ( & pState - > m_decomp ) ;
pState - > m_dict_avail = ( mz_uint ) out_bytes ;
n = MZ_MIN ( pState - > m_dict_avail , pStream - > avail_out ) ;
memcpy ( pStream - > next_out , pState - > m_dict + pState - > m_dict_ofs , n ) ;
pStream - > next_out + = n ;
pStream - > avail_out - = n ;
pStream - > total_out + = n ;
pState - > m_dict_avail - = n ;
pState - > m_dict_ofs = ( pState - > m_dict_ofs + n ) & ( TINFL_LZ_DICT_SIZE - 1 ) ;
if ( status < 0 )
return MZ_DATA_ERROR ; /* Stream is corrupted (there could be some uncompressed data left in the output dictionary - oh well). */
else if ( ( status = = TINFL_STATUS_NEEDS_MORE_INPUT ) & & ( ! orig_avail_in ) )
return MZ_BUF_ERROR ; /* Signal caller that we can't make forward progress without supplying more input or by setting flush to MZ_FINISH. */
else if ( flush = = MZ_FINISH )
{
/* The output buffer MUST be large to hold the remaining uncompressed data when flush==MZ_FINISH. */
if ( status = = TINFL_STATUS_DONE )
return pState - > m_dict_avail ? MZ_BUF_ERROR : MZ_STREAM_END ;
/* status here must be TINFL_STATUS_HAS_MORE_OUTPUT, which means there's at least 1 more byte on the way. If there's no more room left in the output buffer then something is wrong. */
else if ( ! pStream - > avail_out )
return MZ_BUF_ERROR ;
}
else if ( ( status = = TINFL_STATUS_DONE ) | | ( ! pStream - > avail_in ) | | ( ! pStream - > avail_out ) | | ( pState - > m_dict_avail ) )
break ;
}
return ( ( status = = TINFL_STATUS_DONE ) & & ( ! pState - > m_dict_avail ) ) ? MZ_STREAM_END : MZ_OK ;
}
int mz_inflateEnd ( mz_streamp pStream )
{
if ( ! pStream )
return MZ_STREAM_ERROR ;
if ( pStream - > state )
{
pStream - > zfree ( pStream - > opaque , pStream - > state ) ;
pStream - > state = NULL ;
}
return MZ_OK ;
}
int mz_uncompress ( unsigned char * pDest , mz_ulong * pDest_len , const unsigned char * pSource , mz_ulong source_len )
{
mz_stream stream ;
int status ;
memset ( & stream , 0 , sizeof ( stream ) ) ;
/* In case mz_ulong is 64-bits (argh I hate longs). */
if ( ( source_len | * pDest_len ) > 0xFFFFFFFFU )
return MZ_PARAM_ERROR ;
stream . next_in = pSource ;
stream . avail_in = ( mz_uint32 ) source_len ;
stream . next_out = pDest ;
stream . avail_out = ( mz_uint32 ) * pDest_len ;
status = mz_inflateInit ( & stream ) ;
if ( status ! = MZ_OK )
return status ;
status = mz_inflate ( & stream , MZ_FINISH ) ;
if ( status ! = MZ_STREAM_END )
{
mz_inflateEnd ( & stream ) ;
return ( ( status = = MZ_BUF_ERROR ) & & ( ! stream . avail_in ) ) ? MZ_DATA_ERROR : status ;
}
* pDest_len = stream . total_out ;
return mz_inflateEnd ( & stream ) ;
}
const char * mz_error ( int err )
{
static struct
{
int m_err ;
const char * m_pDesc ;
} s_error_descs [ ] =
{
{ MZ_OK , " " } , { MZ_STREAM_END , " stream end " } , { MZ_NEED_DICT , " need dictionary " } , { MZ_ERRNO , " file error " } , { MZ_STREAM_ERROR , " stream error " } , { MZ_DATA_ERROR , " data error " } , { MZ_MEM_ERROR , " out of memory " } , { MZ_BUF_ERROR , " buf error " } , { MZ_VERSION_ERROR , " version error " } , { MZ_PARAM_ERROR , " parameter error " }
} ;
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 ;
return NULL ;
}
# endif /*MINIZ_NO_ZLIB_APIS */
# ifdef __cplusplus
}
# endif
/*
This is free and unencumbered software released into the public domain .
Anyone is free to copy , modify , publish , use , compile , sell , or
distribute this software , either in source code form or as a compiled
binary , for any purpose , commercial or non - commercial , and by any
means .
In jurisdictions that recognize copyright laws , the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain . We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors . We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND ,
EXPRESS OR IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY , FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT .
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM , DAMAGES OR
OTHER LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE ,
ARISING FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE .
For more information , please refer to < http : //unlicense.org/>
*/