usbloadergx/source/unzip/inflate.c

70 lines
1.8 KiB
C
Raw Normal View History

#include "inflate.h"
#define CHUNK 1024
int inflateFile( FILE *source, FILE *dest )
{
int ret;
unsigned have;
z_stream strm;
unsigned char in[CHUNK];
unsigned char out[CHUNK];
/* allocate inflate state */
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.avail_in = 0;
strm.next_in = Z_NULL;
ret = inflateInit( &strm );
if ( ret != Z_OK )
return ret;
/* decompress until deflate stream ends or end of file */
do
{
strm.avail_in = fread( in, 1, CHUNK, source );
if ( ferror( source ) )
{
( void )inflateEnd( &strm );
return Z_ERRNO;
}
if ( strm.avail_in == 0 )
break;
strm.next_in = in;
/* run inflate() on input until output buffer not full */
do
{
strm.avail_out = CHUNK;
strm.next_out = out;
ret = inflate( &strm, Z_NO_FLUSH );
switch ( ret )
{
case Z_NEED_DICT:
( void )inflateEnd( &strm );
return -20;
case Z_DATA_ERROR:
( void )inflateEnd( &strm );
return -21;
case Z_MEM_ERROR:
( void )inflateEnd( &strm );
return -22;
}
have = CHUNK - strm.avail_out;
if ( fwrite( out, 1, have, dest ) != have || ferror( dest ) )
{
( void )inflateEnd( &strm );
return Z_ERRNO;
}
}
while ( strm.avail_out == 0 );
/* done when inflate() says it's done */
}
while ( ret != Z_STREAM_END );
/* clean up and return */
( void )inflateEnd( &strm );
return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}