Hex Artifact Content

Not logged in

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 */..