Hex Artifact Content

Artifact d3ecfd237b5fef7bc0176d787453c9dfd068e16e:


0000: 2f 2a 20 57 72 69 74 74 65 6e 20 62 79 20 4a 65  /* Written by Je
0010: 61 6e 2d 43 6c 61 75 64 65 20 57 69 70 70 6c 65  an-Claude Wipple
0020: 72 2c 20 61 73 20 70 61 72 74 20 6f 66 20 54 63  r, as part of Tc
0030: 6c 6b 69 74 2e 0a 20 2a 20 4d 61 72 63 68 20 32  lkit.. * March 2
0040: 30 30 33 20 2d 20 70 6c 61 63 65 64 20 69 6e 20  003 - placed in 
0050: 74 68 65 20 70 75 62 6c 69 63 20 64 6f 6d 61 69  the public domai
0060: 6e 20 62 79 20 74 68 65 20 61 75 74 68 6f 72 2e  n by the author.
0070: 0a 20 2a 0a 20 2a 20 49 6e 74 65 72 66 61 63 65  . *. * Interface
0080: 20 74 6f 20 74 68 65 20 22 7a 6c 69 62 22 20 63   to the "zlib" c
0090: 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 69 62 72 61  ompression libra
00a0: 72 79 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ry. */..#include
00b0: 20 3c 74 63 6c 2e 68 3e 0a 23 69 66 20 31 30 20   <tcl.h>.#if 10 
00c0: 2a 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  * TCL_MAJOR_VERS
00d0: 49 4f 4e 20 2b 20 54 43 4c 5f 4d 49 4e 4f 52 5f  ION + TCL_MINOR_
00e0: 56 45 52 53 49 4f 4e 20 3c 20 38 36 0a 23 69 6e  VERSION < 86.#in
00f0: 63 6c 75 64 65 20 22 7a 6c 69 62 2e 68 22 0a 0a  clude "zlib.h"..
0100: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 7b  typedef struct {
0110: 0a 20 20 7a 5f 73 74 72 65 61 6d 20 73 74 72 65  .  z_stream stre
0120: 61 6d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 69  am;.  Tcl_Obj *i
0130: 6e 64 61 74 61 3b 0a 7d 20 7a 6c 69 62 73 74 72  ndata;.} zlibstr
0140: 65 61 6d 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  eam;..static int
0150: 0a 7a 73 74 72 65 61 6d 69 6e 63 6d 64 28 43 6c  .zstreamincmd(Cl
0160: 69 65 6e 74 44 61 74 61 20 63 64 2c 20 54 63 6c  ientData cd, Tcl
0170: 5f 49 6e 74 65 72 70 20 2a 69 70 2c 20 69 6e 74  _Interp *ip, int
0180: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
0190: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 29 0a 7b 0a  CONST objv[]).{.
01a0: 20 20 7a 6c 69 62 73 74 72 65 61 6d 20 2a 7a 70    zlibstream *zp
01b0: 20 3d 20 28 7a 6c 69 62 73 74 72 65 61 6d 2a 29   = (zlibstream*)
01c0: 20 63 64 3b 0a 20 20 69 6e 74 20 63 6f 75 6e 74   cd;.  int count
01d0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 2c 20 69   = 0;.  int e, i
01e0: 6e 64 65 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  ndex;.  Tcl_Obj 
01f0: 2a 6f 62 6a 3b 0a 0a 20 20 73 74 61 74 69 63 20  *obj;..  static 
0200: 43 4f 4e 53 54 38 34 20 63 68 61 72 2a 20 63 6d  CONST84 char* cm
0210: 64 73 5b 5d 20 3d 20 7b 20 22 66 69 6c 6c 22 2c  ds[] = { "fill",
0220: 20 22 64 72 61 69 6e 22 2c 20 4e 55 4c 4c 2c 20   "drain", NULL, 
0230: 7d 3b 0a 0a 20 20 69 66 20 28 54 63 6c 5f 47 65  };..  if (Tcl_Ge
0240: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 70  tIndexFromObj(ip
0250: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6d 64 73 2c  , objv[1], cmds,
0260: 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 69   "option", 0, &i
0270: 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ndex) != TCL_OK)
0280: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0290: 45 52 52 4f 52 3b 0a 0a 20 20 73 77 69 74 63 68  ERROR;..  switch
02a0: 20 28 69 6e 64 65 78 29 20 7b 0a 0a 20 20 20 20   (index) {..    
02b0: 63 61 73 65 20 30 3a 20 2f 2a 20 66 69 6c 6c 20  case 0: /* fill 
02c0: 3f 64 61 74 61 3f 20 2a 2f 0a 20 20 20 20 20 20  ?data? */.      
02d0: 69 66 20 28 6f 62 6a 63 20 3e 3d 20 33 29 20 7b  if (objc >= 3) {
02e0: 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ..Tcl_IncrRefCou
02f0: 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 09 54 63  nt(objv[2]);..Tc
0300: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 7a  l_DecrRefCount(z
0310: 70 2d 3e 69 6e 64 61 74 61 29 3b 0a 09 7a 70 2d  p->indata);..zp-
0320: 3e 69 6e 64 61 74 61 20 3d 20 6f 62 6a 76 5b 32  >indata = objv[2
0330: 5d 3b 0a 09 7a 70 2d 3e 73 74 72 65 61 6d 2e 6e  ];..zp->stream.n
0340: 65 78 74 5f 69 6e 20 3d 20 54 63 6c 5f 47 65 74  ext_in = Tcl_Get
0350: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
0360: 28 7a 70 2d 3e 69 6e 64 61 74 61 2c 0a 09 09 09  (zp->indata,....
0370: 09 09 09 20 20 28 69 6e 74 2a 29 20 26 7a 70 2d  ...  (int*) &zp-
0380: 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e  >stream.avail_in
0390: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
03a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
03b0: 74 28 69 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  t(ip, Tcl_NewInt
03c0: 4f 62 6a 28 7a 70 2d 3e 73 74 72 65 61 6d 2e 61  Obj(zp->stream.a
03d0: 76 61 69 6c 5f 69 6e 29 29 3b 0a 20 20 20 20 20  vail_in));.     
03e0: 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73   break;..    cas
03f0: 65 20 31 3a 20 2f 2a 20 64 72 61 69 6e 20 63 6f  e 1: /* drain co
0400: 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 20  unt */.      if 
0410: 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 54  (objc != 3) {..T
0420: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
0430: 69 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 63 6f  ip, 2, objv, "co
0440: 75 6e 74 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  unt");..return T
0450: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
0460: 7d 0a 20 20 20 20 20 20 69 66 20 28 54 63 6c 5f  }.      if (Tcl_
0470: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 70  GetIntFromObj(ip
0480: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 75 6e  , objv[2], &coun
0490: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 0a 09 72  t) != TCL_OK)..r
04a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
04b0: 0a 20 20 20 20 20 20 6f 62 6a 20 3d 20 54 63 6c  .      obj = Tcl
04c0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 70  _GetObjResult(ip
04d0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
04e0: 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28  ByteArrayLength(
04f0: 6f 62 6a 2c 20 63 6f 75 6e 74 29 3b 0a 20 20 20  obj, count);.   
0500: 20 20 20 7a 70 2d 3e 73 74 72 65 61 6d 2e 6e 65     zp->stream.ne
0510: 78 74 5f 6f 75 74 20 3d 20 54 63 6c 5f 47 65 74  xt_out = Tcl_Get
0520: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
0530: 28 6f 62 6a 2c 0a 09 09 09 09 09 09 20 20 28 69  (obj,.......  (i
0540: 6e 74 2a 29 20 26 7a 70 2d 3e 73 74 72 65 61 6d  nt*) &zp->stream
0550: 2e 61 76 61 69 6c 5f 6f 75 74 29 3b 0a 20 20 20  .avail_out);.   
0560: 20 20 20 65 20 3d 20 69 6e 66 6c 61 74 65 28 26     e = inflate(&
0570: 7a 70 2d 3e 73 74 72 65 61 6d 2c 20 5a 5f 4e 4f  zp->stream, Z_NO
0580: 5f 46 4c 55 53 48 29 3b 0a 20 20 20 20 20 20 69  _FLUSH);.      i
0590: 66 20 28 65 20 21 3d 20 30 20 26 26 20 65 20 21  f (e != 0 && e !
05a0: 3d 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 29 20  = Z_STREAM_END) 
05b0: 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  {..Tcl_SetResult
05c0: 28 69 70 2c 20 28 63 68 61 72 2a 29 20 7a 45 72  (ip, (char*) zEr
05d0: 72 6f 72 28 65 29 2c 20 54 43 4c 5f 53 54 41 54  ror(e), TCL_STAT
05e0: 49 43 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  IC);..return TCL
05f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
0600: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 42 79 74        Tcl_SetByt
0610: 65 41 72 72 61 79 4c 65 6e 67 74 68 28 6f 62 6a  eArrayLength(obj
0620: 2c 20 63 6f 75 6e 74 20 2d 20 7a 70 2d 3e 73 74  , count - zp->st
0630: 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 29 3b  ream.avail_out);
0640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0650: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0660: 4b 3b 0a 7d 0a 0a 76 6f 69 64 20 7a 73 74 72 65  K;.}..void zstre
0670: 61 6d 64 65 6c 70 72 6f 63 28 43 6c 69 65 6e 74  amdelproc(Client
0680: 44 61 74 61 20 63 64 29 0a 7b 0a 20 20 7a 6c 69  Data cd).{.  zli
0690: 62 73 74 72 65 61 6d 20 2a 7a 70 20 3d 20 28 7a  bstream *zp = (z
06a0: 6c 69 62 73 74 72 65 61 6d 2a 29 20 63 64 3b 0a  libstream*) cd;.
06b0: 20 20 69 6e 66 6c 61 74 65 45 6e 64 28 26 7a 70    inflateEnd(&zp
06c0: 2d 3e 73 74 72 65 61 6d 29 3b 0a 20 20 54 63 6c  ->stream);.  Tcl
06d0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 7a 70  _DecrRefCount(zp
06e0: 2d 3e 69 6e 64 61 74 61 29 3b 0a 20 20 54 63 6c  ->indata);.  Tcl
06f0: 5f 46 72 65 65 28 28 76 6f 69 64 2a 29 20 7a 70  _Free((void*) zp
0700: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
0710: 0a 5a 6c 69 62 43 6d 64 28 43 6c 69 65 6e 74 44  .ZlibCmd(ClientD
0720: 61 74 61 20 64 75 6d 6d 79 2c 20 54 63 6c 5f 49  ata dummy, Tcl_I
0730: 6e 74 65 72 70 20 2a 69 70 2c 20 69 6e 74 20 6f  nterp *ip, int o
0740: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  bjc, Tcl_Obj *CO
0750: 4e 53 54 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  NST objv[]).{.  
0760: 69 6e 74 20 65 20 3d 20 54 43 4c 5f 4f 4b 2c 20  int e = TCL_OK, 
0770: 69 6e 64 65 78 2c 20 64 6c 65 6e 2c 20 77 62 69  index, dlen, wbi
0780: 74 73 20 3d 20 2d 4d 41 58 5f 57 42 49 54 53 3b  ts = -MAX_WBITS;
0790: 0a 20 20 6c 6f 6e 67 20 66 6c 61 67 3b 0a 20 20  .  long flag;.  
07a0: 42 79 74 65 20 2a 64 61 74 61 3b 0a 20 20 7a 5f  Byte *data;.  z_
07b0: 73 74 72 65 61 6d 20 73 74 72 65 61 6d 3b 0a 20  stream stream;. 
07c0: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 20 3d 20   Tcl_Obj *obj = 
07d0: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
07e0: 28 69 70 29 3b 0a 0a 20 20 73 74 61 74 69 63 20  (ip);..  static 
07f0: 43 4f 4e 53 54 38 34 20 63 68 61 72 2a 20 63 6d  CONST84 char* cm
0800: 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 61 64  ds[] = {.    "ad
0810: 6c 65 72 33 32 22 2c 20 22 63 72 63 33 32 22 2c  ler32", "crc32",
0820: 20 22 63 6f 6d 70 72 65 73 73 22 2c 20 22 64 65   "compress", "de
0830: 66 6c 61 74 65 22 2c 20 22 64 65 63 6f 6d 70 72  flate", "decompr
0840: 65 73 73 22 2c 20 22 69 6e 66 6c 61 74 65 22 2c  ess", "inflate",
0850: 20 0a 20 20 20 20 22 73 64 65 63 6f 6d 70 72 65   .    "sdecompre
0860: 73 73 22 2c 20 22 73 69 6e 66 6c 61 74 65 22 2c  ss", "sinflate",
0870: 20 4e 55 4c 4c 2c 0a 20 20 7d 3b 0a 0a 20 20 69   NULL,.  };..  i
0880: 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f  f (objc < 3 || o
0890: 62 6a 63 20 3e 20 34 29 20 7b 0a 20 20 20 20 54  bjc > 4) {.    T
08a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
08b0: 69 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6f 70  ip, 1, objv, "op
08c0: 74 69 6f 6e 20 64 61 74 61 20 3f 2e 2e 2e 3f 22  tion data ?...?"
08d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
08e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
08f0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
0900: 46 72 6f 6d 4f 62 6a 28 69 70 2c 20 6f 62 6a 76  FromObj(ip, objv
0910: 5b 31 5d 2c 20 63 6d 64 73 2c 20 22 6f 70 74 69  [1], cmds, "opti
0920: 6f 6e 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20  on", 0, &index) 
0930: 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 20 20 20  != TCL_OK ||.   
0940: 20 20 20 6f 62 6a 63 20 3e 20 33 20 26 26 20 54     objc > 3 && T
0950: 63 6c 5f 47 65 74 4c 6f 6e 67 46 72 6f 6d 4f 62  cl_GetLongFromOb
0960: 6a 28 69 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  j(ip, objv[3], &
0970: 66 6c 61 67 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  flag) != TCL_OK)
0980: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
0990: 45 52 52 4f 52 3b 0a 0a 20 20 64 61 74 61 20 3d  ERROR;..  data =
09a0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
09b0: 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
09c0: 2c 20 26 64 6c 65 6e 29 3b 0a 0a 20 20 73 77 69  , &dlen);..  swi
09d0: 74 63 68 20 28 69 6e 64 65 78 29 20 7b 0a 0a 20  tch (index) {.. 
09e0: 20 20 20 63 61 73 65 20 30 3a 20 2f 2a 20 61 64     case 0: /* ad
09f0: 6c 65 72 33 32 20 73 74 72 20 3f 73 74 61 72 74  ler32 str ?start
0a00: 3f 20 2d 3e 20 63 68 65 63 6b 73 75 6d 20 2a 2f  ? -> checksum */
0a10: 0a 20 20 20 20 20 20 69 66 20 28 6f 62 6a 63 20  .      if (objc 
0a20: 3c 20 34 29 0a 09 66 6c 61 67 20 3d 20 28 6c 6f  < 4)..flag = (lo
0a30: 6e 67 29 20 61 64 6c 65 72 33 32 28 30 2c 20 30  ng) adler32(0, 0
0a40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  , 0);.      Tcl_
0a50: 53 65 74 4c 6f 6e 67 4f 62 6a 28 6f 62 6a 2c 20  SetLongObj(obj, 
0a60: 28 6c 6f 6e 67 29 20 61 64 6c 65 72 33 32 28 28  (long) adler32((
0a70: 75 4c 6f 6e 67 29 20 66 6c 61 67 2c 20 64 61 74  uLong) flag, dat
0a80: 61 2c 20 64 6c 65 6e 29 29 3b 0a 20 20 20 20 20  a, dlen));.     
0a90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0aa0: 0a 20 20 20 20 63 61 73 65 20 31 3a 20 2f 2a 20  .    case 1: /* 
0ab0: 63 72 63 33 32 20 73 74 72 20 3f 73 74 61 72 74  crc32 str ?start
0ac0: 3f 20 2d 3e 20 63 68 65 63 6b 73 75 6d 20 2a 2f  ? -> checksum */
0ad0: 0a 20 20 20 20 20 20 69 66 20 28 6f 62 6a 63 20  .      if (objc 
0ae0: 3c 20 34 29 0a 09 66 6c 61 67 20 3d 20 28 6c 6f  < 4)..flag = (lo
0af0: 6e 67 29 20 63 72 63 33 32 28 30 2c 20 30 2c 20  ng) crc32(0, 0, 
0b00: 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  0);.      Tcl_Se
0b10: 74 4c 6f 6e 67 4f 62 6a 28 6f 62 6a 2c 20 28 6c  tLongObj(obj, (l
0b20: 6f 6e 67 29 20 63 72 63 33 32 28 28 75 4c 6f 6e  ong) crc32((uLon
0b30: 67 29 20 66 6c 61 67 2c 20 64 61 74 61 2c 20 64  g) flag, data, d
0b40: 6c 65 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  len));.      ret
0b50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
0b60: 20 20 0a 20 20 20 20 63 61 73 65 20 32 3a 20 2f    .    case 2: /
0b70: 2a 20 63 6f 6d 70 72 65 73 73 20 64 61 74 61 20  * compress data 
0b80: 3f 6c 65 76 65 6c 3f 20 2d 3e 20 64 61 74 61 20  ?level? -> data 
0b90: 2a 2f 0a 20 20 20 20 20 20 77 62 69 74 73 20 3d  */.      wbits =
0ba0: 20 4d 41 58 5f 57 42 49 54 53 3b 0a 20 20 20 20   MAX_WBITS;.    
0bb0: 63 61 73 65 20 33 3a 20 2f 2a 20 64 65 66 6c 61  case 3: /* defla
0bc0: 74 65 20 64 61 74 61 20 3f 6c 65 76 65 6c 3f 20  te data ?level? 
0bd0: 2d 3e 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 20  -> data */.     
0be0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 34 29 0a 09   if (objc < 4)..
0bf0: 66 6c 61 67 20 3d 20 5a 5f 44 45 46 41 55 4c 54  flag = Z_DEFAULT
0c00: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 3b 0a 0a 20  _COMPRESSION;.. 
0c10: 20 20 20 20 20 73 74 72 65 61 6d 2e 61 76 61 69       stream.avai
0c20: 6c 5f 69 6e 20 3d 20 28 75 49 6e 74 29 20 64 6c  l_in = (uInt) dl
0c30: 65 6e 3b 0a 20 20 20 20 20 20 73 74 72 65 61 6d  en;.      stream
0c40: 2e 6e 65 78 74 5f 69 6e 20 3d 20 64 61 74 61 3b  .next_in = data;
0c50: 0a 0a 20 20 20 20 20 20 73 74 72 65 61 6d 2e 61  ..      stream.a
0c60: 76 61 69 6c 5f 6f 75 74 20 3d 20 28 75 49 6e 74  vail_out = (uInt
0c70: 29 20 64 6c 65 6e 20 2b 20 64 6c 65 6e 20 2f 20  ) dlen + dlen / 
0c80: 31 30 30 30 20 2b 20 31 32 3b 0a 20 20 20 20 20  1000 + 12;.     
0c90: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
0ca0: 79 4c 65 6e 67 74 68 28 6f 62 6a 2c 20 73 74 72  yLength(obj, str
0cb0: 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 29 3b 0a  eam.avail_out);.
0cc0: 20 20 20 20 20 20 73 74 72 65 61 6d 2e 6e 65 78        stream.nex
0cd0: 74 5f 6f 75 74 20 3d 20 54 63 6c 5f 47 65 74 42  t_out = Tcl_GetB
0ce0: 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
0cf0: 6f 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  obj, NULL);..   
0d00: 20 20 20 73 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63     stream.zalloc
0d10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 72 65   = 0;.      stre
0d20: 61 6d 2e 7a 66 72 65 65 20 3d 20 30 3b 0a 20 20  am.zfree = 0;.  
0d30: 20 20 20 20 73 74 72 65 61 6d 2e 6f 70 61 71 75      stream.opaqu
0d40: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 65 20  e = 0;..      e 
0d50: 3d 20 64 65 66 6c 61 74 65 49 6e 69 74 32 28 26  = deflateInit2(&
0d60: 73 74 72 65 61 6d 2c 20 28 69 6e 74 29 20 66 6c  stream, (int) fl
0d70: 61 67 2c 20 5a 5f 44 45 46 4c 41 54 45 44 2c 20  ag, Z_DEFLATED, 
0d80: 77 62 69 74 73 2c 0a 09 09 09 20 20 20 20 20 20  wbits,....      
0d90: 4d 41 58 5f 4d 45 4d 5f 4c 45 56 45 4c 2c 20 5a  MAX_MEM_LEVEL, Z
0da0: 5f 44 45 46 41 55 4c 54 5f 53 54 52 41 54 45 47  _DEFAULT_STRATEG
0db0: 59 29 3b 0a 20 20 20 20 20 20 69 66 20 28 65 20  Y);.      if (e 
0dc0: 21 3d 20 5a 5f 4f 4b 29 0a 09 62 72 65 61 6b 3b  != Z_OK)..break;
0dd0: 0a 0a 20 20 20 20 20 20 65 20 3d 20 64 65 66 6c  ..      e = defl
0de0: 61 74 65 28 26 73 74 72 65 61 6d 2c 20 5a 5f 46  ate(&stream, Z_F
0df0: 49 4e 49 53 48 29 3b 0a 20 20 20 20 20 20 69 66  INISH);.      if
0e00: 20 28 65 20 21 3d 20 5a 5f 53 54 52 45 41 4d 5f   (e != Z_STREAM_
0e10: 45 4e 44 29 20 7b 0a 09 64 65 66 6c 61 74 65 45  END) {..deflateE
0e20: 6e 64 28 26 73 74 72 65 61 6d 29 3b 0a 09 69 66  nd(&stream);..if
0e30: 20 28 65 20 3d 3d 20 5a 5f 4f 4b 29 20 65 20 3d   (e == Z_OK) e =
0e40: 20 5a 5f 42 55 46 5f 45 52 52 4f 52 3b 0a 20 20   Z_BUF_ERROR;.  
0e50: 20 20 20 20 7d 20 65 6c 73 65 0a 09 65 20 3d 20      } else..e = 
0e60: 64 65 66 6c 61 74 65 45 6e 64 28 26 73 74 72 65  deflateEnd(&stre
0e70: 61 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  am);.      break
0e80: 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 63 61 73  ;.      .    cas
0e90: 65 20 34 3a 20 2f 2a 20 64 65 63 6f 6d 70 72 65  e 4: /* decompre
0ea0: 73 73 20 64 61 74 61 20 3f 62 75 66 73 69 7a 65  ss data ?bufsize
0eb0: 3f 20 2d 3e 20 64 61 74 61 20 2a 2f 0a 20 20 20  ? -> data */.   
0ec0: 20 20 20 77 62 69 74 73 20 3d 20 4d 41 58 5f 57     wbits = MAX_W
0ed0: 42 49 54 53 3b 0a 20 20 20 20 63 61 73 65 20 35  BITS;.    case 5
0ee0: 3a 20 2f 2a 20 69 6e 66 6c 61 74 65 20 64 61 74  : /* inflate dat
0ef0: 61 20 3f 62 75 66 73 69 7a 65 3f 20 2d 3e 20 64  a ?bufsize? -> d
0f00: 61 74 61 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20  ata */.    {.   
0f10: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 34 29     if (objc < 4)
0f20: 0a 09 66 6c 61 67 20 3d 20 31 36 20 2a 20 31 30  ..flag = 16 * 10
0f30: 32 34 3b 0a 0a 20 20 20 20 20 20 66 6f 72 20 28  24;..      for (
0f40: 3b 3b 29 20 7b 0a 09 73 74 72 65 61 6d 2e 7a 61  ;;) {..stream.za
0f50: 6c 6c 6f 63 20 3d 20 30 3b 0a 09 73 74 72 65 61  lloc = 0;..strea
0f60: 6d 2e 7a 66 72 65 65 20 3d 20 30 3b 0a 0a 09 2f  m.zfree = 0;.../
0f70: 2a 20 2b 31 20 62 65 63 61 75 73 65 20 5a 4c 49  * +1 because ZLI
0f80: 42 20 63 61 6e 20 22 6f 76 65 72 2d 72 65 71 75  B can "over-requ
0f90: 65 73 74 22 20 69 6e 70 75 74 20 28 62 75 74 20  est" input (but 
0fa0: 69 67 6e 6f 72 65 20 69 74 29 20 2a 2f 0a 09 73  ignore it) */..s
0fb0: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d  tream.avail_in =
0fc0: 20 28 75 49 6e 74 29 20 64 6c 65 6e 20 2b 20 20   (uInt) dlen +  
0fd0: 31 3b 0a 09 73 74 72 65 61 6d 2e 6e 65 78 74 5f  1;..stream.next_
0fe0: 69 6e 20 3d 20 64 61 74 61 3b 0a 0a 09 73 74 72  in = data;...str
0ff0: 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 3d 20  eam.avail_out = 
1000: 28 75 49 6e 74 29 20 66 6c 61 67 3b 0a 09 54 63  (uInt) flag;..Tc
1010: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
1020: 6e 67 74 68 28 6f 62 6a 2c 20 73 74 72 65 61 6d  ngth(obj, stream
1030: 2e 61 76 61 69 6c 5f 6f 75 74 29 3b 0a 09 73 74  .avail_out);..st
1040: 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20  ream.next_out = 
1050: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1060: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 2c 20 4e 55 4c  FromObj(obj, NUL
1070: 4c 29 3b 0a 0a 09 2f 2a 20 4e 65 67 61 74 69 76  L);.../* Negativ
1080: 65 20 76 61 6c 75 65 20 73 75 70 70 72 65 73 73  e value suppress
1090: 65 73 20 5a 4c 49 42 20 68 65 61 64 65 72 20 2a  es ZLIB header *
10a0: 2f 0a 09 65 20 3d 20 69 6e 66 6c 61 74 65 49 6e  /..e = inflateIn
10b0: 69 74 32 28 26 73 74 72 65 61 6d 2c 20 77 62 69  it2(&stream, wbi
10c0: 74 73 29 3b 0a 09 69 66 20 28 65 20 3d 3d 20 5a  ts);..if (e == Z
10d0: 5f 4f 4b 29 20 7b 0a 09 20 20 65 20 3d 20 69 6e  _OK) {..  e = in
10e0: 66 6c 61 74 65 28 26 73 74 72 65 61 6d 2c 20 5a  flate(&stream, Z
10f0: 5f 46 49 4e 49 53 48 29 3b 0a 09 20 20 69 66 20  _FINISH);..  if 
1100: 28 65 20 21 3d 20 5a 5f 53 54 52 45 41 4d 5f 45  (e != Z_STREAM_E
1110: 4e 44 29 20 7b 0a 09 20 20 20 20 69 6e 66 6c 61  ND) {..    infla
1120: 74 65 45 6e 64 28 26 73 74 72 65 61 6d 29 3b 0a  teEnd(&stream);.
1130: 09 20 20 20 20 69 66 20 28 65 20 3d 3d 20 5a 5f  .    if (e == Z_
1140: 4f 4b 29 20 65 20 3d 20 5a 5f 42 55 46 5f 45 52  OK) e = Z_BUF_ER
1150: 52 4f 52 3b 0a 09 20 20 7d 20 65 6c 73 65 0a 09  ROR;..  } else..
1160: 20 20 20 20 65 20 3d 20 69 6e 66 6c 61 74 65 45      e = inflateE
1170: 6e 64 28 26 73 74 72 65 61 6d 29 3b 0a 09 7d 0a  nd(&stream);..}.
1180: 0a 09 69 66 20 28 65 20 3d 3d 20 5a 5f 4f 4b 20  ..if (e == Z_OK 
1190: 7c 7c 20 65 20 21 3d 20 5a 5f 42 55 46 5f 45 52  || e != Z_BUF_ER
11a0: 52 4f 52 29 20 62 72 65 61 6b 3b 0a 0a 09 54 63  ROR) break;...Tc
11b0: 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c 65  l_SetByteArrayLe
11c0: 6e 67 74 68 28 6f 62 6a 2c 20 30 29 3b 0a 09 66  ngth(obj, 0);..f
11d0: 6c 61 67 20 2a 3d 20 32 3b 0a 20 20 20 20 20 20  lag *= 2;.      
11e0: 7d 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  }..      break;.
11f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
1200: 20 63 61 73 65 20 36 3a 20 2f 2a 20 73 64 65 63   case 6: /* sdec
1210: 6f 6d 70 72 65 73 73 20 63 6d 64 6e 61 6d 65 20  ompress cmdname 
1220: 2d 3e 20 2a 2f 0a 20 20 20 20 20 20 77 62 69 74  -> */.      wbit
1230: 73 20 3d 20 4d 41 58 5f 57 42 49 54 53 3b 0a 20  s = MAX_WBITS;. 
1240: 20 20 20 63 61 73 65 20 37 3a 20 2f 2a 20 73 69     case 7: /* si
1250: 6e 66 6c 61 74 65 20 63 6d 64 6e 61 6d 65 20 2d  nflate cmdname -
1260: 3e 20 2a 2f 0a 20 20 20 20 7b 0a 20 20 20 20 20  > */.    {.     
1270: 20 7a 6c 69 62 73 74 72 65 61 6d 20 2a 7a 70 20   zlibstream *zp 
1280: 3d 20 28 7a 6c 69 62 73 74 72 65 61 6d 2a 29 20  = (zlibstream*) 
1290: 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66  Tcl_Alloc(sizeof
12a0: 20 28 7a 6c 69 62 73 74 72 65 61 6d 29 29 3b 0a   (zlibstream));.
12b0: 20 20 20 20 20 20 7a 70 2d 3e 69 6e 64 61 74 61        zp->indata
12c0: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
12d0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
12e0: 65 66 43 6f 75 6e 74 28 7a 70 2d 3e 69 6e 64 61  efCount(zp->inda
12f0: 74 61 29 3b 0a 20 20 20 20 20 20 7a 70 2d 3e 73  ta);.      zp->s
1300: 74 72 65 61 6d 2e 7a 61 6c 6c 6f 63 20 3d 20 30  tream.zalloc = 0
1310: 3b 0a 20 20 20 20 20 20 7a 70 2d 3e 73 74 72 65  ;.      zp->stre
1320: 61 6d 2e 7a 66 72 65 65 20 3d 20 30 3b 0a 20 20  am.zfree = 0;.  
1330: 20 20 20 20 7a 70 2d 3e 73 74 72 65 61 6d 2e 6f      zp->stream.o
1340: 70 61 71 75 65 20 3d 20 30 3b 0a 20 20 20 20 20  paque = 0;.     
1350: 20 7a 70 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74   zp->stream.next
1360: 5f 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  _in = 0;.      z
1370: 70 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  p->stream.avail_
1380: 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  in = 0;.      in
1390: 66 6c 61 74 65 49 6e 69 74 32 28 26 7a 70 2d 3e  flateInit2(&zp->
13a0: 73 74 72 65 61 6d 2c 20 77 62 69 74 73 29 3b 0a  stream, wbits);.
13b0: 20 20 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65        Tcl_Create
13c0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 70 2c 20 54  ObjCommand(ip, T
13d0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
13e0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 2c  Obj(objv[2], 0),
13f0: 20 7a 73 74 72 65 61 6d 69 6e 63 6d 64 2c 0a 20   zstreamincmd,. 
1400: 20 20 20 20 20 09 09 09 09 28 43 6c 69 65 6e 74       ....(Client
1410: 44 61 74 61 29 20 7a 70 2c 20 7a 73 74 72 65 61  Data) zp, zstrea
1420: 6d 64 65 6c 70 72 6f 63 29 3b 0a 20 20 20 20 20  mdelproc);.     
1430: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1440: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 20      }.  }..  if 
1450: 28 65 20 21 3d 20 5a 5f 4f 4b 29 20 7b 0a 20 20  (e != Z_OK) {.  
1460: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1470: 69 70 2c 20 28 63 68 61 72 2a 29 20 7a 45 72 72  ip, (char*) zErr
1480: 6f 72 28 65 29 2c 20 54 43 4c 5f 53 54 41 54 49  or(e), TCL_STATI
1490: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
14a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
14b0: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61   Tcl_SetByteArra
14c0: 79 4c 65 6e 67 74 68 28 6f 62 6a 2c 20 73 74 72  yLength(obj, str
14d0: 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 29 3b 0a  eam.total_out);.
14e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14f0: 0a 7d 0a 0a 69 6e 74 20 5a 6c 69 62 5f 49 6e 69  .}..int Zlib_Ini
1500: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
1510: 74 65 72 70 29 0a 7b 0a 20 20 20 20 54 63 6c 5f  terp).{.    Tcl_
1520: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
1530: 28 69 6e 74 65 72 70 2c 20 22 7a 6c 69 62 22 2c  (interp, "zlib",
1540: 20 5a 6c 69 62 43 6d 64 2c 20 30 2c 20 30 29 3b   ZlibCmd, 0, 0);
1550: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
1560: 50 6b 67 50 72 6f 76 69 64 65 28 20 69 6e 74 65  PkgProvide( inte
1570: 72 70 2c 20 22 7a 6c 69 62 22 2c 20 22 31 2e 31  rp, "zlib", "1.1
1580: 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ");.}.#endif /* 
1590: 54 63 6c 20 76 65 72 73 69 6f 6e 20 6c 65 73 73  Tcl version less
15a0: 20 74 68 61 6e 20 38 2e 36 20 2a 2f 0a            than 8.6 */.