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