uncompr.c revision 8b23a6c7e1aee255004dd19098d4c2462b61b849
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* uncompr.c -- decompress a memory buffer
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (C) 1995-2003 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     This function can be used to decompress a whole file at once if the
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   input file is mmap'ed.
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   enough memory, Z_BUF_ERROR if there was not enough room in the output
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project   buffer, or Z_DATA_ERROR if the input data was corrupted.
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint ZEXPORT uncompress (dest, destLen, source, sourceLen)
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Bytef *dest;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uLongf *destLen;
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const Bytef *source;
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uLong sourceLen;
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    z_stream stream;
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int err;
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.next_in = (Bytef*)source;
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.avail_in = (uInt)sourceLen;
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* Check for source > 64K on 16-bit machine: */
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.next_out = dest;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.avail_out = (uInt)*destLen;
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.zalloc = (alloc_func)0;
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    stream.zfree = (free_func)0;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflateInit(&stream);
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (err != Z_OK) return err;
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflate(&stream, Z_FINISH);
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (err != Z_STREAM_END) {
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        inflateEnd(&stream);
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return Z_DATA_ERROR;
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return err;
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    *destLen = stream.total_out;
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    err = inflateEnd(&stream);
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return err;
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
62