14,8 → 14,6 |
|
#include "inf.h" |
|
#define CHUNK 16384 |
|
/* Decompress from file source to file dest until stream ends or EOF. |
* inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be allocated |
* for processing, Z_DATA_ERROR if the deflate data is invalid or incomplete, |
22,12 → 20,10 |
* Z_VERSION_ERROR if the version of zlib.h and the version of the library |
* linked do not match, or Z_ERRNO if there is an error reading or writing the |
* files. */ |
int inf(FILE *source, FILE *dest, unsigned char *buff32K, unsigned long *cksum, long streamlen) { |
int inf(FILE *source, FILE *dest, unsigned char *buffin, unsigned short buffinsz, unsigned char *buffout, unsigned short buffoutsz, unsigned long *cksum, long streamlen) { |
int ret; |
unsigned int have; |
z_stream strm; |
unsigned char *in = buff32K; |
unsigned char *out = buff32K + CHUNK; |
|
/* allocate inflate state */ |
strm.zalloc = Z_NULL; |
40,7 → 36,7 |
|
/* decompress until deflate stream ends or end of file */ |
do { |
strm.avail_in = fread(in, 1, (streamlen > CHUNK ? CHUNK : streamlen), source); |
strm.avail_in = fread(buffin, 1, (streamlen > buffinsz ? buffinsz : streamlen), source); |
if (ferror(source)) { |
(void)inflateEnd(&strm); |
return(Z_ERRNO); |
47,12 → 43,12 |
} |
streamlen -= strm.avail_in; |
if (strm.avail_in == 0) break; |
strm.next_in = in; |
strm.next_in = buffin; |
|
/* run inflate() on input until output buffer not full */ |
do { |
strm.avail_out = CHUNK; |
strm.next_out = out; |
strm.avail_out = buffoutsz; |
strm.next_out = buffout; |
ret = inflate(&strm, Z_NO_FLUSH); |
switch (ret) { |
case Z_NEED_DICT: |
62,13 → 58,13 |
(void)inflateEnd(&strm); |
return(ret); |
} |
have = CHUNK - strm.avail_out; |
if ((fwrite(out, 1, have, dest) != have) || (ferror(dest))) { |
have = buffoutsz - strm.avail_out; |
if ((fwrite(buffout, 1, have, dest) != have) || (ferror(dest))) { |
(void)inflateEnd(&strm); |
return(Z_ERRNO); |
} |
/* feed the CRC32 */ |
crc32_feed(cksum, out, have); |
crc32_feed(cksum, buffout, have); |
} while (strm.avail_out == 0); |
|
/* done when inflate() says it's done */ |