18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* uncompr.c -- decompress a memory buffer
217b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * For conditions of distribution and use, see copyright notice in zlib.h
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* @(#) $Id$ */
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ZLIB_INTERNAL
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "zlib.h"
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* ===========================================================================
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     Decompresses the source buffer into the destination buffer.  sourceLen is
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   the byte length of the source buffer. Upon entry, destLen is the total
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   size of the destination buffer, which must be large enough to hold the
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   entire uncompressed data. (The size of the uncompressed data must have
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   been saved previously by the compressor and transmitted to the decompressor
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   by some mechanism outside the scope of this compression library.)
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   Upon exit, destLen is the actual size of the compressed buffer.
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   enough memory, Z_BUF_ERROR if there was not enough room in the output
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   buffer, or Z_DATA_ERROR if the input data was corrupted.
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint ZEXPORT uncompress (dest, destLen, source, sourceLen)
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Bytef *dest;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uLongf *destLen;
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const Bytef *source;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uLong sourceLen;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    z_stream stream;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int err;
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3317b20e6f38ad2263e47a6884c4f68ce9773d8b29David 'Digit' Turner    stream.next_in = (z_const Bytef *)source;
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.avail_in = (uInt)sourceLen;
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Check for source > 64K on 16-bit machine: */
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.next_out = dest;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.avail_out = (uInt)*destLen;
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.zalloc = (alloc_func)0;
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.zfree = (free_func)0;
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflateInit(&stream);
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (err != Z_OK) return err;
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflate(&stream, Z_FINISH);
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (err != Z_STREAM_END) {
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        inflateEnd(&stream);
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return Z_DATA_ERROR;
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return err;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *destLen = stream.total_out;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflateEnd(&stream);
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return err;
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
60