Blame zlib-src/uncompr.c

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