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