117651Speter/* uncompr.c -- decompress a memory buffer 2205471Sdelphij * Copyright (C) 1995-2003, 2010 Jean-loup Gailly. 3131380Stjr * For conditions of distribution and use, see copyright notice in zlib.h 417651Speter */ 517651Speter 6146081Skientzle/* @(#) $Id$ */ 717651Speter 8131380Stjr#define ZLIB_INTERNAL 917651Speter#include "zlib.h" 1017651Speter 1117651Speter/* =========================================================================== 1217651Speter Decompresses the source buffer into the destination buffer. sourceLen is 1317651Speter the byte length of the source buffer. Upon entry, destLen is the total 1417651Speter size of the destination buffer, which must be large enough to hold the 1517651Speter entire uncompressed data. (The size of the uncompressed data must have 1617651Speter been saved previously by the compressor and transmitted to the decompressor 1717651Speter by some mechanism outside the scope of this compression library.) 1817651Speter Upon exit, destLen is the actual size of the compressed buffer. 1917651Speter 2017651Speter uncompress returns Z_OK if success, Z_MEM_ERROR if there was not 2117651Speter enough memory, Z_BUF_ERROR if there was not enough room in the output 2217651Speter buffer, or Z_DATA_ERROR if the input data was corrupted. 2317651Speter*/ 2433908Ssteveint ZEXPORT uncompress (dest, destLen, source, sourceLen) 2517651Speter Bytef *dest; 2617651Speter uLongf *destLen; 2717651Speter const Bytef *source; 2817651Speter uLong sourceLen; 2917651Speter{ 3017651Speter z_stream stream; 3117651Speter int err; 3217651Speter 33250261Sdelphij stream.next_in = (z_const Bytef *)source; 3417651Speter stream.avail_in = (uInt)sourceLen; 3517651Speter /* Check for source > 64K on 16-bit machine: */ 3617651Speter if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR; 3717651Speter 3817651Speter stream.next_out = dest; 3917651Speter stream.avail_out = (uInt)*destLen; 4017651Speter if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR; 4117651Speter 4217651Speter stream.zalloc = (alloc_func)0; 4317651Speter stream.zfree = (free_func)0; 4417651Speter 4517651Speter err = inflateInit(&stream); 4617651Speter if (err != Z_OK) return err; 4717651Speter 4817651Speter err = inflate(&stream, Z_FINISH); 4917651Speter if (err != Z_STREAM_END) { 5017651Speter inflateEnd(&stream); 51131380Stjr if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0)) 52131380Stjr return Z_DATA_ERROR; 53131380Stjr return err; 5417651Speter } 5517651Speter *destLen = stream.total_out; 5617651Speter 5717651Speter err = inflateEnd(&stream); 5817651Speter return err; 5917651Speter} 60