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