1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* uncompr.c -- decompress a memory buffer
2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov * For conditions of distribution and use, see copyright notice in zlib.h
4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov */
5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* @(#) $Id$ */
7ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define ZLIB_INTERNAL
9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#include "zlib.h"
10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ===========================================================================
12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     Decompresses the source buffer into the destination buffer.  sourceLen is
13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   the byte length of the source buffer. Upon entry, destLen is the total
14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   size of the destination buffer, which must be large enough to hold the
15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   entire uncompressed data. (The size of the uncompressed data must have
16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   been saved previously by the compressor and transmitted to the decompressor
17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   by some mechanism outside the scope of this compression library.)
18ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   Upon exit, destLen is the actual size of the compressed buffer.
19ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
20ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
21ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   enough memory, Z_BUF_ERROR if there was not enough room in the output
22ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov   buffer, or Z_DATA_ERROR if the input data was corrupted.
23ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov*/
24ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganovint ZEXPORT uncompress (
25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    Bytef *dest,
26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    uLongf *destLen,
27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    const Bytef *source,
28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    uLong sourceLen)
29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov{
30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    z_stream stream;
31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    int err;
32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.next_in = (z_const Bytef *)source;
34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.avail_in = (uInt)sourceLen;
35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    /* Check for source > 64K on 16-bit machine: */
36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.next_out = dest;
39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.avail_out = (uInt)*destLen;
40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.zalloc = (alloc_func)0;
43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    stream.zfree = (free_func)0;
44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    err = inflateInit(&stream);
46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (err != Z_OK) return err;
47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    err = inflate(&stream, Z_FINISH);
49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    if (err != Z_STREAM_END) {
50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        inflateEnd(&stream);
51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))
52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov            return Z_DATA_ERROR;
53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov        return err;
54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    }
55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    *destLen = stream.total_out;
56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov
57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    err = inflateEnd(&stream);
58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov    return err;
59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov}
60