uncompr.c (muscle7.61) | : | uncompr.c (muscle7.62) | ||
---|---|---|---|---|
/* uncompr.c -- decompress a memory buffer | /* uncompr.c -- decompress a memory buffer | |||
* Copyright (C) 1995-2003, 2010 Jean-loup Gailly. | * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler | |||
* For conditions of distribution and use, see copyright notice in zlib.h | * For conditions of distribution and use, see copyright notice in zlib.h | |||
*/ | */ | |||
/* @(#) $Id$ */ | /* @(#) $Id$ */ | |||
#define ZLIB_INTERNAL | #define ZLIB_INTERNAL | |||
#include "zlib.h" | #include "zlib.h" | |||
/* =========================================================================== | /* =========================================================================== | |||
Decompresses the source buffer into the destination buffer. sourceLen is | Decompresses the source buffer into the destination buffer. *sourceLen is | |||
the byte length of the source buffer. Upon entry, destLen is the total | the byte length of the source buffer. Upon entry, *destLen is the total size | |||
size of the destination buffer, which must be large enough to hold the | of the destination buffer, which must be large enough to hold the entire | |||
entire uncompressed data. (The size of the uncompressed data must have | uncompressed data. (The size of the uncompressed data must have been saved | |||
been saved previously by the compressor and transmitted to the decompressor | previously by the compressor and transmitted to the decompressor by some | |||
by some mechanism outside the scope of this compression library.) | mechanism outside the scope of this compression library.) Upon exit, | |||
Upon exit, destLen is the actual size of the compressed buffer. | *destLen is the size of the decompressed data and *sourceLen is the number | |||
of source bytes consumed. Upon return, source + *sourceLen points to the | ||||
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not | first unused input byte. | |||
enough memory, Z_BUF_ERROR if there was not enough room in the output | ||||
buffer, or Z_DATA_ERROR if the input data was corrupted. | uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough | |||
memory, Z_BUF_ERROR if there was not enough room in the output buffer, or | ||||
Z_DATA_ERROR if the input data was corrupted, including if the input data is | ||||
an incomplete zlib stream. | ||||
*/ | */ | |||
int ZEXPORT uncompress (dest, destLen, source, sourceLen) | int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) | |||
Bytef *dest; | Bytef *dest; | |||
uLongf *destLen; | uLongf *destLen; | |||
const Bytef *source; | const Bytef *source; | |||
uLong sourceLen; | uLong *sourceLen; | |||
{ | { | |||
z_stream stream; | z_stream stream; | |||
int err; | int err; | |||
const uInt max = (uInt)-1; | ||||
uLong len, left; | ||||
Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */ | ||||
len = *sourceLen; | ||||
if (*destLen) { | ||||
left = *destLen; | ||||
*destLen = 0; | ||||
} | ||||
else { | ||||
left = 1; | ||||
dest = buf; | ||||
} | ||||
stream.next_in = (z_const Bytef *)source; | stream.next_in = (z_const Bytef *)source; | |||
stream.avail_in = (uInt)sourceLen; | stream.avail_in = 0; | |||
/* Check for source > 64K on 16-bit machine: */ | ||||
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; | ||||
stream.next_out = dest; | ||||
stream.avail_out = (uInt)*destLen; | ||||
if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; | ||||
stream.zalloc = (alloc_func)0; | stream.zalloc = (alloc_func)0; | |||
stream.zfree = (free_func)0; | stream.zfree = (free_func)0; | |||
stream.opaque = (voidpf)0; | ||||
err = inflateInit(&stream); | err = inflateInit(&stream); | |||
if (err != Z_OK) return err; | if (err != Z_OK) return err; | |||
err = inflate(&stream, Z_FINISH); | stream.next_out = dest; | |||
if (err != Z_STREAM_END) { | stream.avail_out = 0; | |||
inflateEnd(&stream); | ||||
if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) | ||||
return Z_DATA_ERROR; | ||||
return err; | ||||
} | ||||
*destLen = stream.total_out; | ||||
err = inflateEnd(&stream); | do { | |||
return err; | if (stream.avail_out == 0) { | |||
stream.avail_out = left > (uLong)max ? max : (uInt)left; | ||||
left -= stream.avail_out; | ||||
} | ||||
if (stream.avail_in == 0) { | ||||
stream.avail_in = len > (uLong)max ? max : (uInt)len; | ||||
len -= stream.avail_in; | ||||
} | ||||
err = inflate(&stream, Z_NO_FLUSH); | ||||
} while (err == Z_OK); | ||||
*sourceLen -= len + stream.avail_in; | ||||
if (dest != buf) | ||||
*destLen = stream.total_out; | ||||
else if (stream.total_out && err == Z_BUF_ERROR) | ||||
left = 1; | ||||
inflateEnd(&stream); | ||||
return err == Z_STREAM_END ? Z_OK : | ||||
err == Z_NEED_DICT ? Z_DATA_ERROR : | ||||
err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR : | ||||
err; | ||||
} | ||||
int ZEXPORT uncompress (dest, destLen, source, sourceLen) | ||||
Bytef *dest; | ||||
uLongf *destLen; | ||||
const Bytef *source; | ||||
uLong sourceLen; | ||||
{ | ||||
return uncompress2(dest, destLen, source, &sourceLen); | ||||
} | } | |||
End of changes. 9 change blocks. | ||||
32 lines changed or deleted | 66 lines changed or added |