diff options
Diffstat (limited to 'compat/zlib/uncompr.c')
| -rw-r--r-- | compat/zlib/uncompr.c | 93 | 
1 files changed, 93 insertions, 0 deletions
| diff --git a/compat/zlib/uncompr.c b/compat/zlib/uncompr.c new file mode 100644 index 0000000..f03a1a8 --- /dev/null +++ b/compat/zlib/uncompr.c @@ -0,0 +1,93 @@ +/* uncompr.c -- decompress a memory buffer + * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#define ZLIB_INTERNAL +#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 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. +*/ +int ZEXPORT uncompress2 (dest, destLen, source, sourceLen) +    Bytef *dest; +    uLongf *destLen; +    const Bytef *source; +    uLong *sourceLen; +{ +    z_stream stream; +    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.avail_in = 0; +    stream.zalloc = (alloc_func)0; +    stream.zfree = (free_func)0; +    stream.opaque = (voidpf)0; + +    err = inflateInit(&stream); +    if (err != Z_OK) return err; + +    stream.next_out = dest; +    stream.avail_out = 0; + +    do { +        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); +} | 
