19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* uncompr.c -- decompress a memory buffer
2381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* @(#) $Id$ */
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#define ZLIB_INTERNAL
99e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project#include "zlib.h"
109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/* ===========================================================================
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     Decompresses the source buffer into the destination buffer.  sourceLen is
139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   the byte length of the source buffer. Upon entry, destLen is the total
149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   size of the destination buffer, which must be large enough to hold the
159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   entire uncompressed data. (The size of the uncompressed data must have
169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   been saved previously by the compressor and transmitted to the decompressor
179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   by some mechanism outside the scope of this compression library.)
189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   Upon exit, destLen is the actual size of the compressed buffer.
199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   enough memory, Z_BUF_ERROR if there was not enough room in the output
229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project   buffer, or Z_DATA_ERROR if the input data was corrupted.
239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project*/
249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectint ZEXPORT uncompress (dest, destLen, source, sourceLen)
259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    Bytef *dest;
269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLongf *destLen;
279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    const Bytef *source;
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    uLong sourceLen;
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project{
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    z_stream stream;
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    int err;
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3304351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughes    stream.next_in = (z_const Bytef *)source;
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    stream.avail_in = (uInt)sourceLen;
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /* Check for source > 64K on 16-bit machine: */
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    stream.next_out = dest;
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    stream.avail_out = (uInt)*destLen;
409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    stream.zalloc = (alloc_func)0;
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    stream.zfree = (free_func)0;
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateInit(&stream);
469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_OK) return err;
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflate(&stream, Z_FINISH);
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    if (err != Z_STREAM_END) {
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        inflateEnd(&stream);
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            return Z_DATA_ERROR;
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return err;
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    *destLen = stream.total_out;
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    err = inflateEnd(&stream);
589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    return err;
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project}
60