xref: /nrf52832-nimble/rt-thread/components/dfs/filesystems/jffs2/cyg/compress/src/uncompr.c (revision 104654410c56c573564690304ae786df310c91fc)
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