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