summaryrefslogtreecommitdiff
path: root/uncompr.c
diff options
context:
space:
mode:
authorMark Adler <madler@alumni.caltech.edu>2016-11-15 20:45:01 -0700
committerHans Kristian Rosbach <hk-git@circlestorm.org>2017-02-02 11:44:34 +0100
commitffdc43fea177372ee05ef93cfcce66c9d2654bfb (patch)
tree1737ef9b12a7bf38cd0100a6e44f75f339aef3dd /uncompr.c
parent95950df8eea185f8eea0493b6099ccdcfe2f0d0b (diff)
Add uncompress2() function, which returns the input size used.
Diffstat (limited to 'uncompr.c')
-rw-r--r--uncompr.c41
1 files changed, 25 insertions, 16 deletions
diff --git a/uncompr.c b/uncompr.c
index 50e0d86..834ffc9 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,26 +9,29 @@
#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(unsigned char *dest, size_t *destLen, const unsigned char *source, size_t sourceLen) {
+int ZEXPORT uncompress2(unsigned char *dest, size_t *destLen, const unsigned char *source, size_t *sourceLen) {
z_stream stream;
int err;
const unsigned int max = (unsigned int)0 - 1;
- size_t left;
+ size_t len, left;
unsigned char buf[1]; /* for detection of incomplete stream when *destLen == 0 */
+ len = *sourceLen;
if (*destLen) {
left = *destLen;
*destLen = 0;
@@ -56,12 +59,13 @@ int ZEXPORT uncompress(unsigned char *dest, size_t *destLen, const unsigned char
left -= stream.avail_out;
}
if (stream.avail_in == 0) {
- stream.avail_in = sourceLen > (unsigned long)max ? max : (unsigned int)sourceLen;
- sourceLen -= stream.avail_in;
+ stream.avail_in = len > (unsigned long)max ? max : (unsigned int)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)
@@ -73,3 +77,8 @@ int ZEXPORT uncompress(unsigned char *dest, size_t *destLen, const unsigned char
err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
err;
}
+
+int ZEXPORT uncompress(unsigned char *dest, size_t *destLen, const unsigned char *source, size_t sourceLen)
+{
+ return uncompress2(dest, destLen, source, &sourceLen);
+}