Artifact 8196f041ac1881b15614f34e3a01b232343e0a9e:
0000: 2f 2a 20 63 6f 6d 70 72 65 73 73 2e 63 20 2d 2d /* compress.c --
0010: 20 63 6f 6d 70 72 65 73 73 20 61 20 6d 65 6d 6f compress a memo
0020: 72 79 20 62 75 66 66 65 72 0a 20 2a 20 43 6f 70 ry buffer. * Cop
0030: 79 72 69 67 68 74 20 28 43 29 20 31 39 39 35 2d yright (C) 1995-
0040: 31 39 39 38 20 4a 65 61 6e 2d 6c 6f 75 70 20 47 1998 Jean-loup G
0050: 61 69 6c 6c 79 2e 0a 20 2a 20 46 6f 72 20 63 6f ailly.. * For co
0060: 6e 64 69 74 69 6f 6e 73 20 6f 66 20 64 69 73 74 nditions of dist
0070: 72 69 62 75 74 69 6f 6e 20 61 6e 64 20 75 73 65 ribution and use
0080: 2c 20 73 65 65 20 63 6f 70 79 72 69 67 68 74 20 , see copyright
0090: 6e 6f 74 69 63 65 20 69 6e 20 7a 6c 69 62 2e 68 notice in zlib.h
00a0: 20 0a 20 2a 2f 0a 0a 2f 2a 20 40 28 23 29 20 24 . */../* @(#) $
00b0: 49 64 24 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 Id$ */..#include
00c0: 20 22 7a 6c 69 62 2e 68 22 0a 23 69 66 6e 64 65 "zlib.h".#ifnde
00d0: 66 20 4b 49 5f 47 5a 5f 4e 4f 5f 43 4f 4d 50 52 f KI_GZ_NO_COMPR
00e0: 45 53 53 49 4f 4e 0d 0a 0a 2f 2a 20 3d 3d 3d 3d ESSION.../* ====
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 3d 3d 3d 3d 3d 3d ================
0120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0130: 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20 43 6f 6d =======. Com
0140: 70 72 65 73 73 65 73 20 74 68 65 20 73 6f 75 72 presses the sour
0150: 63 65 20 62 75 66 66 65 72 20 69 6e 74 6f 20 74 ce buffer into t
0160: 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 62 he destination b
0170: 75 66 66 65 72 2e 20 54 68 65 20 6c 65 76 65 6c uffer. The level
0180: 0a 20 20 20 70 61 72 61 6d 65 74 65 72 20 68 61 . parameter ha
0190: 73 20 74 68 65 20 73 61 6d 65 20 6d 65 61 6e 69 s the same meani
01a0: 6e 67 20 61 73 20 69 6e 20 64 65 66 6c 61 74 65 ng as in deflate
01b0: 49 6e 69 74 2e 20 20 73 6f 75 72 63 65 4c 65 6e Init. sourceLen
01c0: 20 69 73 20 74 68 65 20 62 79 74 65 0a 20 20 20 is the byte.
01d0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 6f length of the so
01e0: 75 72 63 65 20 62 75 66 66 65 72 2e 20 55 70 6f urce buffer. Upo
01f0: 6e 20 65 6e 74 72 79 2c 20 64 65 73 74 4c 65 6e n entry, destLen
0200: 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 73 69 is the total si
0210: 7a 65 20 6f 66 20 74 68 65 0a 20 20 20 64 65 73 ze of the. des
0220: 74 69 6e 61 74 69 6f 6e 20 62 75 66 66 65 72 2c tination buffer,
0230: 20 77 68 69 63 68 20 6d 75 73 74 20 62 65 20 61 which must be a
0240: 74 20 6c 65 61 73 74 20 30 2e 31 25 20 6c 61 72 t least 0.1% lar
0250: 67 65 72 20 74 68 61 6e 20 73 6f 75 72 63 65 4c ger than sourceL
0260: 65 6e 20 70 6c 75 73 0a 20 20 20 31 32 20 62 79 en plus. 12 by
0270: 74 65 73 2e 20 55 70 6f 6e 20 65 78 69 74 2c 20 tes. Upon exit,
0280: 64 65 73 74 4c 65 6e 20 69 73 20 74 68 65 20 61 destLen is the a
0290: 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 ctual size of th
02a0: 65 20 63 6f 6d 70 72 65 73 73 65 64 20 62 75 66 e compressed buf
02b0: 66 65 72 2e 0a 0a 20 20 20 20 20 63 6f 6d 70 72 fer... compr
02c0: 65 73 73 32 20 72 65 74 75 72 6e 73 20 5a 5f 4f ess2 returns Z_O
02d0: 4b 20 69 66 20 73 75 63 63 65 73 73 2c 20 5a 5f K if success, Z_
02e0: 4d 45 4d 5f 45 52 52 4f 52 20 69 66 20 74 68 65 MEM_ERROR if the
02f0: 72 65 20 77 61 73 20 6e 6f 74 20 65 6e 6f 75 67 re was not enoug
0300: 68 0a 20 20 20 6d 65 6d 6f 72 79 2c 20 5a 5f 42 h. memory, Z_B
0310: 55 46 5f 45 52 52 4f 52 20 69 66 20 74 68 65 72 UF_ERROR if ther
0320: 65 20 77 61 73 20 6e 6f 74 20 65 6e 6f 75 67 68 e was not enough
0330: 20 72 6f 6f 6d 20 69 6e 20 74 68 65 20 6f 75 74 room in the out
0340: 70 75 74 20 62 75 66 66 65 72 2c 0a 20 20 20 5a put buffer,. Z
0350: 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52 20 69 66 _STREAM_ERROR if
0360: 20 74 68 65 20 6c 65 76 65 6c 20 70 61 72 61 6d the level param
0370: 65 74 65 72 20 69 73 20 69 6e 76 61 6c 69 64 2e eter is invalid.
0380: 0a 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f 52 54 20 .*/.int ZEXPORT
0390: 63 6f 6d 70 72 65 73 73 32 20 28 64 65 73 74 2c compress2 (dest,
03a0: 20 64 65 73 74 4c 65 6e 2c 20 73 6f 75 72 63 65 destLen, source
03b0: 2c 20 73 6f 75 72 63 65 4c 65 6e 2c 20 6c 65 76 , sourceLen, lev
03c0: 65 6c 29 0a 20 20 20 20 42 79 74 65 66 20 2a 64 el). Bytef *d
03d0: 65 73 74 3b 0a 20 20 20 20 75 4c 6f 6e 67 66 20 est;. uLongf
03e0: 2a 64 65 73 74 4c 65 6e 3b 0a 20 20 20 20 63 6f *destLen;. co
03f0: 6e 73 74 20 42 79 74 65 66 20 2a 73 6f 75 72 63 nst Bytef *sourc
0400: 65 3b 0a 20 20 20 20 75 4c 6f 6e 67 20 73 6f 75 e;. uLong sou
0410: 72 63 65 4c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 rceLen;. int
0420: 6c 65 76 65 6c 3b 0a 7b 0a 20 20 20 20 7a 5f 73 level;.{. z_s
0430: 74 72 65 61 6d 20 73 74 72 65 61 6d 3b 0a 20 20 tream stream;.
0440: 20 20 69 6e 74 20 65 72 72 3b 0a 0a 20 20 20 20 int err;..
0450: 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 3d stream.next_in =
0460: 20 28 42 79 74 65 66 2a 29 73 6f 75 72 63 65 3b (Bytef*)source;
0470: 0a 20 20 20 20 73 74 72 65 61 6d 2e 61 76 61 69 . stream.avai
0480: 6c 5f 69 6e 20 3d 20 28 75 49 6e 74 29 73 6f 75 l_in = (uInt)sou
0490: 72 63 65 4c 65 6e 3b 0a 23 69 66 64 65 66 20 4d rceLen;.#ifdef M
04a0: 41 58 53 45 47 5f 36 34 4b 0a 20 20 20 20 2f 2a AXSEG_64K. /*
04b0: 20 43 68 65 63 6b 20 66 6f 72 20 73 6f 75 72 63 Check for sourc
04c0: 65 20 3e 20 36 34 4b 20 6f 6e 20 31 36 2d 62 69 e > 64K on 16-bi
04d0: 74 20 6d 61 63 68 69 6e 65 3a 20 2a 2f 0a 20 20 t machine: */.
04e0: 20 20 69 66 20 28 28 75 4c 6f 6e 67 29 73 74 72 if ((uLong)str
04f0: 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 21 3d 20 eam.avail_in !=
0500: 73 6f 75 72 63 65 4c 65 6e 29 20 72 65 74 75 72 sourceLen) retur
0510: 6e 20 5a 5f 42 55 46 5f 45 52 52 4f 52 3b 0a 23 n Z_BUF_ERROR;.#
0520: 65 6e 64 69 66 0a 20 20 20 20 73 74 72 65 61 6d endif. stream
0530: 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 64 65 73 74 .next_out = dest
0540: 3b 0a 20 20 20 20 73 74 72 65 61 6d 2e 61 76 61 ;. stream.ava
0550: 69 6c 5f 6f 75 74 20 3d 20 28 75 49 6e 74 29 2a il_out = (uInt)*
0560: 64 65 73 74 4c 65 6e 3b 0a 20 20 20 20 69 66 20 destLen;. if
0570: 28 28 75 4c 6f 6e 67 29 73 74 72 65 61 6d 2e 61 ((uLong)stream.a
0580: 76 61 69 6c 5f 6f 75 74 20 21 3d 20 2a 64 65 73 vail_out != *des
0590: 74 4c 65 6e 29 20 72 65 74 75 72 6e 20 5a 5f 42 tLen) return Z_B
05a0: 55 46 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20 73 UF_ERROR;.. s
05b0: 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 28 tream.zalloc = (
05c0: 61 6c 6c 6f 63 5f 66 75 6e 63 29 30 3b 0a 20 20 alloc_func)0;.
05d0: 20 20 73 74 72 65 61 6d 2e 7a 66 72 65 65 20 3d stream.zfree =
05e0: 20 28 66 72 65 65 5f 66 75 6e 63 29 30 3b 0a 20 (free_func)0;.
05f0: 20 20 20 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 stream.opaque
0600: 20 3d 20 28 76 6f 69 64 70 66 29 30 3b 0a 0a 20 = (voidpf)0;..
0610: 20 20 20 65 72 72 20 3d 20 64 65 66 6c 61 74 65 err = deflate
0620: 49 6e 69 74 28 26 73 74 72 65 61 6d 2c 20 6c 65 Init(&stream, le
0630: 76 65 6c 29 3b 0a 20 20 20 20 69 66 20 28 65 72 vel);. if (er
0640: 72 20 21 3d 20 5a 5f 4f 4b 29 20 72 65 74 75 72 r != Z_OK) retur
0650: 6e 20 65 72 72 3b 0a 0a 20 20 20 20 65 72 72 20 n err;.. err
0660: 3d 20 64 65 66 6c 61 74 65 28 26 73 74 72 65 61 = deflate(&strea
0670: 6d 2c 20 5a 5f 46 49 4e 49 53 48 29 3b 0a 20 20 m, Z_FINISH);.
0680: 20 20 69 66 20 28 65 72 72 20 21 3d 20 5a 5f 53 if (err != Z_S
0690: 54 52 45 41 4d 5f 45 4e 44 29 20 7b 0a 20 20 20 TREAM_END) {.
06a0: 20 20 20 20 20 64 65 66 6c 61 74 65 45 6e 64 28 deflateEnd(
06b0: 26 73 74 72 65 61 6d 29 3b 0a 20 20 20 20 20 20 &stream);.
06c0: 20 20 72 65 74 75 72 6e 20 65 72 72 20 3d 3d 20 return err ==
06d0: 5a 5f 4f 4b 20 3f 20 5a 5f 42 55 46 5f 45 52 52 Z_OK ? Z_BUF_ERR
06e0: 4f 52 20 3a 20 65 72 72 3b 0a 20 20 20 20 7d 0a OR : err;. }.
06f0: 20 20 20 20 2a 64 65 73 74 4c 65 6e 20 3d 20 73 *destLen = s
0700: 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 3b tream.total_out;
0710: 0a 0a 20 20 20 20 65 72 72 20 3d 20 64 65 66 6c .. err = defl
0720: 61 74 65 45 6e 64 28 26 73 74 72 65 61 6d 29 3b ateEnd(&stream);
0730: 0a 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b . return err;
0740: 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d .}../* =========
0750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0790: 3d 3d 0a 20 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f ==. */.int ZEXPO
07a0: 52 54 20 63 6f 6d 70 72 65 73 73 20 28 64 65 73 RT compress (des
07b0: 74 2c 20 64 65 73 74 4c 65 6e 2c 20 73 6f 75 72 t, destLen, sour
07c0: 63 65 2c 20 73 6f 75 72 63 65 4c 65 6e 29 0a 20 ce, sourceLen).
07d0: 20 20 20 42 79 74 65 66 20 2a 64 65 73 74 3b 0a Bytef *dest;.
07e0: 20 20 20 20 75 4c 6f 6e 67 66 20 2a 64 65 73 74 uLongf *dest
07f0: 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 42 Len;. const B
0800: 79 74 65 66 20 2a 73 6f 75 72 63 65 3b 0a 20 20 ytef *source;.
0810: 20 20 75 4c 6f 6e 67 20 73 6f 75 72 63 65 4c 65 uLong sourceLe
0820: 6e 3b 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 n;.{. return
0830: 63 6f 6d 70 72 65 73 73 32 28 64 65 73 74 2c 20 compress2(dest,
0840: 64 65 73 74 4c 65 6e 2c 20 73 6f 75 72 63 65 2c destLen, source,
0850: 20 73 6f 75 72 63 65 4c 65 6e 2c 20 5a 5f 44 45 sourceLen, Z_DE
0860: 46 41 55 4c 54 5f 43 4f 4d 50 52 45 53 53 49 4f FAULT_COMPRESSIO
0870: 4e 29 3b 0a 7d 0a 0d 0a 23 65 6e 64 69 66 20 2f N);.}...#endif /
0880: 2a 20 4b 49 5f 47 5a 5f 4e 4f 5f 43 4f 4d 50 52 * KI_GZ_NO_COMPR
0890: 45 53 53 49 4f 4e 20 2a 2f 0d 0a ESSION */..