Artifact 6977e5c6f5954d97a9ad531a99386dc41dc2c863:
0000: 2f 2a 20 75 6e 63 6f 6d 70 72 2e 63 20 2d 2d 20 /* uncompr.c --
0010: 64 65 63 6f 6d 70 72 65 73 73 20 61 20 6d 65 6d decompress a mem
0020: 6f 72 79 20 62 75 66 66 65 72 0a 20 2a 20 43 6f ory buffer. * Co
0030: 70 79 72 69 67 68 74 20 28 43 29 20 31 39 39 35 pyright (C) 1995
0040: 2d 31 39 39 38 20 4a 65 61 6e 2d 6c 6f 75 70 20 -1998 Jean-loup
0050: 47 61 69 6c 6c 79 2e 0a 20 2a 20 46 6f 72 20 63 Gailly.. * For c
0060: 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 64 69 73 onditions of dis
0070: 74 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 tribution and us
0080: 65 2c 20 73 65 65 20 63 6f 70 79 72 69 67 68 74 e, see copyright
0090: 20 6e 6f 74 69 63 65 20 69 6e 20 7a 6c 69 62 2e notice in zlib.
00a0: 68 20 0a 20 2a 2f 0a 0a 2f 2a 20 40 28 23 29 20 h . */../* @(#)
00b0: 24 49 64 24 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 $Id$ */..#includ
00c0: 65 20 22 7a 6c 69 62 2e 68 22 0a 0a 2f 2a 20 3d e "zlib.h"../* =
00d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
00e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
00f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20 ==========.
0120: 44 65 63 6f 6d 70 72 65 73 73 65 73 20 74 68 65 Decompresses the
0130: 20 73 6f 75 72 63 65 20 62 75 66 66 65 72 20 69 source buffer i
0140: 6e 74 6f 20 74 68 65 20 64 65 73 74 69 6e 61 74 nto the destinat
0150: 69 6f 6e 20 62 75 66 66 65 72 2e 20 20 73 6f 75 ion buffer. sou
0160: 72 63 65 4c 65 6e 20 69 73 0a 20 20 20 74 68 65 rceLen is. the
0170: 20 62 79 74 65 20 6c 65 6e 67 74 68 20 6f 66 20 byte length of
0180: 74 68 65 20 73 6f 75 72 63 65 20 62 75 66 66 65 the source buffe
0190: 72 2e 20 55 70 6f 6e 20 65 6e 74 72 79 2c 20 64 r. Upon entry, d
01a0: 65 73 74 4c 65 6e 20 69 73 20 74 68 65 20 74 6f estLen is the to
01b0: 74 61 6c 0a 20 20 20 73 69 7a 65 20 6f 66 20 74 tal. size of t
01c0: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 62 he destination b
01d0: 75 66 66 65 72 2c 20 77 68 69 63 68 20 6d 75 73 uffer, which mus
01e0: 74 20 62 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 t be large enoug
01f0: 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 20 20 h to hold the.
0200: 20 65 6e 74 69 72 65 20 75 6e 63 6f 6d 70 72 65 entire uncompre
0210: 73 73 65 64 20 64 61 74 61 2e 20 28 54 68 65 20 ssed data. (The
0220: 73 69 7a 65 20 6f 66 20 74 68 65 20 75 6e 63 6f size of the unco
0230: 6d 70 72 65 73 73 65 64 20 64 61 74 61 20 6d 75 mpressed data mu
0240: 73 74 20 68 61 76 65 0a 20 20 20 62 65 65 6e 20 st have. been
0250: 73 61 76 65 64 20 70 72 65 76 69 6f 75 73 6c 79 saved previously
0260: 20 62 79 20 74 68 65 20 63 6f 6d 70 72 65 73 73 by the compress
0270: 6f 72 20 61 6e 64 20 74 72 61 6e 73 6d 69 74 74 or and transmitt
0280: 65 64 20 74 6f 20 74 68 65 20 64 65 63 6f 6d 70 ed to the decomp
0290: 72 65 73 73 6f 72 0a 20 20 20 62 79 20 73 6f 6d ressor. by som
02a0: 65 20 6d 65 63 68 61 6e 69 73 6d 20 6f 75 74 73 e mechanism outs
02b0: 69 64 65 20 74 68 65 20 73 63 6f 70 65 20 6f 66 ide the scope of
02c0: 20 74 68 69 73 20 63 6f 6d 70 72 65 73 73 69 6f this compressio
02d0: 6e 20 6c 69 62 72 61 72 79 2e 29 0a 20 20 20 55 n library.). U
02e0: 70 6f 6e 20 65 78 69 74 2c 20 64 65 73 74 4c 65 pon exit, destLe
02f0: 6e 20 69 73 20 74 68 65 20 61 63 74 75 61 6c 20 n is the actual
0300: 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 size of the comp
0310: 72 65 73 73 65 64 20 62 75 66 66 65 72 2e 0a 20 ressed buffer..
0320: 20 20 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f This functio
0330: 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f n can be used to
0340: 20 64 65 63 6f 6d 70 72 65 73 73 20 61 20 77 68 decompress a wh
0350: 6f 6c 65 20 66 69 6c 65 20 61 74 20 6f 6e 63 65 ole file at once
0360: 20 69 66 20 74 68 65 0a 20 20 20 69 6e 70 75 74 if the. input
0370: 20 66 69 6c 65 20 69 73 20 6d 6d 61 70 27 65 64 file is mmap'ed
0380: 2e 0a 0a 20 20 20 20 20 75 6e 63 6f 6d 70 72 65 ... uncompre
0390: 73 73 20 72 65 74 75 72 6e 73 20 5a 5f 4f 4b 20 ss returns Z_OK
03a0: 69 66 20 73 75 63 63 65 73 73 2c 20 5a 5f 4d 45 if success, Z_ME
03b0: 4d 5f 45 52 52 4f 52 20 69 66 20 74 68 65 72 65 M_ERROR if there
03c0: 20 77 61 73 20 6e 6f 74 0a 20 20 20 65 6e 6f 75 was not. enou
03d0: 67 68 20 6d 65 6d 6f 72 79 2c 20 5a 5f 42 55 46 gh memory, Z_BUF
03e0: 5f 45 52 52 4f 52 20 69 66 20 74 68 65 72 65 20 _ERROR if there
03f0: 77 61 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 72 was not enough r
0400: 6f 6f 6d 20 69 6e 20 74 68 65 20 6f 75 74 70 75 oom in the outpu
0410: 74 0a 20 20 20 62 75 66 66 65 72 2c 20 6f 72 20 t. buffer, or
0420: 5a 5f 44 41 54 41 5f 45 52 52 4f 52 20 69 66 20 Z_DATA_ERROR if
0430: 74 68 65 20 69 6e 70 75 74 20 64 61 74 61 20 77 the input data w
0440: 61 73 20 63 6f 72 72 75 70 74 65 64 2e 0a 2a 2f as corrupted..*/
0450: 0a 69 6e 74 20 5a 45 58 50 4f 52 54 20 75 6e 63 .int ZEXPORT unc
0460: 6f 6d 70 72 65 73 73 20 28 64 65 73 74 2c 20 64 ompress (dest, d
0470: 65 73 74 4c 65 6e 2c 20 73 6f 75 72 63 65 2c 20 estLen, source,
0480: 73 6f 75 72 63 65 4c 65 6e 29 0a 20 20 20 20 42 sourceLen). B
0490: 79 74 65 66 20 2a 64 65 73 74 3b 0a 20 20 20 20 ytef *dest;.
04a0: 75 4c 6f 6e 67 66 20 2a 64 65 73 74 4c 65 6e 3b uLongf *destLen;
04b0: 0a 20 20 20 20 63 6f 6e 73 74 20 42 79 74 65 66 . const Bytef
04c0: 20 2a 73 6f 75 72 63 65 3b 0a 20 20 20 20 75 4c *source;. uL
04d0: 6f 6e 67 20 73 6f 75 72 63 65 4c 65 6e 3b 0a 7b ong sourceLen;.{
04e0: 0a 20 20 20 20 7a 5f 73 74 72 65 61 6d 20 73 74 . z_stream st
04f0: 72 65 61 6d 3b 0a 20 20 20 20 69 6e 74 20 65 72 ream;. int er
0500: 72 3b 0a 0a 20 20 20 20 73 74 72 65 61 6d 2e 6e r;.. stream.n
0510: 65 78 74 5f 69 6e 20 3d 20 28 42 79 74 65 66 2a ext_in = (Bytef*
0520: 29 73 6f 75 72 63 65 3b 0a 20 20 20 20 73 74 72 )source;. str
0530: 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 28 eam.avail_in = (
0540: 75 49 6e 74 29 73 6f 75 72 63 65 4c 65 6e 3b 0a uInt)sourceLen;.
0550: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 /* Check for
0560: 20 73 6f 75 72 63 65 20 3e 20 36 34 4b 20 6f 6e source > 64K on
0570: 20 31 36 2d 62 69 74 20 6d 61 63 68 69 6e 65 3a 16-bit machine:
0580: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 75 4c 6f */. if ((uLo
0590: 6e 67 29 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f ng)stream.avail_
05a0: 69 6e 20 21 3d 20 73 6f 75 72 63 65 4c 65 6e 29 in != sourceLen)
05b0: 20 72 65 74 75 72 6e 20 5a 5f 42 55 46 5f 45 52 return Z_BUF_ER
05c0: 52 4f 52 3b 0a 0a 20 20 20 20 73 74 72 65 61 6d ROR;.. stream
05d0: 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 64 65 73 74 .next_out = dest
05e0: 3b 0a 20 20 20 20 73 74 72 65 61 6d 2e 61 76 61 ;. stream.ava
05f0: 69 6c 5f 6f 75 74 20 3d 20 28 75 49 6e 74 29 2a il_out = (uInt)*
0600: 64 65 73 74 4c 65 6e 3b 0a 20 20 20 20 69 66 20 destLen;. if
0610: 28 28 75 4c 6f 6e 67 29 73 74 72 65 61 6d 2e 61 ((uLong)stream.a
0620: 76 61 69 6c 5f 6f 75 74 20 21 3d 20 2a 64 65 73 vail_out != *des
0630: 74 4c 65 6e 29 20 72 65 74 75 72 6e 20 5a 5f 42 tLen) return Z_B
0640: 55 46 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 73 UF_ERROR;.. s
0650: 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 28 tream.zalloc = (
0660: 61 6c 6c 6f 63 5f 66 75 6e 63 29 30 3b 0a 20 20 alloc_func)0;.
0670: 20 20 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d stream.zfree =
0680: 20 28 66 72 65 65 5f 66 75 6e 63 29 30 3b 0a 0a (free_func)0;..
0690: 20 20 20 20 65 72 72 20 3d 20 69 6e 66 6c 61 74 err = inflat
06a0: 65 49 6e 69 74 28 26 73 74 72 65 61 6d 29 3b 0a eInit(&stream);.
06b0: 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20 5a if (err != Z
06c0: 5f 4f 4b 29 20 72 65 74 75 72 6e 20 65 72 72 3b _OK) return err;
06d0: 0a 0a 20 20 20 20 65 72 72 20 3d 20 69 6e 66 6c .. err = infl
06e0: 61 74 65 28 26 73 74 72 65 61 6d 2c 20 5a 5f 46 ate(&stream, Z_F
06f0: 49 4e 49 53 48 29 3b 0a 20 20 20 20 69 66 20 28 INISH);. if (
0700: 65 72 72 20 21 3d 20 5a 5f 53 54 52 45 41 4d 5f err != Z_STREAM_
0710: 45 4e 44 29 20 7b 0a 20 20 20 20 20 20 20 20 69 END) {. i
0720: 6e 66 6c 61 74 65 45 6e 64 28 26 73 74 72 65 61 nflateEnd(&strea
0730: 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 m);. retu
0740: 72 6e 20 65 72 72 20 3d 3d 20 5a 5f 4f 4b 20 3f rn err == Z_OK ?
0750: 20 5a 5f 42 55 46 5f 45 52 52 4f 52 20 3a 20 65 Z_BUF_ERROR : e
0760: 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 64 rr;. }. *d
0770: 65 73 74 4c 65 6e 20 3d 20 73 74 72 65 61 6d 2e estLen = stream.
0780: 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 20 20 20 20 total_out;..
0790: 65 72 72 20 3d 20 69 6e 66 6c 61 74 65 45 6e 64 err = inflateEnd
07a0: 28 26 73 74 72 65 61 6d 29 3b 0a 20 20 20 20 72 (&stream);. r
07b0: 65 74 75 72 6e 20 65 72 72 3b 0a 7d 0a eturn err;.}.