Hex Artifact Content

Not logged in

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;.}.