summaryrefslogtreecommitdiff
path: root/uncompr.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2016-11-15 20:45:01 -0700
committerMark Adler <madler@alumni.caltech.edu>2016-12-04 07:48:47 -0800
commit37281ac222ee7ceb8cc3253f13c8fa26a88dd566 (patch)
tree0ac0add0b56a769f7714e3a2af5a8b0210803f75 /uncompr.c
parent001300d0d91f75f03eed5ec97eca160452f62d61 (diff)
downloadzlib-37281ac222ee7ceb8cc3253f13c8fa26a88dd566.tar.gz
Add uncompress2() function, which returns the input size used.
Diffstat (limited to 'uncompr.c')
-rw-r--r--uncompr.c47
1 files changed, 30 insertions, 17 deletions
diff --git a/uncompr.c b/uncompr.c
index f3f883a..2fbfcc0 100644
--- a/uncompr.c
+++ b/uncompr.c
@@ -1,5 +1,5 @@
/* uncompr.c -- decompress a memory buffer
- * Copyright (C) 1995-2003, 2010, 2014 Jean-loup Gailly, Mark Adler
+ * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
@@ -9,31 +9,34 @@
#include "zlib.h"
/* ===========================================================================
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
+ Decompresses the source buffer into the destination buffer. *sourceLen is
+ the byte length of the source buffer. Upon entry, *destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit,
+ *destLen is the size of the decompressed data and *sourceLen is the number
+ of source bytes consumed. Upon return, source + *sourceLen points to the
+ first unused input byte.
- 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.
+ 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;
uLongf *destLen;
const Bytef *source;
- uLong sourceLen;
+ uLong *sourceLen;
{
z_stream stream;
int err;
const uInt max = (uInt)0 - 1;
- uLong left;
+ uLong len, left;
Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
+ len = *sourceLen;
if (*destLen) {
left = *destLen;
*destLen = 0;
@@ -61,12 +64,13 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
left -= stream.avail_out;
}
if (stream.avail_in == 0) {
- stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
- sourceLen -= stream.avail_in;
+ 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)
@@ -78,3 +82,12 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
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);
+}