Hex Artifact Content

Not logged in

Artifact 4b2f7581152ece4e54cba4e58b27d216b4314174:


0000: 2f 2a 20 67 7a 69 6f 2e 63 20 2d 2d 20 49 4f 20  /* gzio.c -- IO 
0010: 6f 6e 20 2e 67 7a 20 66 69 6c 65 73 0a 20 2a 20  on .gz files. * 
0020: 43 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39  Copyright (C) 19
0030: 39 35 2d 31 39 39 38 20 4a 65 61 6e 2d 6c 6f 75  95-1998 Jean-lou
0040: 70 20 47 61 69 6c 6c 79 2e 0a 20 2a 20 46 6f 72  p Gailly.. * For
0050: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 66 20 64   conditions of d
0060: 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e 64 20  istribution and 
0070: 75 73 65 2c 20 73 65 65 20 63 6f 70 79 72 69 67  use, see copyrig
0080: 68 74 20 6e 6f 74 69 63 65 20 69 6e 20 7a 6c 69  ht notice in zli
0090: 62 2e 68 0a 20 2a 0a 20 2a 20 43 6f 6d 70 69 6c  b.h. *. * Compil
00a0: 65 20 74 68 69 73 20 66 69 6c 65 20 77 69 74 68  e this file with
00b0: 20 2d 44 4e 4f 5f 44 45 46 4c 41 54 45 20 74 6f   -DNO_DEFLATE to
00c0: 20 61 76 6f 69 64 20 74 68 65 20 63 6f 6d 70 72   avoid the compr
00d0: 65 73 73 69 6f 6e 20 63 6f 64 65 2e 0a 20 2a 2f  ession code.. */
00e0: 0a 0a 2f 2a 20 40 28 23 29 20 24 49 64 24 20 2a  ../* @(#) $Id$ *
00f0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  /..#include <std
0100: 69 6f 2e 68 3e 0a 0a 23 69 6e 63 6c 75 64 65 20  io.h>..#include 
0110: 22 7a 75 74 69 6c 2e 68 22 0d 0a 0a 23 69 66 64  "zutil.h"...#ifd
0120: 65 66 20 4b 49 5f 47 5a 5f 4e 4f 5f 43 4f 4d 50  ef KI_GZ_NO_COMP
0130: 52 45 53 53 49 4f 4e 0d 0a 23 64 65 66 69 6e 65  RESSION..#define
0140: 20 4e 4f 5f 44 45 46 4c 41 54 45 0d 0a 23 65 6e   NO_DEFLATE..#en
0150: 64 69 66 20 2f 2a 20 4b 49 5f 47 5a 5f 4e 4f 5f  dif /* KI_GZ_NO_
0160: 43 4f 4d 50 52 45 53 53 49 4f 4e 20 2a 2f 0d 0a  COMPRESSION */..
0170: 0a 73 74 72 75 63 74 20 69 6e 74 65 72 6e 61 6c  .struct internal
0180: 5f 73 74 61 74 65 20 7b 69 6e 74 20 64 75 6d 6d  _state {int dumm
0190: 79 3b 7d 3b 20 2f 2a 20 66 6f 72 20 62 75 67 67  y;}; /* for bugg
01a0: 79 20 63 6f 6d 70 69 6c 65 72 73 20 2a 2f 0a 0a  y compilers */..
01b0: 23 69 66 6e 64 65 66 20 5a 5f 42 55 46 53 49 5a  #ifndef Z_BUFSIZ
01c0: 45 0a 23 20 20 69 66 64 65 66 20 4d 41 58 53 45  E.#  ifdef MAXSE
01d0: 47 5f 36 34 4b 0a 23 20 20 20 20 64 65 66 69 6e  G_64K.#    defin
01e0: 65 20 5a 5f 42 55 46 53 49 5a 45 20 34 30 39 36  e Z_BUFSIZE 4096
01f0: 20 2f 2a 20 6d 69 6e 69 6d 69 7a 65 20 6d 65 6d   /* minimize mem
0200: 6f 72 79 20 75 73 61 67 65 20 66 6f 72 20 31 36  ory usage for 16
0210: 2d 62 69 74 20 44 4f 53 20 2a 2f 0a 23 20 20 65  -bit DOS */.#  e
0220: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
0230: 5a 5f 42 55 46 53 49 5a 45 20 31 36 33 38 34 0a  Z_BUFSIZE 16384.
0240: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
0250: 23 69 66 6e 64 65 66 20 5a 5f 50 52 49 4e 54 46  #ifndef Z_PRINTF
0260: 5f 42 55 46 53 49 5a 45 0a 23 20 20 64 65 66 69  _BUFSIZE.#  defi
0270: 6e 65 20 5a 5f 50 52 49 4e 54 46 5f 42 55 46 53  ne Z_PRINTF_BUFS
0280: 49 5a 45 20 34 30 39 36 0a 23 65 6e 64 69 66 0a  IZE 4096.#endif.
0290: 0a 23 64 65 66 69 6e 65 20 41 4c 4c 4f 43 28 73  .#define ALLOC(s
02a0: 69 7a 65 29 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ize) malloc(size
02b0: 29 0a 23 64 65 66 69 6e 65 20 54 52 59 46 52 45  ).#define TRYFRE
02c0: 45 28 70 29 20 7b 69 66 20 28 70 29 20 66 72 65  E(p) {if (p) fre
02d0: 65 28 70 29 3b 7d 0a 0a 73 74 61 74 69 63 20 69  e(p);}..static i
02e0: 6e 74 20 67 7a 5f 6d 61 67 69 63 5b 32 5d 20 3d  nt gz_magic[2] =
02f0: 20 7b 30 78 31 66 2c 20 30 78 38 62 7d 3b 20 2f   {0x1f, 0x8b}; /
0300: 2a 20 67 7a 69 70 20 6d 61 67 69 63 20 68 65 61  * gzip magic hea
0310: 64 65 72 20 2a 2f 0a 0a 2f 2a 20 67 7a 69 70 20  der */../* gzip 
0320: 66 6c 61 67 20 62 79 74 65 20 2a 2f 0a 23 64 65  flag byte */.#de
0330: 66 69 6e 65 20 41 53 43 49 49 5f 46 4c 41 47 20  fine ASCII_FLAG 
0340: 20 20 30 78 30 31 20 2f 2a 20 62 69 74 20 30 20    0x01 /* bit 0 
0350: 73 65 74 3a 20 66 69 6c 65 20 70 72 6f 62 61 62  set: file probab
0360: 6c 79 20 61 73 63 69 69 20 74 65 78 74 20 2a 2f  ly ascii text */
0370: 0a 23 64 65 66 69 6e 65 20 48 45 41 44 5f 43 52  .#define HEAD_CR
0380: 43 20 20 20 20 20 30 78 30 32 20 2f 2a 20 62 69  C     0x02 /* bi
0390: 74 20 31 20 73 65 74 3a 20 68 65 61 64 65 72 20  t 1 set: header 
03a0: 43 52 43 20 70 72 65 73 65 6e 74 20 2a 2f 0a 23  CRC present */.#
03b0: 64 65 66 69 6e 65 20 45 58 54 52 41 5f 46 49 45  define EXTRA_FIE
03c0: 4c 44 20 20 30 78 30 34 20 2f 2a 20 62 69 74 20  LD  0x04 /* bit 
03d0: 32 20 73 65 74 3a 20 65 78 74 72 61 20 66 69 65  2 set: extra fie
03e0: 6c 64 20 70 72 65 73 65 6e 74 20 2a 2f 0a 23 64  ld present */.#d
03f0: 65 66 69 6e 65 20 4f 52 49 47 5f 4e 41 4d 45 20  efine ORIG_NAME 
0400: 20 20 20 30 78 30 38 20 2f 2a 20 62 69 74 20 33     0x08 /* bit 3
0410: 20 73 65 74 3a 20 6f 72 69 67 69 6e 61 6c 20 66   set: original f
0420: 69 6c 65 20 6e 61 6d 65 20 70 72 65 73 65 6e 74  ile name present
0430: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 43 4f 4d 4d   */.#define COMM
0440: 45 4e 54 20 20 20 20 20 20 30 78 31 30 20 2f 2a  ENT      0x10 /*
0450: 20 62 69 74 20 34 20 73 65 74 3a 20 66 69 6c 65   bit 4 set: file
0460: 20 63 6f 6d 6d 65 6e 74 20 70 72 65 73 65 6e 74   comment present
0470: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 53 45   */.#define RESE
0480: 52 56 45 44 20 20 20 20 20 30 78 45 30 20 2f 2a  RVED     0xE0 /*
0490: 20 62 69 74 73 20 35 2e 2e 37 3a 20 72 65 73 65   bits 5..7: rese
04a0: 72 76 65 64 20 2a 2f 0a 0a 74 79 70 65 64 65 66  rved */..typedef
04b0: 20 73 74 72 75 63 74 20 67 7a 5f 73 74 72 65 61   struct gz_strea
04c0: 6d 20 7b 0a 20 20 20 20 7a 5f 73 74 72 65 61 6d  m {.    z_stream
04d0: 20 73 74 72 65 61 6d 3b 0a 20 20 20 20 69 6e 74   stream;.    int
04e0: 20 20 20 20 20 20 7a 5f 65 72 72 3b 20 20 20 2f        z_err;   /
04f0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 66 6f 72  * error code for
0500: 20 6c 61 73 74 20 73 74 72 65 61 6d 20 6f 70 65   last stream ope
0510: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 6e  ration */.    in
0520: 74 20 20 20 20 20 20 7a 5f 65 6f 66 3b 20 20 20  t      z_eof;   
0530: 2f 2a 20 73 65 74 20 69 66 20 65 6e 64 20 6f 66  /* set if end of
0540: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
0550: 20 20 20 46 49 4c 45 20 20 20 20 20 2a 66 69 6c     FILE     *fil
0560: 65 3b 20 20 20 2f 2a 20 2e 67 7a 20 66 69 6c 65  e;   /* .gz file
0570: 20 2a 2f 0a 20 20 20 20 42 79 74 65 20 20 20 20   */.    Byte    
0580: 20 2a 69 6e 62 75 66 3b 20 20 2f 2a 20 69 6e 70   *inbuf;  /* inp
0590: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
05a0: 20 42 79 74 65 20 20 20 20 20 2a 6f 75 74 62 75   Byte     *outbu
05b0: 66 3b 20 2f 2a 20 6f 75 74 70 75 74 20 62 75 66  f; /* output buf
05c0: 66 65 72 20 2a 2f 0a 20 20 20 20 75 4c 6f 6e 67  fer */.    uLong
05d0: 20 20 20 20 63 72 63 3b 20 20 20 20 20 2f 2a 20      crc;     /* 
05e0: 63 72 63 33 32 20 6f 66 20 75 6e 63 6f 6d 70 72  crc32 of uncompr
05f0: 65 73 73 65 64 20 64 61 74 61 20 2a 2f 0a 20 20  essed data */.  
0600: 20 20 63 68 61 72 20 20 20 20 20 2a 6d 73 67 3b    char     *msg;
0610: 20 20 20 20 2f 2a 20 65 72 72 6f 72 20 6d 65 73      /* error mes
0620: 73 61 67 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  sage */.    char
0630: 20 20 20 20 20 2a 70 61 74 68 3b 20 20 20 2f 2a       *path;   /*
0640: 20 70 61 74 68 20 6e 61 6d 65 20 66 6f 72 20 64   path name for d
0650: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 20 2a 2f  ebugging only */
0660: 0a 20 20 20 20 69 6e 74 20 20 20 20 20 20 74 72  .    int      tr
0670: 61 6e 73 70 61 72 65 6e 74 3b 20 2f 2a 20 31 20  ansparent; /* 1 
0680: 69 66 20 69 6e 70 75 74 20 66 69 6c 65 20 69 73  if input file is
0690: 20 6e 6f 74 20 61 20 2e 67 7a 20 66 69 6c 65 20   not a .gz file 
06a0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 20 20 20 20  */.    char     
06b0: 6d 6f 64 65 3b 20 20 20 20 2f 2a 20 27 77 27 20  mode;    /* 'w' 
06c0: 6f 72 20 27 72 27 20 2a 2f 0a 20 20 20 20 6c 6f  or 'r' */.    lo
06d0: 6e 67 20 20 20 20 20 73 74 61 72 74 70 6f 73 3b  ng     startpos;
06e0: 20 2f 2a 20 73 74 61 72 74 20 6f 66 20 63 6f 6d   /* start of com
06f0: 70 72 65 73 73 65 64 20 64 61 74 61 20 69 6e 20  pressed data in 
0700: 66 69 6c 65 20 28 68 65 61 64 65 72 20 73 6b 69  file (header ski
0710: 70 70 65 64 29 20 2a 2f 0a 7d 20 67 7a 5f 73 74  pped) */.} gz_st
0720: 72 65 61 6d 3b 0a 0a 0a 6c 6f 63 61 6c 20 67 7a  ream;...local gz
0730: 46 69 6c 65 20 67 7a 5f 6f 70 65 6e 20 20 20 20  File gz_open    
0740: 20 20 4f 46 28 28 63 6f 6e 73 74 20 63 68 61 72    OF((const char
0750: 20 2a 70 61 74 68 2c 20 63 6f 6e 73 74 20 63 68   *path, const ch
0760: 61 72 20 2a 6d 6f 64 65 2c 20 69 6e 74 20 20 66  ar *mode, int  f
0770: 64 29 29 3b 0a 6c 6f 63 61 6c 20 69 6e 74 20 64  d));.local int d
0780: 6f 5f 66 6c 75 73 68 20 20 20 20 20 20 20 20 4f  o_flush        O
0790: 46 28 28 67 7a 46 69 6c 65 20 66 69 6c 65 2c 20  F((gzFile file, 
07a0: 69 6e 74 20 66 6c 75 73 68 29 29 3b 0a 6c 6f 63  int flush));.loc
07b0: 61 6c 20 69 6e 74 20 20 20 20 67 65 74 5f 62 79  al int    get_by
07c0: 74 65 20 20 20 20 20 4f 46 28 28 67 7a 5f 73 74  te     OF((gz_st
07d0: 72 65 61 6d 20 2a 73 29 29 3b 0a 6c 6f 63 61 6c  ream *s));.local
07e0: 20 76 6f 69 64 20 20 20 63 68 65 63 6b 5f 68 65   void   check_he
07f0: 61 64 65 72 20 4f 46 28 28 67 7a 5f 73 74 72 65  ader OF((gz_stre
0800: 61 6d 20 2a 73 29 29 3b 0a 6c 6f 63 61 6c 20 69  am *s));.local i
0810: 6e 74 20 20 20 20 64 65 73 74 72 6f 79 20 20 20  nt    destroy   
0820: 20 20 20 4f 46 28 28 67 7a 5f 73 74 72 65 61 6d     OF((gz_stream
0830: 20 2a 73 29 29 3b 0a 6c 6f 63 61 6c 20 76 6f 69   *s));.local voi
0840: 64 20 20 20 70 75 74 4c 6f 6e 67 20 20 20 20 20  d   putLong     
0850: 20 4f 46 28 28 46 49 4c 45 20 2a 66 69 6c 65 2c   OF((FILE *file,
0860: 20 75 4c 6f 6e 67 20 78 29 29 3b 0a 6c 6f 63 61   uLong x));.loca
0870: 6c 20 75 4c 6f 6e 67 20 20 67 65 74 4c 6f 6e 67  l uLong  getLong
0880: 20 20 20 20 20 20 4f 46 28 28 67 7a 5f 73 74 72        OF((gz_str
0890: 65 61 6d 20 2a 73 29 29 3b 0a 0a 2f 2a 20 3d 3d  eam *s));../* ==
08a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20 4f  =========.     O
08f0: 70 65 6e 73 20 61 20 67 7a 69 70 20 28 2e 67 7a  pens a gzip (.gz
0900: 29 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69  ) file for readi
0910: 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 20 54  ng or writing. T
0920: 68 65 20 6d 6f 64 65 20 70 61 72 61 6d 65 74 65  he mode paramete
0930: 72 0a 20 20 20 69 73 20 61 73 20 69 6e 20 66 6f  r.   is as in fo
0940: 70 65 6e 20 28 22 72 62 22 20 6f 72 20 22 77 62  pen ("rb" or "wb
0950: 22 29 2e 20 54 68 65 20 66 69 6c 65 20 69 73 20  "). The file is 
0960: 67 69 76 65 6e 20 65 69 74 68 65 72 20 62 79 20  given either by 
0970: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
0980: 20 20 20 6f 72 20 70 61 74 68 20 6e 61 6d 65 20     or path name 
0990: 28 69 66 20 66 64 20 3d 3d 20 2d 31 29 2e 0a 20  (if fd == -1).. 
09a0: 20 20 20 20 67 7a 5f 6f 70 65 6e 20 72 65 74 75      gz_open retu
09b0: 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
09c0: 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
09d0: 20 6f 70 65 6e 65 64 20 6f 72 20 69 66 20 74 68   opened or if th
09e0: 65 72 65 20 77 61 73 0a 20 20 20 69 6e 73 75 66  ere was.   insuf
09f0: 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 74  ficient memory t
0a00: 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 28  o allocate the (
0a10: 64 65 29 63 6f 6d 70 72 65 73 73 69 6f 6e 20 73  de)compression s
0a20: 74 61 74 65 3b 20 65 72 72 6e 6f 0a 20 20 20 63  tate; errno.   c
0a30: 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 74 6f  an be checked to
0a40: 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
0a50: 20 74 77 6f 20 63 61 73 65 73 20 28 69 66 20 65   two cases (if e
0a60: 72 72 6e 6f 20 69 73 20 7a 65 72 6f 2c 20 74 68  rrno is zero, th
0a70: 65 0a 20 20 20 7a 6c 69 62 20 65 72 72 6f 72 20  e.   zlib error 
0a80: 69 73 20 5a 5f 4d 45 4d 5f 45 52 52 4f 52 29 2e  is Z_MEM_ERROR).
0a90: 0a 2a 2f 0a 6c 6f 63 61 6c 20 67 7a 46 69 6c 65  .*/.local gzFile
0aa0: 20 67 7a 5f 6f 70 65 6e 20 28 70 61 74 68 2c 20   gz_open (path, 
0ab0: 6d 6f 64 65 2c 20 66 64 29 0a 20 20 20 20 63 6f  mode, fd).    co
0ac0: 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 3b 0a  nst char *path;.
0ad0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
0ae0: 6d 6f 64 65 3b 0a 20 20 20 20 69 6e 74 20 20 66  mode;.    int  f
0af0: 64 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  d;.{.    int err
0b00: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 20  ;.    int level 
0b10: 3d 20 5a 5f 44 45 46 41 55 4c 54 5f 43 4f 4d 50  = Z_DEFAULT_COMP
0b20: 52 45 53 53 49 4f 4e 3b 20 2f 2a 20 63 6f 6d 70  RESSION; /* comp
0b30: 72 65 73 73 69 6f 6e 20 6c 65 76 65 6c 20 2a 2f  ression level */
0b40: 0a 20 20 20 20 69 6e 74 20 73 74 72 61 74 65 67  .    int strateg
0b50: 79 20 3d 20 5a 5f 44 45 46 41 55 4c 54 5f 53 54  y = Z_DEFAULT_ST
0b60: 52 41 54 45 47 59 3b 20 2f 2a 20 63 6f 6d 70 72  RATEGY; /* compr
0b70: 65 73 73 69 6f 6e 20 73 74 72 61 74 65 67 79 20  ession strategy 
0b80: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d  */.    char *p =
0b90: 20 28 63 68 61 72 2a 29 6d 6f 64 65 3b 0a 20 20   (char*)mode;.  
0ba0: 20 20 67 7a 5f 73 74 72 65 61 6d 20 2a 73 3b 0a    gz_stream *s;.
0bb0: 20 20 20 20 63 68 61 72 20 66 6d 6f 64 65 5b 38      char fmode[8
0bc0: 30 5d 3b 20 2f 2a 20 63 6f 70 79 20 6f 66 20 6d  0]; /* copy of m
0bd0: 6f 64 65 2c 20 77 69 74 68 6f 75 74 20 74 68 65  ode, without the
0be0: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 65 76   compression lev
0bf0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  el */.    char *
0c00: 6d 20 3d 20 66 6d 6f 64 65 3b 0a 0a 20 20 20 20  m = fmode;..    
0c10: 69 66 20 28 21 70 61 74 68 20 7c 7c 20 21 6d 6f  if (!path || !mo
0c20: 64 65 29 20 72 65 74 75 72 6e 20 5a 5f 4e 55 4c  de) return Z_NUL
0c30: 4c 3b 0a 0a 20 20 20 20 73 20 3d 20 28 67 7a 5f  L;..    s = (gz_
0c40: 73 74 72 65 61 6d 20 2a 29 41 4c 4c 4f 43 28 73  stream *)ALLOC(s
0c50: 69 7a 65 6f 66 28 67 7a 5f 73 74 72 65 61 6d 29  izeof(gz_stream)
0c60: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 29 20 72  );.    if (!s) r
0c70: 65 74 75 72 6e 20 5a 5f 4e 55 4c 4c 3b 0a 0a 20  eturn Z_NULL;.. 
0c80: 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 7a 61 6c     s->stream.zal
0c90: 6c 6f 63 20 3d 20 28 61 6c 6c 6f 63 5f 66 75 6e  loc = (alloc_fun
0ca0: 63 29 30 3b 0a 20 20 20 20 73 2d 3e 73 74 72 65  c)0;.    s->stre
0cb0: 61 6d 2e 7a 66 72 65 65 20 3d 20 28 66 72 65 65  am.zfree = (free
0cc0: 5f 66 75 6e 63 29 30 3b 0a 20 20 20 20 73 2d 3e  _func)0;.    s->
0cd0: 73 74 72 65 61 6d 2e 6f 70 61 71 75 65 20 3d 20  stream.opaque = 
0ce0: 28 76 6f 69 64 70 66 29 30 3b 0a 20 20 20 20 73  (voidpf)0;.    s
0cf0: 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e  ->stream.next_in
0d00: 20 3d 20 73 2d 3e 69 6e 62 75 66 20 3d 20 5a 5f   = s->inbuf = Z_
0d10: 4e 55 4c 4c 3b 0a 20 20 20 20 73 2d 3e 73 74 72  NULL;.    s->str
0d20: 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20 73  eam.next_out = s
0d30: 2d 3e 6f 75 74 62 75 66 20 3d 20 5a 5f 4e 55 4c  ->outbuf = Z_NUL
0d40: 4c 3b 0a 20 20 20 20 73 2d 3e 73 74 72 65 61 6d  L;.    s->stream
0d50: 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 73 2d 3e 73  .avail_in = s->s
0d60: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
0d70: 3d 20 30 3b 0a 20 20 20 20 73 2d 3e 66 69 6c 65  = 0;.    s->file
0d80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 2d 3e   = NULL;.    s->
0d90: 7a 5f 65 72 72 20 3d 20 5a 5f 4f 4b 3b 0a 20 20  z_err = Z_OK;.  
0da0: 20 20 73 2d 3e 7a 5f 65 6f 66 20 3d 20 30 3b 0a    s->z_eof = 0;.
0db0: 20 20 20 20 73 2d 3e 63 72 63 20 3d 20 63 72 63      s->crc = crc
0dc0: 33 32 28 30 4c 2c 20 5a 5f 4e 55 4c 4c 2c 20 30  32(0L, Z_NULL, 0
0dd0: 29 3b 0a 20 20 20 20 73 2d 3e 6d 73 67 20 3d 20  );.    s->msg = 
0de0: 4e 55 4c 4c 3b 0a 20 20 20 20 73 2d 3e 74 72 61  NULL;.    s->tra
0df0: 6e 73 70 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20  nsparent = 0;.. 
0e00: 20 20 20 73 2d 3e 70 61 74 68 20 3d 20 28 63 68     s->path = (ch
0e10: 61 72 2a 29 41 4c 4c 4f 43 28 73 74 72 6c 65 6e  ar*)ALLOC(strlen
0e20: 28 70 61 74 68 29 2b 31 29 3b 0a 20 20 20 20 69  (path)+1);.    i
0e30: 66 20 28 73 2d 3e 70 61 74 68 20 3d 3d 20 4e 55  f (s->path == NU
0e40: 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  LL) {.        re
0e50: 74 75 72 6e 20 64 65 73 74 72 6f 79 28 73 29 2c  turn destroy(s),
0e60: 20 28 67 7a 46 69 6c 65 29 5a 5f 4e 55 4c 4c 3b   (gzFile)Z_NULL;
0e70: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 72 63 70  .    }.    strcp
0e80: 79 28 73 2d 3e 70 61 74 68 2c 20 70 61 74 68 29  y(s->path, path)
0e90: 3b 20 2f 2a 20 64 6f 20 74 68 69 73 20 65 61 72  ; /* do this ear
0ea0: 6c 79 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ly for debugging
0eb0: 20 2a 2f 0a 0a 20 20 20 20 73 2d 3e 6d 6f 64 65   */..    s->mode
0ec0: 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 64 6f 20   = '\0';.    do 
0ed0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 2a 70  {.        if (*p
0ee0: 20 3d 3d 20 27 72 27 29 20 73 2d 3e 6d 6f 64 65   == 'r') s->mode
0ef0: 20 3d 20 27 72 27 3b 0a 20 20 20 20 20 20 20 20   = 'r';.        
0f00: 69 66 20 28 2a 70 20 3d 3d 20 27 77 27 20 7c 7c  if (*p == 'w' ||
0f10: 20 2a 70 20 3d 3d 20 27 61 27 29 20 73 2d 3e 6d   *p == 'a') s->m
0f20: 6f 64 65 20 3d 20 27 77 27 3b 0a 20 20 20 20 20  ode = 'w';.     
0f30: 20 20 20 69 66 20 28 2a 70 20 3e 3d 20 27 30 27     if (*p >= '0'
0f40: 20 26 26 20 2a 70 20 3c 3d 20 27 39 27 29 20 7b   && *p <= '9') {
0f50: 0a 09 20 20 20 20 6c 65 76 65 6c 20 3d 20 2a 70  ..    level = *p
0f60: 20 2d 20 27 30 27 3b 0a 09 7d 20 65 6c 73 65 20   - '0';..} else 
0f70: 69 66 20 28 2a 70 20 3d 3d 20 27 66 27 29 20 7b  if (*p == 'f') {
0f80: 0a 09 20 20 73 74 72 61 74 65 67 79 20 3d 20 5a  ..  strategy = Z
0f90: 5f 46 49 4c 54 45 52 45 44 3b 0a 09 7d 20 65 6c  _FILTERED;..} el
0fa0: 73 65 20 69 66 20 28 2a 70 20 3d 3d 20 27 68 27  se if (*p == 'h'
0fb0: 29 20 7b 0a 09 20 20 73 74 72 61 74 65 67 79 20  ) {..  strategy 
0fc0: 3d 20 5a 5f 48 55 46 46 4d 41 4e 5f 4f 4e 4c 59  = Z_HUFFMAN_ONLY
0fd0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
0fe0: 20 2a 6d 2b 2b 20 3d 20 2a 70 3b 20 2f 2a 20 63   *m++ = *p; /* c
0ff0: 6f 70 79 20 74 68 65 20 6d 6f 64 65 20 2a 2f 0a  opy the mode */.
1000: 09 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  .}.    } while (
1010: 2a 70 2b 2b 20 26 26 20 6d 20 21 3d 20 66 6d 6f  *p++ && m != fmo
1020: 64 65 20 2b 20 73 69 7a 65 6f 66 28 66 6d 6f 64  de + sizeof(fmod
1030: 65 29 29 3b 0a 20 20 20 20 69 66 20 28 73 2d 3e  e));.    if (s->
1040: 6d 6f 64 65 20 3d 3d 20 27 5c 30 27 29 20 72 65  mode == '\0') re
1050: 74 75 72 6e 20 64 65 73 74 72 6f 79 28 73 29 2c  turn destroy(s),
1060: 20 28 67 7a 46 69 6c 65 29 5a 5f 4e 55 4c 4c 3b   (gzFile)Z_NULL;
1070: 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 2d  .    .    if (s-
1080: 3e 6d 6f 64 65 20 3d 3d 20 27 77 27 29 20 7b 0a  >mode == 'w') {.
1090: 23 69 66 64 65 66 20 4e 4f 5f 44 45 46 4c 41 54  #ifdef NO_DEFLAT
10a0: 45 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  E.        err = 
10b0: 5a 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52 3b 0a  Z_STREAM_ERROR;.
10c0: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 65 72  #else.        er
10d0: 72 20 3d 20 64 65 66 6c 61 74 65 49 6e 69 74 32  r = deflateInit2
10e0: 28 26 28 73 2d 3e 73 74 72 65 61 6d 29 2c 20 6c  (&(s->stream), l
10f0: 65 76 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  evel,.          
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 5a 5f 44 45 46 4c 41 54 45 44 2c 20 2d 4d 41   Z_DEFLATED, -MA
1120: 58 5f 57 42 49 54 53 2c 20 44 45 46 5f 4d 45 4d  X_WBITS, DEF_MEM
1130: 5f 4c 45 56 45 4c 2c 20 73 74 72 61 74 65 67 79  _LEVEL, strategy
1140: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 69  );.        /* wi
1150: 6e 64 6f 77 42 69 74 73 20 69 73 20 70 61 73 73  ndowBits is pass
1160: 65 64 20 3c 20 30 20 74 6f 20 73 75 70 70 72 65  ed < 0 to suppre
1170: 73 73 20 7a 6c 69 62 20 68 65 61 64 65 72 20 2a  ss zlib header *
1180: 2f 0a 0a 20 20 20 20 20 20 20 20 73 2d 3e 73 74  /..        s->st
1190: 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d 20  ream.next_out = 
11a0: 73 2d 3e 6f 75 74 62 75 66 20 3d 20 28 42 79 74  s->outbuf = (Byt
11b0: 65 2a 29 41 4c 4c 4f 43 28 5a 5f 42 55 46 53 49  e*)ALLOC(Z_BUFSI
11c0: 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ZE);.#endif.    
11d0: 20 20 20 20 69 66 20 28 65 72 72 20 21 3d 20 5a      if (err != Z
11e0: 5f 4f 4b 20 7c 7c 20 73 2d 3e 6f 75 74 62 75 66  _OK || s->outbuf
11f0: 20 3d 3d 20 5a 5f 4e 55 4c 4c 29 20 7b 0a 20 20   == Z_NULL) {.  
1200: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1210: 20 64 65 73 74 72 6f 79 28 73 29 2c 20 28 67 7a   destroy(s), (gz
1220: 46 69 6c 65 29 5a 5f 4e 55 4c 4c 3b 0a 20 20 20  File)Z_NULL;.   
1230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
1240: 65 20 7b 0a 20 20 20 20 20 20 20 20 73 2d 3e 73  e {.        s->s
1250: 74 72 65 61 6d 2e 6e 65 78 74 5f 69 6e 20 20 3d  tream.next_in  =
1260: 20 73 2d 3e 69 6e 62 75 66 20 3d 20 28 42 79 74   s->inbuf = (Byt
1270: 65 2a 29 41 4c 4c 4f 43 28 5a 5f 42 55 46 53 49  e*)ALLOC(Z_BUFSI
1280: 5a 45 29 3b 0a 0a 20 20 20 20 20 20 20 20 65 72  ZE);..        er
1290: 72 20 3d 20 69 6e 66 6c 61 74 65 49 6e 69 74 32  r = inflateInit2
12a0: 28 26 28 73 2d 3e 73 74 72 65 61 6d 29 2c 20 2d  (&(s->stream), -
12b0: 4d 41 58 5f 57 42 49 54 53 29 3b 0a 20 20 20 20  MAX_WBITS);.    
12c0: 20 20 20 20 2f 2a 20 77 69 6e 64 6f 77 42 69 74      /* windowBit
12d0: 73 20 69 73 20 70 61 73 73 65 64 20 3c 20 30 20  s is passed < 0 
12e0: 74 6f 20 74 65 6c 6c 20 74 68 61 74 20 74 68 65  to tell that the
12f0: 72 65 20 69 73 20 6e 6f 20 7a 6c 69 62 20 68 65  re is no zlib he
1300: 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 20 2a  ader..         *
1310: 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 20 74 68   Note that in th
1320: 69 73 20 63 61 73 65 20 69 6e 66 6c 61 74 65 20  is case inflate 
1330: 2a 72 65 71 75 69 72 65 73 2a 20 61 6e 20 65 78  *requires* an ex
1340: 74 72 61 20 22 64 75 6d 6d 79 22 20 62 79 74 65  tra "dummy" byte
1350: 0a 20 20 20 20 20 20 20 20 20 2a 20 61 66 74 65  .         * afte
1360: 72 20 74 68 65 20 63 6f 6d 70 72 65 73 73 65 64  r the compressed
1370: 20 73 74 72 65 61 6d 20 69 6e 20 6f 72 64 65 72   stream in order
1380: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 64 65 63   to complete dec
1390: 6f 6d 70 72 65 73 73 69 6f 6e 20 61 6e 64 0a 20  ompression and. 
13a0: 20 20 20 20 20 20 20 20 2a 20 72 65 74 75 72 6e          * return
13b0: 20 5a 5f 53 54 52 45 41 4d 5f 45 4e 44 2e 20 48   Z_STREAM_END. H
13c0: 65 72 65 20 74 68 65 20 67 7a 69 70 20 43 52 43  ere the gzip CRC
13d0: 33 32 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  32 ensures that 
13e0: 34 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20  4 bytes are.    
13f0: 20 20 20 20 20 2a 20 70 72 65 73 65 6e 74 20 61       * present a
1400: 66 74 65 72 20 74 68 65 20 63 6f 6d 70 72 65 73  fter the compres
1410: 73 65 64 20 73 74 72 65 61 6d 2e 0a 20 20 20 20  sed stream..    
1420: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1430: 69 66 20 28 65 72 72 20 21 3d 20 5a 5f 4f 4b 20  if (err != Z_OK 
1440: 7c 7c 20 73 2d 3e 69 6e 62 75 66 20 3d 3d 20 5a  || s->inbuf == Z
1450: 5f 4e 55 4c 4c 29 20 7b 0a 20 20 20 20 20 20 20  _NULL) {.       
1460: 20 20 20 20 20 72 65 74 75 72 6e 20 64 65 73 74       return dest
1470: 72 6f 79 28 73 29 2c 20 28 67 7a 46 69 6c 65 29  roy(s), (gzFile)
1480: 5a 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  Z_NULL;.        
1490: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 2d 3e 73  }.    }.    s->s
14a0: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
14b0: 3d 20 5a 5f 42 55 46 53 49 5a 45 3b 0a 0a 20 20  = Z_BUFSIZE;..  
14c0: 20 20 65 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 20    errno = 0;.   
14d0: 20 73 2d 3e 66 69 6c 65 20 3d 20 66 64 20 3c 20   s->file = fd < 
14e0: 30 20 3f 20 46 5f 4f 50 45 4e 28 70 61 74 68 2c  0 ? F_OPEN(path,
14f0: 20 66 6d 6f 64 65 29 20 3a 20 28 46 49 4c 45 2a   fmode) : (FILE*
1500: 29 66 64 6f 70 65 6e 28 66 64 2c 20 66 6d 6f 64  )fdopen(fd, fmod
1510: 65 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 2d 3e  e);..    if (s->
1520: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  file == NULL) {.
1530: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 64          return d
1540: 65 73 74 72 6f 79 28 73 29 2c 20 28 67 7a 46 69  estroy(s), (gzFi
1550: 6c 65 29 5a 5f 4e 55 4c 4c 3b 0a 20 20 20 20 7d  le)Z_NULL;.    }
1560: 0a 20 20 20 20 69 66 20 28 73 2d 3e 6d 6f 64 65  .    if (s->mode
1570: 20 3d 3d 20 27 77 27 29 20 7b 0a 20 20 20 20 20   == 'w') {.     
1580: 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20 76 65     /* Write a ve
1590: 72 79 20 73 69 6d 70 6c 65 20 2e 67 7a 20 68 65  ry simple .gz he
15a0: 61 64 65 72 3a 0a 20 20 20 20 20 20 20 20 20 2a  ader:.         *
15b0: 2f 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  /.        fprint
15c0: 66 28 73 2d 3e 66 69 6c 65 2c 20 22 25 63 25 63  f(s->file, "%c%c
15d0: 25 63 25 63 25 63 25 63 25 63 25 63 25 63 25 63  %c%c%c%c%c%c%c%c
15e0: 22 2c 20 67 7a 5f 6d 61 67 69 63 5b 30 5d 2c 20  ", gz_magic[0], 
15f0: 67 7a 5f 6d 61 67 69 63 5b 31 5d 2c 0a 20 20 20  gz_magic[1],.   
1600: 20 20 20 20 20 20 20 20 20 20 5a 5f 44 45 46 4c            Z_DEFL
1610: 41 54 45 44 2c 20 30 20 2f 2a 66 6c 61 67 73 2a  ATED, 0 /*flags*
1620: 2f 2c 20 30 2c 30 2c 30 2c 30 20 2f 2a 74 69 6d  /, 0,0,0,0 /*tim
1630: 65 2a 2f 2c 20 30 20 2f 2a 78 66 6c 61 67 73 2a  e*/, 0 /*xflags*
1640: 2f 2c 20 4f 53 5f 43 4f 44 45 29 3b 0a 09 73 2d  /, OS_CODE);..s-
1650: 3e 73 74 61 72 74 70 6f 73 20 3d 20 31 30 4c 3b  >startpos = 10L;
1660: 0a 09 2f 2a 20 57 65 20 75 73 65 20 31 30 4c 20  ../* We use 10L 
1670: 69 6e 73 74 65 61 64 20 6f 66 20 66 74 65 6c 6c  instead of ftell
1680: 28 73 2d 3e 66 69 6c 65 29 20 74 6f 20 62 65 63  (s->file) to bec
1690: 61 75 73 65 20 66 74 65 6c 6c 20 63 61 75 73 65  ause ftell cause
16a0: 73 20 61 6e 0a 20 20 20 20 20 20 20 20 20 2a 20  s an.         * 
16b0: 66 66 6c 75 73 68 20 6f 6e 20 73 6f 6d 65 20 73  fflush on some s
16c0: 79 73 74 65 6d 73 2e 20 54 68 69 73 20 76 65 72  ystems. This ver
16d0: 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  sion of the libr
16e0: 61 72 79 20 64 6f 65 73 6e 27 74 20 75 73 65 0a  ary doesn't use.
16f0: 20 20 20 20 20 20 20 20 20 2a 20 73 74 61 72 74           * start
1700: 70 6f 73 20 61 6e 79 77 61 79 20 69 6e 20 77 72  pos anyway in wr
1710: 69 74 65 20 6d 6f 64 65 2c 20 73 6f 20 74 68 69  ite mode, so thi
1720: 73 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  s initialization
1730: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
1740: 20 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20   * necessary..  
1750: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 20         */.    } 
1760: 65 6c 73 65 20 7b 0a 09 63 68 65 63 6b 5f 68 65  else {..check_he
1770: 61 64 65 72 28 73 29 3b 20 2f 2a 20 73 6b 69 70  ader(s); /* skip
1780: 20 74 68 65 20 2e 67 7a 20 68 65 61 64 65 72 20   the .gz header 
1790: 2a 2f 0a 09 73 2d 3e 73 74 61 72 74 70 6f 73 20  */..s->startpos 
17a0: 3d 20 28 66 74 65 6c 6c 28 73 2d 3e 66 69 6c 65  = (ftell(s->file
17b0: 29 20 2d 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76  ) - s->stream.av
17c0: 61 69 6c 5f 69 6e 29 3b 0a 20 20 20 20 7d 0a 20  ail_in);.    }. 
17d0: 20 20 20 0a 20 20 20 20 72 65 74 75 72 6e 20 28     .    return (
17e0: 67 7a 46 69 6c 65 29 73 3b 0a 7d 0a 0a 2f 2a 20  gzFile)s;.}../* 
17f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20  ===========.    
1840: 20 4f 70 65 6e 73 20 61 20 67 7a 69 70 20 28 2e   Opens a gzip (.
1850: 67 7a 29 20 66 69 6c 65 20 66 6f 72 20 72 65 61  gz) file for rea
1860: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
1870: 0a 2a 2f 0a 67 7a 46 69 6c 65 20 5a 45 58 50 4f  .*/.gzFile ZEXPO
1880: 52 54 20 67 7a 6f 70 65 6e 20 28 70 61 74 68 2c  RT gzopen (path,
1890: 20 6d 6f 64 65 29 0a 20 20 20 20 63 6f 6e 73 74   mode).    const
18a0: 20 63 68 61 72 20 2a 70 61 74 68 3b 0a 20 20 20   char *path;.   
18b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
18c0: 65 3b 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e;.{.    return 
18d0: 67 7a 5f 6f 70 65 6e 20 28 70 61 74 68 2c 20 6d  gz_open (path, m
18e0: 6f 64 65 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 20  ode, -1);.}../* 
18f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1930: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20  ===========.    
1940: 20 41 73 73 6f 63 69 61 74 65 20 61 20 67 7a 46   Associate a gzF
1950: 69 6c 65 20 77 69 74 68 20 74 68 65 20 66 69 6c  ile with the fil
1960: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 64 2e  e descriptor fd.
1970: 20 66 64 20 69 73 20 6e 6f 74 20 64 75 70 27 65   fd is not dup'e
1980: 64 20 68 65 72 65 0a 20 20 20 74 6f 20 6d 69 6d  d here.   to mim
1990: 69 63 20 74 68 65 20 62 65 68 61 76 69 6f 28 75  ic the behavio(u
19a0: 29 72 20 6f 66 20 66 64 6f 70 65 6e 2e 0a 2a 2f  )r of fdopen..*/
19b0: 0a 67 7a 46 69 6c 65 20 5a 45 58 50 4f 52 54 20  .gzFile ZEXPORT 
19c0: 67 7a 64 6f 70 65 6e 20 28 66 64 2c 20 6d 6f 64  gzdopen (fd, mod
19d0: 65 29 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20  e).    int fd;. 
19e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d     const char *m
19f0: 6f 64 65 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20  ode;.{.    char 
1a00: 6e 61 6d 65 5b 32 30 5d 3b 0a 0a 20 20 20 20 69  name[20];..    i
1a10: 66 20 28 66 64 20 3c 20 30 29 20 72 65 74 75 72  f (fd < 0) retur
1a20: 6e 20 28 67 7a 46 69 6c 65 29 5a 5f 4e 55 4c 4c  n (gzFile)Z_NULL
1a30: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6e 61  ;.    sprintf(na
1a40: 6d 65 2c 20 22 3c 66 64 3a 25 64 3e 22 2c 20 66  me, "<fd:%d>", f
1a50: 64 29 3b 20 2f 2a 20 66 6f 72 20 64 65 62 75 67  d); /* for debug
1a60: 67 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 65 74  ging */..    ret
1a70: 75 72 6e 20 67 7a 5f 6f 70 65 6e 20 28 6e 61 6d  urn gz_open (nam
1a80: 65 2c 20 6d 6f 64 65 2c 20 66 64 29 3b 0a 7d 0a  e, mode, fd);.}.
1a90: 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ./* ============
1aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
1ae0: 20 2a 20 55 70 64 61 74 65 20 74 68 65 20 63 6f   * Update the co
1af0: 6d 70 72 65 73 73 69 6f 6e 20 6c 65 76 65 6c 20  mpression level 
1b00: 61 6e 64 20 73 74 72 61 74 65 67 79 0a 20 2a 2f  and strategy. */
1b10: 0a 69 6e 74 20 5a 45 58 50 4f 52 54 20 67 7a 73  .int ZEXPORT gzs
1b20: 65 74 70 61 72 61 6d 73 20 28 66 69 6c 65 2c 20  etparams (file, 
1b30: 6c 65 76 65 6c 2c 20 73 74 72 61 74 65 67 79 29  level, strategy)
1b40: 0a 20 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65  .    gzFile file
1b50: 3b 0a 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b  ;.    int level;
1b60: 0a 20 20 20 20 69 6e 74 20 73 74 72 61 74 65 67  .    int strateg
1b70: 79 3b 0a 7b 0a 23 69 66 6e 64 65 66 20 4b 49 5f  y;.{.#ifndef KI_
1b80: 47 5a 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f  GZ_NO_COMPRESSIO
1b90: 4e 0d 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d  N..    gz_stream
1ba0: 20 2a 73 20 3d 20 28 67 7a 5f 73 74 72 65 61 6d   *s = (gz_stream
1bb0: 2a 29 66 69 6c 65 3b 0a 0a 20 20 20 20 69 66 20  *)file;..    if 
1bc0: 28 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 2d  (s == NULL || s-
1bd0: 3e 6d 6f 64 65 20 21 3d 20 27 77 27 29 20 72 65  >mode != 'w') re
1be0: 74 75 72 6e 20 5a 5f 53 54 52 45 41 4d 5f 45 52  turn Z_STREAM_ER
1bf0: 52 4f 52 3b 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  ROR;..    /* Mak
1c00: 65 20 72 6f 6f 6d 20 74 6f 20 61 6c 6c 6f 77 20  e room to allow 
1c10: 66 6c 75 73 68 69 6e 67 20 2a 2f 0a 20 20 20 20  flushing */.    
1c20: 69 66 20 28 73 2d 3e 73 74 72 65 61 6d 2e 61 76  if (s->stream.av
1c30: 61 69 6c 5f 6f 75 74 20 3d 3d 20 30 29 20 7b 0a  ail_out == 0) {.
1c40: 0a 09 73 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74  ..s->stream.next
1c50: 5f 6f 75 74 20 3d 20 73 2d 3e 6f 75 74 62 75 66  _out = s->outbuf
1c60: 3b 0a 09 69 66 20 28 66 77 72 69 74 65 28 73 2d  ;..if (fwrite(s-
1c70: 3e 6f 75 74 62 75 66 2c 20 31 2c 20 5a 5f 42 55  >outbuf, 1, Z_BU
1c80: 46 53 49 5a 45 2c 20 73 2d 3e 66 69 6c 65 29 20  FSIZE, s->file) 
1c90: 21 3d 20 5a 5f 42 55 46 53 49 5a 45 29 20 7b 0a  != Z_BUFSIZE) {.
1ca0: 09 20 20 20 20 73 2d 3e 7a 5f 65 72 72 20 3d 20  .    s->z_err = 
1cb0: 5a 5f 45 52 52 4e 4f 3b 0a 09 7d 0a 09 73 2d 3e  Z_ERRNO;..}..s->
1cc0: 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74  stream.avail_out
1cd0: 20 3d 20 5a 5f 42 55 46 53 49 5a 45 3b 0a 20 20   = Z_BUFSIZE;.  
1ce0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
1cf0: 64 65 66 6c 61 74 65 50 61 72 61 6d 73 20 28 26  deflateParams (&
1d00: 28 73 2d 3e 73 74 72 65 61 6d 29 2c 20 6c 65 76  (s->stream), lev
1d10: 65 6c 2c 20 73 74 72 61 74 65 67 79 29 3b 0d 0a  el, strategy);..
1d20: 23 65 6c 73 65 0a 09 72 65 74 75 72 6e 20 5a 5f  #else..return Z_
1d30: 53 54 52 45 41 4d 5f 45 52 52 4f 52 3b 0d 0a 23  STREAM_ERROR;..#
1d40: 65 6e 64 69 66 20 2f 2a 20 4b 49 5f 47 5a 5f 4e  endif /* KI_GZ_N
1d50: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 20 2a 2f  O_COMPRESSION */
1d60: 0d 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d  ..}../* ========
1d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1db0: 3d 3d 3d 0a 20 20 20 20 20 52 65 61 64 20 61 20  ===.     Read a 
1dc0: 62 79 74 65 20 66 72 6f 6d 20 61 20 67 7a 5f 73  byte from a gz_s
1dd0: 74 72 65 61 6d 3b 20 75 70 64 61 74 65 20 6e 65  tream; update ne
1de0: 78 74 5f 69 6e 20 61 6e 64 20 61 76 61 69 6c 5f  xt_in and avail_
1df0: 69 6e 2e 20 52 65 74 75 72 6e 20 45 4f 46 0a 20  in. Return EOF. 
1e00: 20 20 66 6f 72 20 65 6e 64 20 6f 66 20 66 69 6c    for end of fil
1e10: 65 2e 0a 20 20 20 49 4e 20 61 73 73 65 72 74 69  e..   IN asserti
1e20: 6f 6e 3a 20 74 68 65 20 73 74 72 65 61 6d 20 73  on: the stream s
1e30: 20 68 61 73 20 62 65 65 6e 20 73 75 63 65 73 73   has been sucess
1e40: 66 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72  fully opened for
1e50: 20 72 65 61 64 69 6e 67 2e 0a 2a 2f 0a 6c 6f 63   reading..*/.loc
1e60: 61 6c 20 69 6e 74 20 67 65 74 5f 62 79 74 65 28  al int get_byte(
1e70: 73 29 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d  s).    gz_stream
1e80: 20 2a 73 3b 0a 7b 0a 20 20 20 20 69 66 20 28 73   *s;.{.    if (s
1e90: 2d 3e 7a 5f 65 6f 66 29 20 72 65 74 75 72 6e 20  ->z_eof) return 
1ea0: 45 4f 46 3b 0a 20 20 20 20 69 66 20 28 73 2d 3e  EOF;.    if (s->
1eb0: 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20  stream.avail_in 
1ec0: 3d 3d 20 30 29 20 7b 0a 09 65 72 72 6e 6f 20 3d  == 0) {..errno =
1ed0: 20 30 3b 0a 09 73 2d 3e 73 74 72 65 61 6d 2e 61   0;..s->stream.a
1ee0: 76 61 69 6c 5f 69 6e 20 3d 20 66 72 65 61 64 28  vail_in = fread(
1ef0: 73 2d 3e 69 6e 62 75 66 2c 20 31 2c 20 5a 5f 42  s->inbuf, 1, Z_B
1f00: 55 46 53 49 5a 45 2c 20 73 2d 3e 66 69 6c 65 29  UFSIZE, s->file)
1f10: 3b 0a 09 69 66 20 28 73 2d 3e 73 74 72 65 61 6d  ;..if (s->stream
1f20: 2e 61 76 61 69 6c 5f 69 6e 20 3d 3d 20 30 29 20  .avail_in == 0) 
1f30: 7b 0a 09 20 20 20 20 73 2d 3e 7a 5f 65 6f 66 20  {..    s->z_eof 
1f40: 3d 20 31 3b 0a 09 20 20 20 20 69 66 20 28 66 65  = 1;..    if (fe
1f50: 72 72 6f 72 28 73 2d 3e 66 69 6c 65 29 29 20 73  rror(s->file)) s
1f60: 2d 3e 7a 5f 65 72 72 20 3d 20 5a 5f 45 52 52 4e  ->z_err = Z_ERRN
1f70: 4f 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 45  O;..    return E
1f80: 4f 46 3b 0a 09 7d 0a 09 73 2d 3e 73 74 72 65 61  OF;..}..s->strea
1f90: 6d 2e 6e 65 78 74 5f 69 6e 20 3d 20 73 2d 3e 69  m.next_in = s->i
1fa0: 6e 62 75 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nbuf;.    }.    
1fb0: 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  s->stream.avail_
1fc0: 69 6e 2d 2d 3b 0a 20 20 20 20 72 65 74 75 72 6e  in--;.    return
1fd0: 20 2a 28 73 2d 3e 73 74 72 65 61 6d 2e 6e 65 78   *(s->stream.nex
1fe0: 74 5f 69 6e 29 2b 2b 3b 0a 7d 0a 0a 2f 2a 20 3d  t_in)++;.}../* =
1ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20  ==========.     
2040: 20 43 68 65 63 6b 20 74 68 65 20 67 7a 69 70 20   Check the gzip 
2050: 68 65 61 64 65 72 20 6f 66 20 61 20 67 7a 5f 73  header of a gz_s
2060: 74 72 65 61 6d 20 6f 70 65 6e 65 64 20 66 6f 72  tream opened for
2070: 20 72 65 61 64 69 6e 67 2e 20 53 65 74 20 74 68   reading. Set th
2080: 65 20 73 74 72 65 61 6d 0a 20 20 20 20 6d 6f 64  e stream.    mod
2090: 65 20 74 6f 20 74 72 61 6e 73 70 61 72 65 6e 74  e to transparent
20a0: 20 69 66 20 74 68 65 20 67 7a 69 70 20 6d 61 67   if the gzip mag
20b0: 69 63 20 68 65 61 64 65 72 20 69 73 20 6e 6f 74  ic header is not
20c0: 20 70 72 65 73 65 6e 74 3b 20 73 65 74 20 73 2d   present; set s-
20d0: 3e 65 72 72 0a 20 20 20 20 74 6f 20 5a 5f 44 41  >err.    to Z_DA
20e0: 54 41 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TA_ERROR if the 
20f0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 69 73 20  magic header is 
2100: 70 72 65 73 65 6e 74 20 62 75 74 20 74 68 65 20  present but the 
2110: 72 65 73 74 20 6f 66 20 74 68 65 20 68 65 61 64  rest of the head
2120: 65 72 0a 20 20 20 20 69 73 20 69 6e 63 6f 72 72  er.    is incorr
2130: 65 63 74 2e 0a 20 20 20 20 49 4e 20 61 73 73 65  ect..    IN asse
2140: 72 74 69 6f 6e 3a 20 74 68 65 20 73 74 72 65 61  rtion: the strea
2150: 6d 20 73 20 68 61 73 20 61 6c 72 65 61 64 79 20  m s has already 
2160: 62 65 65 6e 20 63 72 65 61 74 65 64 20 73 75 63  been created suc
2170: 65 73 73 66 75 6c 6c 79 3b 0a 20 20 20 20 20 20  essfully;.      
2180: 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c   s->stream.avail
2190: 5f 69 6e 20 69 73 20 7a 65 72 6f 20 66 6f 72 20  _in is zero for 
21a0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 2c 20  the first time, 
21b0: 62 75 74 20 6d 61 79 20 62 65 20 6e 6f 6e 2d 7a  but may be non-z
21c0: 65 72 6f 0a 20 20 20 20 20 20 20 66 6f 72 20 63  ero.       for c
21d0: 6f 6e 63 61 74 65 6e 61 74 65 64 20 2e 67 7a 20  oncatenated .gz 
21e0: 66 69 6c 65 73 2e 0a 2a 2f 0a 6c 6f 63 61 6c 20  files..*/.local 
21f0: 76 6f 69 64 20 63 68 65 63 6b 5f 68 65 61 64 65  void check_heade
2200: 72 28 73 29 0a 20 20 20 20 67 7a 5f 73 74 72 65  r(s).    gz_stre
2210: 61 6d 20 2a 73 3b 0a 7b 0a 20 20 20 20 69 6e 74  am *s;.{.    int
2220: 20 6d 65 74 68 6f 64 3b 20 2f 2a 20 6d 65 74 68   method; /* meth
2230: 6f 64 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  od byte */.    i
2240: 6e 74 20 66 6c 61 67 73 3b 20 20 2f 2a 20 66 6c  nt flags;  /* fl
2250: 61 67 73 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  ags byte */.    
2260: 75 49 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  uInt len;.    in
2270: 74 20 63 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  t c;..    /* Che
2280: 63 6b 20 74 68 65 20 67 7a 69 70 20 6d 61 67 69  ck the gzip magi
2290: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 20  c header */.    
22a0: 66 6f 72 20 28 6c 65 6e 20 3d 20 30 3b 20 6c 65  for (len = 0; le
22b0: 6e 20 3c 20 32 3b 20 6c 65 6e 2b 2b 29 20 7b 0a  n < 2; len++) {.
22c0: 09 63 20 3d 20 67 65 74 5f 62 79 74 65 28 73 29  .c = get_byte(s)
22d0: 3b 0a 09 69 66 20 28 63 20 21 3d 20 67 7a 5f 6d  ;..if (c != gz_m
22e0: 61 67 69 63 5b 6c 65 6e 5d 29 20 7b 0a 09 20 20  agic[len]) {..  
22f0: 20 20 69 66 20 28 6c 65 6e 20 21 3d 20 30 29 20    if (len != 0) 
2300: 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  s->stream.avail_
2310: 69 6e 2b 2b 2c 20 73 2d 3e 73 74 72 65 61 6d 2e  in++, s->stream.
2320: 6e 65 78 74 5f 69 6e 2d 2d 3b 0a 09 20 20 20 20  next_in--;..    
2330: 69 66 20 28 63 20 21 3d 20 45 4f 46 29 20 7b 0a  if (c != EOF) {.
2340: 09 09 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69  ..s->stream.avai
2350: 6c 5f 69 6e 2b 2b 2c 20 73 2d 3e 73 74 72 65 61  l_in++, s->strea
2360: 6d 2e 6e 65 78 74 5f 69 6e 2d 2d 3b 0a 09 09 73  m.next_in--;...s
2370: 2d 3e 74 72 61 6e 73 70 61 72 65 6e 74 20 3d 20  ->transparent = 
2380: 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  1;..    }..    s
2390: 2d 3e 7a 5f 65 72 72 20 3d 20 73 2d 3e 73 74 72  ->z_err = s->str
23a0: 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 20 21 3d 20  eam.avail_in != 
23b0: 30 20 3f 20 5a 5f 4f 4b 20 3a 20 5a 5f 53 54 52  0 ? Z_OK : Z_STR
23c0: 45 41 4d 5f 45 4e 44 3b 0a 09 20 20 20 20 72 65  EAM_END;..    re
23d0: 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  turn;..}.    }. 
23e0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 67 65 74 5f     method = get_
23f0: 62 79 74 65 28 73 29 3b 0a 20 20 20 20 66 6c 61  byte(s);.    fla
2400: 67 73 20 3d 20 67 65 74 5f 62 79 74 65 28 73 29  gs = get_byte(s)
2410: 3b 0a 20 20 20 20 69 66 20 28 6d 65 74 68 6f 64  ;.    if (method
2420: 20 21 3d 20 5a 5f 44 45 46 4c 41 54 45 44 20 7c   != Z_DEFLATED |
2430: 7c 20 28 66 6c 61 67 73 20 26 20 52 45 53 45 52  | (flags & RESER
2440: 56 45 44 29 20 21 3d 20 30 29 20 7b 0a 09 73 2d  VED) != 0) {..s-
2450: 3e 7a 5f 65 72 72 20 3d 20 5a 5f 44 41 54 41 5f  >z_err = Z_DATA_
2460: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 3b 0a  ERROR;..return;.
2470: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
2480: 73 63 61 72 64 20 74 69 6d 65 2c 20 78 66 6c 61  scard time, xfla
2490: 67 73 20 61 6e 64 20 4f 53 20 63 6f 64 65 3a 20  gs and OS code: 
24a0: 2a 2f 0a 20 20 20 20 66 6f 72 20 28 6c 65 6e 20  */.    for (len 
24b0: 3d 20 30 3b 20 6c 65 6e 20 3c 20 36 3b 20 6c 65  = 0; len < 6; le
24c0: 6e 2b 2b 29 20 28 76 6f 69 64 29 67 65 74 5f 62  n++) (void)get_b
24d0: 79 74 65 28 73 29 3b 0a 0a 20 20 20 20 69 66 20  yte(s);..    if 
24e0: 28 28 66 6c 61 67 73 20 26 20 45 58 54 52 41 5f  ((flags & EXTRA_
24f0: 46 49 45 4c 44 29 20 21 3d 20 30 29 20 7b 20 2f  FIELD) != 0) { /
2500: 2a 20 73 6b 69 70 20 74 68 65 20 65 78 74 72 61  * skip the extra
2510: 20 66 69 65 6c 64 20 2a 2f 0a 09 6c 65 6e 20 20   field */..len  
2520: 3d 20 20 28 75 49 6e 74 29 67 65 74 5f 62 79 74  =  (uInt)get_byt
2530: 65 28 73 29 3b 0a 09 6c 65 6e 20 2b 3d 20 28 28  e(s);..len += ((
2540: 75 49 6e 74 29 67 65 74 5f 62 79 74 65 28 73 29  uInt)get_byte(s)
2550: 29 3c 3c 38 3b 0a 09 2f 2a 20 6c 65 6e 20 69 73  )<<8;../* len is
2560: 20 67 61 72 62 61 67 65 20 69 66 20 45 4f 46 20   garbage if EOF 
2570: 62 75 74 20 74 68 65 20 6c 6f 6f 70 20 62 65 6c  but the loop bel
2580: 6f 77 20 77 69 6c 6c 20 71 75 69 74 20 61 6e 79  ow will quit any
2590: 77 61 79 20 2a 2f 0a 09 77 68 69 6c 65 20 28 6c  way */..while (l
25a0: 65 6e 2d 2d 20 21 3d 20 30 20 26 26 20 67 65 74  en-- != 0 && get
25b0: 5f 62 79 74 65 28 73 29 20 21 3d 20 45 4f 46 29  _byte(s) != EOF)
25c0: 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   ;.    }.    if 
25d0: 28 28 66 6c 61 67 73 20 26 20 4f 52 49 47 5f 4e  ((flags & ORIG_N
25e0: 41 4d 45 29 20 21 3d 20 30 29 20 7b 20 2f 2a 20  AME) != 0) { /* 
25f0: 73 6b 69 70 20 74 68 65 20 6f 72 69 67 69 6e 61  skip the origina
2600: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 09  l file name */..
2610: 77 68 69 6c 65 20 28 28 63 20 3d 20 67 65 74 5f  while ((c = get_
2620: 62 79 74 65 28 73 29 29 20 21 3d 20 30 20 26 26  byte(s)) != 0 &&
2630: 20 63 20 21 3d 20 45 4f 46 29 20 3b 0a 20 20 20   c != EOF) ;.   
2640: 20 7d 0a 20 20 20 20 69 66 20 28 28 66 6c 61 67   }.    if ((flag
2650: 73 20 26 20 43 4f 4d 4d 45 4e 54 29 20 21 3d 20  s & COMMENT) != 
2660: 30 29 20 7b 20 20 20 2f 2a 20 73 6b 69 70 20 74  0) {   /* skip t
2670: 68 65 20 2e 67 7a 20 66 69 6c 65 20 63 6f 6d 6d  he .gz file comm
2680: 65 6e 74 20 2a 2f 0a 09 77 68 69 6c 65 20 28 28  ent */..while ((
2690: 63 20 3d 20 67 65 74 5f 62 79 74 65 28 73 29 29  c = get_byte(s))
26a0: 20 21 3d 20 30 20 26 26 20 63 20 21 3d 20 45 4f   != 0 && c != EO
26b0: 46 29 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  F) ;.    }.    i
26c0: 66 20 28 28 66 6c 61 67 73 20 26 20 48 45 41 44  f ((flags & HEAD
26d0: 5f 43 52 43 29 20 21 3d 20 30 29 20 7b 20 20 2f  _CRC) != 0) {  /
26e0: 2a 20 73 6b 69 70 20 74 68 65 20 68 65 61 64 65  * skip the heade
26f0: 72 20 63 72 63 20 2a 2f 0a 09 66 6f 72 20 28 6c  r crc */..for (l
2700: 65 6e 20 3d 20 30 3b 20 6c 65 6e 20 3c 20 32 3b  en = 0; len < 2;
2710: 20 6c 65 6e 2b 2b 29 20 28 76 6f 69 64 29 67 65   len++) (void)ge
2720: 74 5f 62 79 74 65 28 73 29 3b 0a 20 20 20 20 7d  t_byte(s);.    }
2730: 0a 20 20 20 20 73 2d 3e 7a 5f 65 72 72 20 3d 20  .    s->z_err = 
2740: 73 2d 3e 7a 5f 65 6f 66 20 3f 20 5a 5f 44 41 54  s->z_eof ? Z_DAT
2750: 41 5f 45 52 52 4f 52 20 3a 20 5a 5f 4f 4b 3b 0a  A_ERROR : Z_OK;.
2760: 7d 0a 0a 20 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d  }.. /* =========
2770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
27a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
27b0: 3d 3d 0a 20 2a 20 43 6c 65 61 6e 75 70 20 74 68  ==. * Cleanup th
27c0: 65 6e 20 66 72 65 65 20 74 68 65 20 67 69 76 65  en free the give
27d0: 6e 20 67 7a 5f 73 74 72 65 61 6d 2e 20 52 65 74  n gz_stream. Ret
27e0: 75 72 6e 20 61 20 7a 6c 69 62 20 65 72 72 6f 72  urn a zlib error
27f0: 20 63 6f 64 65 2e 0a 20 20 20 54 72 79 20 66 72   code..   Try fr
2800: 65 65 69 6e 67 20 69 6e 20 74 68 65 20 72 65 76  eeing in the rev
2810: 65 72 73 65 20 6f 72 64 65 72 20 6f 66 20 61 6c  erse order of al
2820: 6c 6f 63 61 74 69 6f 6e 73 2e 0a 20 2a 2f 0a 6c  locations.. */.l
2830: 6f 63 61 6c 20 69 6e 74 20 64 65 73 74 72 6f 79  ocal int destroy
2840: 20 28 73 29 0a 20 20 20 20 67 7a 5f 73 74 72 65   (s).    gz_stre
2850: 61 6d 20 2a 73 3b 0a 7b 0a 20 20 20 20 69 6e 74  am *s;.{.    int
2860: 20 65 72 72 20 3d 20 5a 5f 4f 4b 3b 0a 0a 20 20   err = Z_OK;..  
2870: 20 20 69 66 20 28 21 73 29 20 72 65 74 75 72 6e    if (!s) return
2880: 20 5a 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52 3b   Z_STREAM_ERROR;
2890: 0a 0a 20 20 20 20 54 52 59 46 52 45 45 28 73 2d  ..    TRYFREE(s-
28a0: 3e 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66 20 28  >msg);..    if (
28b0: 73 2d 3e 73 74 72 65 61 6d 2e 73 74 61 74 65 20  s->stream.state 
28c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28  != NULL) {..if (
28d0: 73 2d 3e 6d 6f 64 65 20 3d 3d 20 27 77 27 29 20  s->mode == 'w') 
28e0: 7b 0a 23 69 66 64 65 66 20 4e 4f 5f 44 45 46 4c  {.#ifdef NO_DEFL
28f0: 41 54 45 0a 09 20 20 20 20 65 72 72 20 3d 20 5a  ATE..    err = Z
2900: 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52 3b 0a 23  _STREAM_ERROR;.#
2910: 65 6c 73 65 0a 09 20 20 20 20 65 72 72 20 3d 20  else..    err = 
2920: 64 65 66 6c 61 74 65 45 6e 64 28 26 28 73 2d 3e  deflateEnd(&(s->
2930: 73 74 72 65 61 6d 29 29 3b 0a 23 65 6e 64 69 66  stream));.#endif
2940: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73 2d 3e  ..} else if (s->
2950: 6d 6f 64 65 20 3d 3d 20 27 72 27 29 20 7b 0a 09  mode == 'r') {..
2960: 20 20 20 20 65 72 72 20 3d 20 69 6e 66 6c 61 74      err = inflat
2970: 65 45 6e 64 28 26 28 73 2d 3e 73 74 72 65 61 6d  eEnd(&(s->stream
2980: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20  ));..}.    }.   
2990: 20 69 66 20 28 73 2d 3e 66 69 6c 65 20 21 3d 20   if (s->file != 
29a0: 4e 55 4c 4c 20 26 26 20 66 63 6c 6f 73 65 28 73  NULL && fclose(s
29b0: 2d 3e 66 69 6c 65 29 29 20 7b 0a 23 69 66 64 65  ->file)) {.#ifde
29c0: 66 20 45 53 50 49 50 45 0a 09 69 66 20 28 65 72  f ESPIPE..if (er
29d0: 72 6e 6f 20 21 3d 20 45 53 50 49 50 45 29 20 2f  rno != ESPIPE) /
29e0: 2a 20 66 63 6c 6f 73 65 20 69 73 20 62 72 6f 6b  * fclose is brok
29f0: 65 6e 20 66 6f 72 20 70 69 70 65 73 20 69 6e 20  en for pipes in 
2a00: 48 50 2f 55 58 20 2a 2f 0a 23 65 6e 64 69 66 0a  HP/UX */.#endif.
2a10: 09 20 20 20 20 65 72 72 20 3d 20 5a 5f 45 52 52  .    err = Z_ERR
2a20: 4e 4f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  NO;.    }.    if
2a30: 20 28 73 2d 3e 7a 5f 65 72 72 20 3c 20 30 29 20   (s->z_err < 0) 
2a40: 65 72 72 20 3d 20 73 2d 3e 7a 5f 65 72 72 3b 0a  err = s->z_err;.
2a50: 0a 20 20 20 20 54 52 59 46 52 45 45 28 73 2d 3e  .    TRYFREE(s->
2a60: 69 6e 62 75 66 29 3b 0a 20 20 20 20 54 52 59 46  inbuf);.    TRYF
2a70: 52 45 45 28 73 2d 3e 6f 75 74 62 75 66 29 3b 0a  REE(s->outbuf);.
2a80: 20 20 20 20 54 52 59 46 52 45 45 28 73 2d 3e 70      TRYFREE(s->p
2a90: 61 74 68 29 3b 0a 20 20 20 20 54 52 59 46 52 45  ath);.    TRYFRE
2aa0: 45 28 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E(s);.    return
2ab0: 20 65 72 72 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d   err;.}../* ====
2ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2b00: 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20 52 65 61  =======.     Rea
2b10: 64 73 20 74 68 65 20 67 69 76 65 6e 20 6e 75 6d  ds the given num
2b20: 62 65 72 20 6f 66 20 75 6e 63 6f 6d 70 72 65 73  ber of uncompres
2b30: 73 65 64 20 62 79 74 65 73 20 66 72 6f 6d 20 74  sed bytes from t
2b40: 68 65 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69  he compressed fi
2b50: 6c 65 2e 0a 20 20 20 67 7a 72 65 61 64 20 72 65  le..   gzread re
2b60: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
2b70: 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
2b80: 6c 79 20 72 65 61 64 20 28 30 20 66 6f 72 20 65  ly read (0 for e
2b90: 6e 64 20 6f 66 20 66 69 6c 65 29 2e 0a 2a 2f 0a  nd of file)..*/.
2ba0: 69 6e 74 20 5a 45 58 50 4f 52 54 20 67 7a 72 65  int ZEXPORT gzre
2bb0: 61 64 20 28 66 69 6c 65 2c 20 62 75 66 2c 20 6c  ad (file, buf, l
2bc0: 65 6e 29 0a 20 20 20 20 67 7a 46 69 6c 65 20 66  en).    gzFile f
2bd0: 69 6c 65 3b 0a 20 20 20 20 76 6f 69 64 70 20 62  ile;.    voidp b
2be0: 75 66 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  uf;.    unsigned
2bf0: 20 6c 65 6e 3b 0a 7b 0a 20 20 20 20 67 7a 5f 73   len;.{.    gz_s
2c00: 74 72 65 61 6d 20 2a 73 20 3d 20 28 67 7a 5f 73  tream *s = (gz_s
2c10: 74 72 65 61 6d 2a 29 66 69 6c 65 3b 0a 20 20 20  tream*)file;.   
2c20: 20 42 79 74 65 66 20 2a 73 74 61 72 74 20 3d 20   Bytef *start = 
2c30: 28 42 79 74 65 66 2a 29 62 75 66 3b 20 2f 2a 20  (Bytef*)buf; /* 
2c40: 73 74 61 72 74 69 6e 67 20 70 6f 69 6e 74 20 66  starting point f
2c50: 6f 72 20 63 72 63 20 63 6f 6d 70 75 74 61 74 69  or crc computati
2c60: 6f 6e 20 2a 2f 0a 20 20 20 20 42 79 74 65 20 20  on */.    Byte  
2c70: 2a 6e 65 78 74 5f 6f 75 74 3b 20 2f 2a 20 3d 3d  *next_out; /* ==
2c80: 20 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74   stream.next_out
2c90: 20 62 75 74 20 6e 6f 74 20 66 6f 72 63 65 64 20   but not forced 
2ca0: 66 61 72 20 28 66 6f 72 20 4d 53 44 4f 53 29 20  far (for MSDOS) 
2cb0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 20 3d 3d  */..    if (s ==
2cc0: 20 4e 55 4c 4c 20 7c 7c 20 73 2d 3e 6d 6f 64 65   NULL || s->mode
2cd0: 20 21 3d 20 27 72 27 29 20 72 65 74 75 72 6e 20   != 'r') return 
2ce0: 5a 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52 3b 0a  Z_STREAM_ERROR;.
2cf0: 0a 20 20 20 20 69 66 20 28 73 2d 3e 7a 5f 65 72  .    if (s->z_er
2d00: 72 20 3d 3d 20 5a 5f 44 41 54 41 5f 45 52 52 4f  r == Z_DATA_ERRO
2d10: 52 20 7c 7c 20 73 2d 3e 7a 5f 65 72 72 20 3d 3d  R || s->z_err ==
2d20: 20 5a 5f 45 52 52 4e 4f 29 20 72 65 74 75 72 6e   Z_ERRNO) return
2d30: 20 2d 31 3b 0a 20 20 20 20 69 66 20 28 73 2d 3e   -1;.    if (s->
2d40: 7a 5f 65 72 72 20 3d 3d 20 5a 5f 53 54 52 45 41  z_err == Z_STREA
2d50: 4d 5f 45 4e 44 29 20 72 65 74 75 72 6e 20 30 3b  M_END) return 0;
2d60: 20 20 2f 2a 20 45 4f 46 20 2a 2f 0a 0a 20 20 20    /* EOF */..   
2d70: 20 6e 65 78 74 5f 6f 75 74 20 3d 20 28 42 79 74   next_out = (Byt
2d80: 65 2a 29 62 75 66 3b 0a 20 20 20 20 73 2d 3e 73  e*)buf;.    s->s
2d90: 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75 74 20 3d  tream.next_out =
2da0: 20 28 42 79 74 65 66 2a 29 62 75 66 3b 0a 20 20   (Bytef*)buf;.  
2db0: 20 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69    s->stream.avai
2dc0: 6c 5f 6f 75 74 20 3d 20 6c 65 6e 3b 0a 0a 20 20  l_out = len;..  
2dd0: 20 20 77 68 69 6c 65 20 28 73 2d 3e 73 74 72 65    while (s->stre
2de0: 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20 21 3d 20  am.avail_out != 
2df0: 30 29 20 7b 0a 0a 09 69 66 20 28 73 2d 3e 74 72  0) {...if (s->tr
2e00: 61 6e 73 70 61 72 65 6e 74 29 20 7b 0a 09 20 20  ansparent) {..  
2e10: 20 20 2f 2a 20 43 6f 70 79 20 66 69 72 73 74 20    /* Copy first 
2e20: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 62 79  the lookahead by
2e30: 74 65 73 3a 20 2a 2f 0a 09 20 20 20 20 75 49 6e  tes: */..    uIn
2e40: 74 20 6e 20 3d 20 73 2d 3e 73 74 72 65 61 6d 2e  t n = s->stream.
2e50: 61 76 61 69 6c 5f 69 6e 3b 0a 09 20 20 20 20 69  avail_in;..    i
2e60: 66 20 28 6e 20 3e 20 73 2d 3e 73 74 72 65 61 6d  f (n > s->stream
2e70: 2e 61 76 61 69 6c 5f 6f 75 74 29 20 6e 20 3d 20  .avail_out) n = 
2e80: 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  s->stream.avail_
2e90: 6f 75 74 3b 0a 09 20 20 20 20 69 66 20 28 6e 20  out;..    if (n 
2ea0: 3e 20 30 29 20 7b 0a 09 09 7a 6d 65 6d 63 70 79  > 0) {...zmemcpy
2eb0: 28 73 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74 5f  (s->stream.next_
2ec0: 6f 75 74 2c 20 73 2d 3e 73 74 72 65 61 6d 2e 6e  out, s->stream.n
2ed0: 65 78 74 5f 69 6e 2c 20 6e 29 3b 0a 09 09 6e 65  ext_in, n);...ne
2ee0: 78 74 5f 6f 75 74 20 2b 3d 20 6e 3b 0a 09 09 73  xt_out += n;...s
2ef0: 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74 5f 6f 75  ->stream.next_ou
2f00: 74 20 3d 20 6e 65 78 74 5f 6f 75 74 3b 0a 09 09  t = next_out;...
2f10: 73 2d 3e 73 74 72 65 61 6d 2e 6e 65 78 74 5f 69  s->stream.next_i
2f20: 6e 20 20 20 2b 3d 20 6e 3b 0a 09 09 73 2d 3e 73  n   += n;...s->s
2f30: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
2f40: 2d 3d 20 6e 3b 0a 09 09 73 2d 3e 73 74 72 65 61  -= n;...s->strea
2f50: 6d 2e 61 76 61 69 6c 5f 69 6e 20 20 2d 3d 20 6e  m.avail_in  -= n
2f60: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
2f70: 20 28 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69   (s->stream.avai
2f80: 6c 5f 6f 75 74 20 3e 20 30 29 20 7b 0a 09 09 73  l_out > 0) {...s
2f90: 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f  ->stream.avail_o
2fa0: 75 74 20 2d 3d 20 66 72 65 61 64 28 6e 65 78 74  ut -= fread(next
2fb0: 5f 6f 75 74 2c 20 31 2c 20 73 2d 3e 73 74 72 65  _out, 1, s->stre
2fc0: 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 2c 0a 09 09  am.avail_out,...
2fd0: 09 09 09 20 20 20 20 20 73 2d 3e 66 69 6c 65 29  ...     s->file)
2fe0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c 65  ;..    }..    le
2ff0: 6e 20 2d 3d 20 73 2d 3e 73 74 72 65 61 6d 2e 61  n -= s->stream.a
3000: 76 61 69 6c 5f 6f 75 74 3b 0a 09 20 20 20 20 73  vail_out;..    s
3010: 2d 3e 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 69  ->stream.total_i
3020: 6e 20 20 2b 3d 20 28 75 4c 6f 6e 67 29 6c 65 6e  n  += (uLong)len
3030: 3b 0a 09 20 20 20 20 73 2d 3e 73 74 72 65 61 6d  ;..    s->stream
3040: 2e 74 6f 74 61 6c 5f 6f 75 74 20 2b 3d 20 28 75  .total_out += (u
3050: 4c 6f 6e 67 29 6c 65 6e 3b 0a 20 20 20 20 20 20  Long)len;.      
3060: 20 20 20 20 20 20 69 66 20 28 6c 65 6e 20 3d 3d        if (len ==
3070: 20 30 29 20 73 2d 3e 7a 5f 65 6f 66 20 3d 20 31   0) s->z_eof = 1
3080: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3090: 6e 74 29 6c 65 6e 3b 0a 09 7d 0a 20 20 20 20 20  nt)len;..}.     
30a0: 20 20 20 69 66 20 28 73 2d 3e 73 74 72 65 61 6d     if (s->stream
30b0: 2e 61 76 61 69 6c 5f 69 6e 20 3d 3d 20 30 20 26  .avail_in == 0 &
30c0: 26 20 21 73 2d 3e 7a 5f 65 6f 66 29 20 7b 0a 0a  & !s->z_eof) {..
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6e              errn
30e0: 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  o = 0;.         
30f0: 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61     s->stream.ava
3100: 69 6c 5f 69 6e 20 3d 20 66 72 65 61 64 28 73 2d  il_in = fread(s-
3110: 3e 69 6e 62 75 66 2c 20 31 2c 20 5a 5f 42 55 46  >inbuf, 1, Z_BUF
3120: 53 49 5a 45 2c 20 73 2d 3e 66 69 6c 65 29 3b 0a  SIZE, s->file);.
3130: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
3140: 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  s->stream.avail_
3150: 69 6e 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  in == 0) {.     
3160: 20 20 20 20 20 20 20 20 20 20 20 73 2d 3e 7a 5f             s->z_
3170: 65 6f 66 20 3d 20 31 3b 0a 09 09 69 66 20 28 66  eof = 1;...if (f
3180: 65 72 72 6f 72 28 73 2d 3e 66 69 6c 65 29 29 20  error(s->file)) 
3190: 7b 0a 09 09 20 20 20 20 73 2d 3e 7a 5f 65 72 72  {...    s->z_err
31a0: 20 3d 20 5a 5f 45 52 52 4e 4f 3b 0a 09 09 20 20   = Z_ERRNO;...  
31b0: 20 20 62 72 65 61 6b 3b 0a 09 09 7d 0a 20 20 20    break;...}.   
31c0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
31d0: 20 20 20 20 20 20 20 73 2d 3e 73 74 72 65 61 6d         s->stream
31e0: 2e 6e 65 78 74 5f 69 6e 20 3d 20 73 2d 3e 69 6e  .next_in = s->in
31f0: 62 75 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  buf;.        }. 
3200: 20 20 20 20 20 20 20 73 2d 3e 7a 5f 65 72 72 20         s->z_err 
3210: 3d 20 69 6e 66 6c 61 74 65 28 26 28 73 2d 3e 73  = inflate(&(s->s
3220: 74 72 65 61 6d 29 2c 20 5a 5f 4e 4f 5f 46 4c 55  tream), Z_NO_FLU
3230: 53 48 29 3b 0a 0a 09 69 66 20 28 73 2d 3e 7a 5f  SH);...if (s->z_
3240: 65 72 72 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f  err == Z_STREAM_
3250: 45 4e 44 29 20 7b 0a 09 20 20 20 20 2f 2a 20 43  END) {..    /* C
3260: 68 65 63 6b 20 43 52 43 20 61 6e 64 20 6f 72 69  heck CRC and ori
3270: 67 69 6e 61 6c 20 73 69 7a 65 20 2a 2f 0a 09 20  ginal size */.. 
3280: 20 20 20 73 2d 3e 63 72 63 20 3d 20 63 72 63 33     s->crc = crc3
3290: 32 28 73 2d 3e 63 72 63 2c 20 73 74 61 72 74 2c  2(s->crc, start,
32a0: 20 28 75 49 6e 74 29 28 73 2d 3e 73 74 72 65 61   (uInt)(s->strea
32b0: 6d 2e 6e 65 78 74 5f 6f 75 74 20 2d 20 73 74 61  m.next_out - sta
32c0: 72 74 29 29 3b 0a 09 20 20 20 20 73 74 61 72 74  rt));..    start
32d0: 20 3d 20 73 2d 3e 73 74 72 65 61 6d 2e 6e 65 78   = s->stream.nex
32e0: 74 5f 6f 75 74 3b 0a 0a 09 20 20 20 20 69 66 20  t_out;...    if 
32f0: 28 67 65 74 4c 6f 6e 67 28 73 29 20 21 3d 20 73  (getLong(s) != s
3300: 2d 3e 63 72 63 29 20 7b 0a 09 09 73 2d 3e 7a 5f  ->crc) {...s->z_
3310: 65 72 72 20 3d 20 5a 5f 44 41 54 41 5f 45 52 52  err = Z_DATA_ERR
3320: 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
3330: 7b 0a 09 20 20 20 20 20 20 20 20 28 76 6f 69 64  {..        (void
3340: 29 67 65 74 4c 6f 6e 67 28 73 29 3b 0a 20 20 20  )getLong(s);.   
3350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3360: 54 68 65 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  The uncompressed
3370: 20 6c 65 6e 67 74 68 20 72 65 74 75 72 6e 65 64   length returned
3380: 20 62 79 20 61 62 6f 76 65 20 67 65 74 6c 6f 6e   by above getlon
3390: 67 28 29 20 6d 61 79 0a 20 20 20 20 20 20 20 20  g() may.        
33a0: 20 20 20 20 20 20 20 20 20 2a 20 62 65 20 64 69           * be di
33b0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 73 2d 3e  fferent from s->
33c0: 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74  stream.total_out
33d0: 29 20 69 6e 20 63 61 73 65 20 6f 66 0a 09 09 20  ) in case of... 
33e0: 2a 20 63 6f 6e 63 61 74 65 6e 61 74 65 64 20 2e  * concatenated .
33f0: 67 7a 20 66 69 6c 65 73 2e 20 43 68 65 63 6b 20  gz files. Check 
3400: 66 6f 72 20 73 75 63 68 20 66 69 6c 65 73 3a 0a  for such files:.
3410: 09 09 20 2a 2f 0a 09 09 63 68 65 63 6b 5f 68 65  .. */...check_he
3420: 61 64 65 72 28 73 29 3b 0a 09 09 69 66 20 28 73  ader(s);...if (s
3430: 2d 3e 7a 5f 65 72 72 20 3d 3d 20 5a 5f 4f 4b 29  ->z_err == Z_OK)
3440: 20 7b 0a 09 09 20 20 20 20 75 4c 6f 6e 67 20 74   {...    uLong t
3450: 6f 74 61 6c 5f 69 6e 20 3d 20 73 2d 3e 73 74 72  otal_in = s->str
3460: 65 61 6d 2e 74 6f 74 61 6c 5f 69 6e 3b 0a 09 09  eam.total_in;...
3470: 20 20 20 20 75 4c 6f 6e 67 20 74 6f 74 61 6c 5f      uLong total_
3480: 6f 75 74 20 3d 20 73 2d 3e 73 74 72 65 61 6d 2e  out = s->stream.
3490: 74 6f 74 61 6c 5f 6f 75 74 3b 0a 0a 09 09 20 20  total_out;....  
34a0: 20 20 69 6e 66 6c 61 74 65 52 65 73 65 74 28 26    inflateReset(&
34b0: 28 73 2d 3e 73 74 72 65 61 6d 29 29 3b 0a 09 09  (s->stream));...
34c0: 20 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 74 6f      s->stream.to
34d0: 74 61 6c 5f 69 6e 20 3d 20 74 6f 74 61 6c 5f 69  tal_in = total_i
34e0: 6e 3b 0a 09 09 20 20 20 20 73 2d 3e 73 74 72 65  n;...    s->stre
34f0: 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 20 3d 20 74  am.total_out = t
3500: 6f 74 61 6c 5f 6f 75 74 3b 0a 09 09 20 20 20 20  otal_out;...    
3510: 73 2d 3e 63 72 63 20 3d 20 63 72 63 33 32 28 30  s->crc = crc32(0
3520: 4c 2c 20 5a 5f 4e 55 4c 4c 2c 20 30 29 3b 0a 09  L, Z_NULL, 0);..
3530: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66  .}..    }..}..if
3540: 20 28 73 2d 3e 7a 5f 65 72 72 20 21 3d 20 5a 5f   (s->z_err != Z_
3550: 4f 4b 20 7c 7c 20 73 2d 3e 7a 5f 65 6f 66 29 20  OK || s->z_eof) 
3560: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3570: 20 73 2d 3e 63 72 63 20 3d 20 63 72 63 33 32 28   s->crc = crc32(
3580: 73 2d 3e 63 72 63 2c 20 73 74 61 72 74 2c 20 28  s->crc, start, (
3590: 75 49 6e 74 29 28 73 2d 3e 73 74 72 65 61 6d 2e  uInt)(s->stream.
35a0: 6e 65 78 74 5f 6f 75 74 20 2d 20 73 74 61 72 74  next_out - start
35b0: 29 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  ));..    return 
35c0: 28 69 6e 74 29 28 6c 65 6e 20 2d 20 73 2d 3e 73  (int)(len - s->s
35d0: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 29  tream.avail_out)
35e0: 3b 0a 7d 0a 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d  ;.}.../* =======
35f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3630: 3d 3d 3d 3d 0a 20 20 20 20 20 20 52 65 61 64 73  ====.      Reads
3640: 20 6f 6e 65 20 62 79 74 65 20 66 72 6f 6d 20 74   one byte from t
3650: 68 65 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69  he compressed fi
3660: 6c 65 2e 20 67 7a 67 65 74 63 20 72 65 74 75 72  le. gzgetc retur
3670: 6e 73 20 74 68 69 73 20 62 79 74 65 0a 20 20 20  ns this byte.   
3680: 6f 72 20 2d 31 20 69 6e 20 63 61 73 65 20 6f 66  or -1 in case of
3690: 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 6f 72 20   end of file or 
36a0: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 5a 45  error..*/.int ZE
36b0: 58 50 4f 52 54 20 67 7a 67 65 74 63 28 66 69 6c  XPORT gzgetc(fil
36c0: 65 29 0a 20 20 20 20 67 7a 46 69 6c 65 20 66 69  e).    gzFile fi
36d0: 6c 65 3b 0a 7b 0a 20 20 20 20 75 6e 73 69 67 6e  le;.{.    unsign
36e0: 65 64 20 63 68 61 72 20 63 3b 0a 0a 20 20 20 20  ed char c;..    
36f0: 72 65 74 75 72 6e 20 67 7a 72 65 61 64 28 66 69  return gzread(fi
3700: 6c 65 2c 20 26 63 2c 20 31 29 20 3d 3d 20 31 20  le, &c, 1) == 1 
3710: 3f 20 63 20 3a 20 2d 31 3b 0a 7d 0a 0a 0a 2f 2a  ? c : -1;.}.../*
3720: 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   ===============
3730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20  ============.   
3770: 20 20 20 52 65 61 64 73 20 62 79 74 65 73 20 66     Reads bytes f
3780: 72 6f 6d 20 74 68 65 20 63 6f 6d 70 72 65 73 73  rom the compress
3790: 65 64 20 66 69 6c 65 20 75 6e 74 69 6c 20 6c 65  ed file until le
37a0: 6e 2d 31 20 63 68 61 72 61 63 74 65 72 73 20 61  n-1 characters a
37b0: 72 65 0a 20 20 20 72 65 61 64 2c 20 6f 72 20 61  re.   read, or a
37c0: 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74   newline charact
37d0: 65 72 20 69 73 20 72 65 61 64 20 61 6e 64 20 74  er is read and t
37e0: 72 61 6e 73 66 65 72 72 65 64 20 74 6f 20 62 75  ransferred to bu
37f0: 66 2c 20 6f 72 20 61 6e 0a 20 20 20 65 6e 64 2d  f, or an.   end-
3800: 6f 66 2d 66 69 6c 65 20 63 6f 6e 64 69 74 69 6f  of-file conditio
3810: 6e 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  n is encountered
3820: 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
3830: 20 74 68 65 6e 20 74 65 72 6d 69 6e 61 74 65 64   then terminated
3840: 0a 20 20 20 77 69 74 68 20 61 20 6e 75 6c 6c 20  .   with a null 
3850: 63 68 61 72 61 63 74 65 72 2e 0a 20 20 20 20 20  character..     
3860: 20 67 7a 67 65 74 73 20 72 65 74 75 72 6e 73 20   gzgets returns 
3870: 62 75 66 2c 20 6f 72 20 5a 5f 4e 55 4c 4c 20 69  buf, or Z_NULL i
3880: 6e 20 63 61 73 65 20 6f 66 20 65 72 72 6f 72 2e  n case of error.
3890: 0a 0a 20 20 20 20 20 20 54 68 65 20 63 75 72 72  ..      The curr
38a0: 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ent implementati
38b0: 6f 6e 20 69 73 20 6e 6f 74 20 6f 70 74 69 6d 69  on is not optimi
38c0: 7a 65 64 20 61 74 20 61 6c 6c 2e 0a 2a 2f 0a 63  zed at all..*/.c
38d0: 68 61 72 20 2a 20 5a 45 58 50 4f 52 54 20 67 7a  har * ZEXPORT gz
38e0: 67 65 74 73 28 66 69 6c 65 2c 20 62 75 66 2c 20  gets(file, buf, 
38f0: 6c 65 6e 29 0a 20 20 20 20 67 7a 46 69 6c 65 20  len).    gzFile 
3900: 66 69 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a  file;.    char *
3910: 62 75 66 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  buf;.    int len
3920: 3b 0a 7b 0a 20 20 20 20 63 68 61 72 20 2a 62 20  ;.{.    char *b 
3930: 3d 20 62 75 66 3b 0a 20 20 20 20 69 66 20 28 62  = buf;.    if (b
3940: 75 66 20 3d 3d 20 5a 5f 4e 55 4c 4c 20 7c 7c 20  uf == Z_NULL || 
3950: 6c 65 6e 20 3c 3d 20 30 29 20 72 65 74 75 72 6e  len <= 0) return
3960: 20 5a 5f 4e 55 4c 4c 3b 0a 0a 20 20 20 20 77 68   Z_NULL;..    wh
3970: 69 6c 65 20 28 2d 2d 6c 65 6e 20 3e 20 30 20 26  ile (--len > 0 &
3980: 26 20 67 7a 72 65 61 64 28 66 69 6c 65 2c 20 62  & gzread(file, b
3990: 75 66 2c 20 31 29 20 3d 3d 20 31 20 26 26 20 2a  uf, 1) == 1 && *
39a0: 62 75 66 2b 2b 20 21 3d 20 27 5c 6e 27 29 20 3b  buf++ != '\n') ;
39b0: 0a 20 20 20 20 2a 62 75 66 20 3d 20 27 5c 30 27  .    *buf = '\0'
39c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 20 3d  ;.    return b =
39d0: 3d 20 62 75 66 20 26 26 20 6c 65 6e 20 3e 20 30  = buf && len > 0
39e0: 20 3f 20 5a 5f 4e 55 4c 4c 20 3a 20 62 3b 0a 7d   ? Z_NULL : b;.}
39f0: 0a 0a 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 44 45  ...#ifndef NO_DE
3a00: 46 4c 41 54 45 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d  FLATE./* =======
3a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3a50: 3d 3d 3d 3d 0a 20 20 20 20 20 57 72 69 74 65 73  ====.     Writes
3a60: 20 74 68 65 20 67 69 76 65 6e 20 6e 75 6d 62 65   the given numbe
3a70: 72 20 6f 66 20 75 6e 63 6f 6d 70 72 65 73 73 65  r of uncompresse
3a80: 64 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 65  d bytes into the
3a90: 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69 6c 65   compressed file
3aa0: 2e 0a 20 20 20 67 7a 77 72 69 74 65 20 72 65 74  ..   gzwrite ret
3ab0: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
3ac0: 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
3ad0: 79 20 77 72 69 74 74 65 6e 20 28 30 20 69 6e 20  y written (0 in 
3ae0: 63 61 73 65 20 6f 66 20 65 72 72 6f 72 29 2e 0a  case of error)..
3af0: 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f 52 54 20 67  */.int ZEXPORT g
3b00: 7a 77 72 69 74 65 20 28 66 69 6c 65 2c 20 62 75  zwrite (file, bu
3b10: 66 2c 20 6c 65 6e 29 0a 20 20 20 20 67 7a 46 69  f, len).    gzFi
3b20: 6c 65 20 66 69 6c 65 3b 0a 20 20 20 20 63 6f 6e  le file;.    con
3b30: 73 74 20 76 6f 69 64 70 20 62 75 66 3b 0a 20 20  st voidp buf;.  
3b40: 20 20 75 6e 73 69 67 6e 65 64 20 6c 65 6e 3b 0a    unsigned len;.
3b50: 7b 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d 20  {.    gz_stream 
3b60: 2a 73 20 3d 20 28 67 7a 5f 73 74 72 65 61 6d 2a  *s = (gz_stream*
3b70: 29 66 69 6c 65 3b 0a 0a 20 20 20 20 69 66 20 28  )file;..    if (
3b80: 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 2d 3e  s == NULL || s->
3b90: 6d 6f 64 65 20 21 3d 20 27 77 27 29 20 72 65 74  mode != 'w') ret
3ba0: 75 72 6e 20 5a 5f 53 54 52 45 41 4d 5f 45 52 52  urn Z_STREAM_ERR
3bb0: 4f 52 3b 0a 0a 20 20 20 20 73 2d 3e 73 74 72 65  OR;..    s->stre
3bc0: 61 6d 2e 6e 65 78 74 5f 69 6e 20 3d 20 28 42 79  am.next_in = (By
3bd0: 74 65 66 2a 29 62 75 66 3b 0a 20 20 20 20 73 2d  tef*)buf;.    s-
3be0: 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e  >stream.avail_in
3bf0: 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 77 68 69   = len;..    whi
3c00: 6c 65 20 28 73 2d 3e 73 74 72 65 61 6d 2e 61 76  le (s->stream.av
3c10: 61 69 6c 5f 69 6e 20 21 3d 20 30 29 20 7b 0a 0a  ail_in != 0) {..
3c20: 20 20 20 20 20 20 20 20 69 66 20 28 73 2d 3e 73          if (s->s
3c30: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 6f 75 74 20  tream.avail_out 
3c40: 3d 3d 20 30 29 20 7b 0a 0a 20 20 20 20 20 20 20  == 0) {..       
3c50: 20 20 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 6e       s->stream.n
3c60: 65 78 74 5f 6f 75 74 20 3d 20 73 2d 3e 6f 75 74  ext_out = s->out
3c70: 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20  buf;.           
3c80: 20 69 66 20 28 66 77 72 69 74 65 28 73 2d 3e 6f   if (fwrite(s->o
3c90: 75 74 62 75 66 2c 20 31 2c 20 5a 5f 42 55 46 53  utbuf, 1, Z_BUFS
3ca0: 49 5a 45 2c 20 73 2d 3e 66 69 6c 65 29 20 21 3d  IZE, s->file) !=
3cb0: 20 5a 5f 42 55 46 53 49 5a 45 29 20 7b 0a 20 20   Z_BUFSIZE) {.  
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 2d                s-
3cd0: 3e 7a 5f 65 72 72 20 3d 20 5a 5f 45 52 52 4e 4f  >z_err = Z_ERRNO
3ce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3cf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3d00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3d10: 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61     s->stream.ava
3d20: 69 6c 5f 6f 75 74 20 3d 20 5a 5f 42 55 46 53 49  il_out = Z_BUFSI
3d30: 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ZE;.        }.  
3d40: 20 20 20 20 20 20 73 2d 3e 7a 5f 65 72 72 20 3d        s->z_err =
3d50: 20 64 65 66 6c 61 74 65 28 26 28 73 2d 3e 73 74   deflate(&(s->st
3d60: 72 65 61 6d 29 2c 20 5a 5f 4e 4f 5f 46 4c 55 53  ream), Z_NO_FLUS
3d70: 48 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28  H);.        if (
3d80: 73 2d 3e 7a 5f 65 72 72 20 21 3d 20 5a 5f 4f 4b  s->z_err != Z_OK
3d90: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
3da0: 20 20 20 73 2d 3e 63 72 63 20 3d 20 63 72 63 33     s->crc = crc3
3db0: 32 28 73 2d 3e 63 72 63 2c 20 28 63 6f 6e 73 74  2(s->crc, (const
3dc0: 20 42 79 74 65 66 20 2a 29 62 75 66 2c 20 6c 65   Bytef *)buf, le
3dd0: 6e 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  n);..    return 
3de0: 28 69 6e 74 29 28 6c 65 6e 20 2d 20 73 2d 3e 73  (int)(len - s->s
3df0: 74 72 65 61 6d 2e 61 76 61 69 6c 5f 69 6e 29 3b  tream.avail_in);
3e00: 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d  .}../* =========
3e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e50: 3d 3d 0a 20 20 20 20 20 43 6f 6e 76 65 72 74 73  ==.     Converts
3e60: 2c 20 66 6f 72 6d 61 74 73 2c 20 61 6e 64 20 77  , formats, and w
3e70: 72 69 74 65 73 20 74 68 65 20 61 72 67 73 20 74  rites the args t
3e80: 6f 20 74 68 65 20 63 6f 6d 70 72 65 73 73 65 64  o the compressed
3e90: 20 66 69 6c 65 20 75 6e 64 65 72 0a 20 20 20 63   file under.   c
3ea0: 6f 6e 74 72 6f 6c 20 6f 66 20 74 68 65 20 66 6f  ontrol of the fo
3eb0: 72 6d 61 74 20 73 74 72 69 6e 67 2c 20 61 73 20  rmat string, as 
3ec0: 69 6e 20 66 70 72 69 6e 74 66 2e 20 67 7a 70 72  in fprintf. gzpr
3ed0: 69 6e 74 66 20 72 65 74 75 72 6e 73 20 74 68 65  intf returns the
3ee0: 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 75 6e   number of.   un
3ef0: 63 6f 6d 70 72 65 73 73 65 64 20 62 79 74 65 73  compressed bytes
3f00: 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65   actually writte
3f10: 6e 20 28 30 20 69 6e 20 63 61 73 65 20 6f 66 20  n (0 in case of 
3f20: 65 72 72 6f 72 29 2e 0a 2a 2f 0a 23 69 66 64 65  error)..*/.#ifde
3f30: 66 20 53 54 44 43 0a 23 69 6e 63 6c 75 64 65 20  f STDC.#include 
3f40: 3c 73 74 64 61 72 67 2e 68 3e 0a 0a 69 6e 74 20  <stdarg.h>..int 
3f50: 5a 45 58 50 4f 52 54 56 41 20 67 7a 70 72 69 6e  ZEXPORTVA gzprin
3f60: 74 66 20 28 67 7a 46 69 6c 65 20 66 69 6c 65 2c  tf (gzFile file,
3f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
3f80: 6d 61 74 2c 20 2f 2a 20 61 72 67 73 20 2a 2f 20  mat, /* args */ 
3f90: 2e 2e 2e 29 0a 7b 0a 20 20 20 20 63 68 61 72 20  ...).{.    char 
3fa0: 62 75 66 5b 5a 5f 50 52 49 4e 54 46 5f 42 55 46  buf[Z_PRINTF_BUF
3fb0: 53 49 5a 45 5d 3b 0a 20 20 20 20 76 61 5f 6c 69  SIZE];.    va_li
3fc0: 73 74 20 76 61 3b 0a 20 20 20 20 69 6e 74 20 6c  st va;.    int l
3fd0: 65 6e 3b 0a 0a 20 20 20 20 76 61 5f 73 74 61 72  en;..    va_star
3fe0: 74 28 76 61 2c 20 66 6f 72 6d 61 74 29 3b 0a 23  t(va, format);.#
3ff0: 69 66 64 65 66 20 48 41 53 5f 76 73 6e 70 72 69  ifdef HAS_vsnpri
4000: 6e 74 66 0a 20 20 20 20 28 76 6f 69 64 29 76 73  ntf.    (void)vs
4010: 6e 70 72 69 6e 74 66 28 62 75 66 2c 20 73 69 7a  nprintf(buf, siz
4020: 65 6f 66 28 62 75 66 29 2c 20 66 6f 72 6d 61 74  eof(buf), format
4030: 2c 20 76 61 29 3b 0a 23 65 6c 73 65 0a 20 20 20  , va);.#else.   
4040: 20 28 76 6f 69 64 29 76 73 70 72 69 6e 74 66 28   (void)vsprintf(
4050: 62 75 66 2c 20 66 6f 72 6d 61 74 2c 20 76 61 29  buf, format, va)
4060: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 76 61 5f  ;.#endif.    va_
4070: 65 6e 64 28 76 61 29 3b 0a 20 20 20 20 6c 65 6e  end(va);.    len
4080: 20 3d 20 73 74 72 6c 65 6e 28 62 75 66 29 3b 20   = strlen(buf); 
4090: 2f 2a 20 73 6f 6d 65 20 2a 73 70 72 69 6e 74 66  /* some *sprintf
40a0: 20 64 6f 6e 27 74 20 72 65 74 75 72 6e 20 74 68   don't return th
40b0: 65 20 6e 62 20 6f 66 20 62 79 74 65 73 20 77 72  e nb of bytes wr
40c0: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 66 20  itten */.    if 
40d0: 28 6c 65 6e 20 3c 3d 20 30 29 20 72 65 74 75 72  (len <= 0) retur
40e0: 6e 20 30 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e  n 0;..    return
40f0: 20 67 7a 77 72 69 74 65 28 66 69 6c 65 2c 20 62   gzwrite(file, b
4100: 75 66 2c 20 28 75 6e 73 69 67 6e 65 64 29 6c 65  uf, (unsigned)le
4110: 6e 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 6e  n);.}.#else /* n
4120: 6f 74 20 41 4e 53 49 20 43 20 2a 2f 0a 0a 69 6e  ot ANSI C */..in
4130: 74 20 5a 45 58 50 4f 52 54 56 41 20 67 7a 70 72  t ZEXPORTVA gzpr
4140: 69 6e 74 66 20 28 66 69 6c 65 2c 20 66 6f 72 6d  intf (file, form
4150: 61 74 2c 20 61 31 2c 20 61 32 2c 20 61 33 2c 20  at, a1, a2, a3, 
4160: 61 34 2c 20 61 35 2c 20 61 36 2c 20 61 37 2c 20  a4, a5, a6, a7, 
4170: 61 38 2c 20 61 39 2c 20 61 31 30 2c 0a 09 20 20  a8, a9, a10,..  
4180: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 31 31               a11
4190: 2c 20 61 31 32 2c 20 61 31 33 2c 20 61 31 34 2c  , a12, a13, a14,
41a0: 20 61 31 35 2c 20 61 31 36 2c 20 61 31 37 2c 20   a15, a16, a17, 
41b0: 61 31 38 2c 20 61 31 39 2c 20 61 32 30 29 0a 20  a18, a19, a20). 
41c0: 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65 3b 0a     gzFile file;.
41d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
41e0: 66 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20  format;.    int 
41f0: 61 31 2c 20 61 32 2c 20 61 33 2c 20 61 34 2c 20  a1, a2, a3, a4, 
4200: 61 35 2c 20 61 36 2c 20 61 37 2c 20 61 38 2c 20  a5, a6, a7, a8, 
4210: 61 39 2c 20 61 31 30 2c 0a 09 61 31 31 2c 20 61  a9, a10,..a11, a
4220: 31 32 2c 20 61 31 33 2c 20 61 31 34 2c 20 61 31  12, a13, a14, a1
4230: 35 2c 20 61 31 36 2c 20 61 31 37 2c 20 61 31 38  5, a16, a17, a18
4240: 2c 20 61 31 39 2c 20 61 32 30 3b 0a 7b 0a 20 20  , a19, a20;.{.  
4250: 20 20 63 68 61 72 20 62 75 66 5b 5a 5f 50 52 49    char buf[Z_PRI
4260: 4e 54 46 5f 42 55 46 53 49 5a 45 5d 3b 0a 20 20  NTF_BUFSIZE];.  
4270: 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 23 69 66 64    int len;..#ifd
4280: 65 66 20 48 41 53 5f 73 6e 70 72 69 6e 74 66 0a  ef HAS_snprintf.
4290: 20 20 20 20 73 6e 70 72 69 6e 74 66 28 62 75 66      snprintf(buf
42a0: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 66  , sizeof(buf), f
42b0: 6f 72 6d 61 74 2c 20 61 31 2c 20 61 32 2c 20 61  ormat, a1, a2, a
42c0: 33 2c 20 61 34 2c 20 61 35 2c 20 61 36 2c 20 61  3, a4, a5, a6, a
42d0: 37 2c 20 61 38 2c 0a 09 20 20 20 20 20 61 39 2c  7, a8,..     a9,
42e0: 20 61 31 30 2c 20 61 31 31 2c 20 61 31 32 2c 20   a10, a11, a12, 
42f0: 61 31 33 2c 20 61 31 34 2c 20 61 31 35 2c 20 61  a13, a14, a15, a
4300: 31 36 2c 20 61 31 37 2c 20 61 31 38 2c 20 61 31  16, a17, a18, a1
4310: 39 2c 20 61 32 30 29 3b 0a 23 65 6c 73 65 0a 20  9, a20);.#else. 
4320: 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 20     sprintf(buf, 
4330: 66 6f 72 6d 61 74 2c 20 61 31 2c 20 61 32 2c 20  format, a1, a2, 
4340: 61 33 2c 20 61 34 2c 20 61 35 2c 20 61 36 2c 20  a3, a4, a5, a6, 
4350: 61 37 2c 20 61 38 2c 0a 09 20 20 20 20 61 39 2c  a7, a8,..    a9,
4360: 20 61 31 30 2c 20 61 31 31 2c 20 61 31 32 2c 20   a10, a11, a12, 
4370: 61 31 33 2c 20 61 31 34 2c 20 61 31 35 2c 20 61  a13, a14, a15, a
4380: 31 36 2c 20 61 31 37 2c 20 61 31 38 2c 20 61 31  16, a17, a18, a1
4390: 39 2c 20 61 32 30 29 3b 0a 23 65 6e 64 69 66 0a  9, a20);.#endif.
43a0: 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e      len = strlen
43b0: 28 62 75 66 29 3b 20 2f 2a 20 6f 6c 64 20 73 70  (buf); /* old sp
43c0: 72 69 6e 74 66 20 64 6f 65 73 6e 27 74 20 72 65  rintf doesn't re
43d0: 74 75 72 6e 20 74 68 65 20 6e 62 20 6f 66 20 62  turn the nb of b
43e0: 79 74 65 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  ytes written */.
43f0: 20 20 20 20 69 66 20 28 6c 65 6e 20 3c 3d 20 30      if (len <= 0
4400: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20  ) return 0;..   
4410: 20 72 65 74 75 72 6e 20 67 7a 77 72 69 74 65 28   return gzwrite(
4420: 66 69 6c 65 2c 20 62 75 66 2c 20 6c 65 6e 29 3b  file, buf, len);
4430: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 3d 3d  .}.#endif../* ==
4440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20 20  =========.      
4490: 57 72 69 74 65 73 20 63 2c 20 63 6f 6e 76 65 72  Writes c, conver
44a0: 74 65 64 20 74 6f 20 61 6e 20 75 6e 73 69 67 6e  ted to an unsign
44b0: 65 64 20 63 68 61 72 2c 20 69 6e 74 6f 20 74 68  ed char, into th
44c0: 65 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69 6c  e compressed fil
44d0: 65 2e 0a 20 20 20 67 7a 70 75 74 63 20 72 65 74  e..   gzputc ret
44e0: 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 74  urns the value t
44f0: 68 61 74 20 77 61 73 20 77 72 69 74 74 65 6e 2c  hat was written,
4500: 20 6f 72 20 2d 31 20 69 6e 20 63 61 73 65 20 6f   or -1 in case o
4510: 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  f error..*/.int 
4520: 5a 45 58 50 4f 52 54 20 67 7a 70 75 74 63 28 66  ZEXPORT gzputc(f
4530: 69 6c 65 2c 20 63 29 0a 20 20 20 20 67 7a 46 69  ile, c).    gzFi
4540: 6c 65 20 66 69 6c 65 3b 0a 20 20 20 20 69 6e 74  le file;.    int
4550: 20 63 3b 0a 7b 0a 20 20 20 20 75 6e 73 69 67 6e   c;.{.    unsign
4560: 65 64 20 63 68 61 72 20 63 63 20 3d 20 28 75 6e  ed char cc = (un
4570: 73 69 67 6e 65 64 20 63 68 61 72 29 20 63 3b 20  signed char) c; 
4580: 2f 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  /* required for 
4590: 62 69 67 20 65 6e 64 69 61 6e 20 73 79 73 74 65  big endian syste
45a0: 6d 73 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72  ms */..    retur
45b0: 6e 20 67 7a 77 72 69 74 65 28 66 69 6c 65 2c 20  n gzwrite(file, 
45c0: 26 63 63 2c 20 31 29 20 3d 3d 20 31 20 3f 20 28  &cc, 1) == 1 ? (
45d0: 69 6e 74 29 63 63 20 3a 20 2d 31 3b 0a 7d 0a 0a  int)cc : -1;.}..
45e0: 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ./* ============
45f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
4630: 20 20 20 20 20 20 57 72 69 74 65 73 20 74 68 65        Writes the
4640: 20 67 69 76 65 6e 20 6e 75 6c 6c 2d 74 65 72 6d   given null-term
4650: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 74 6f  inated string to
4660: 20 74 68 65 20 63 6f 6d 70 72 65 73 73 65 64 20   the compressed 
4670: 66 69 6c 65 2c 20 65 78 63 6c 75 64 69 6e 67 0a  file, excluding.
4680: 20 20 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69     the terminati
4690: 6e 67 20 6e 75 6c 6c 20 63 68 61 72 61 63 74 65  ng null characte
46a0: 72 2e 0a 20 20 20 20 20 20 67 7a 70 75 74 73 20  r..      gzputs 
46b0: 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  returns the numb
46c0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
46d0: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 2d 31 20   written, or -1 
46e0: 69 6e 20 63 61 73 65 20 6f 66 20 65 72 72 6f 72  in case of error
46f0: 2e 0a 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f 52 54  ..*/.int ZEXPORT
4700: 20 67 7a 70 75 74 73 28 66 69 6c 65 2c 20 73 29   gzputs(file, s)
4710: 0a 20 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65  .    gzFile file
4720: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
4730: 20 2a 73 3b 0a 7b 0a 20 20 20 20 72 65 74 75 72   *s;.{.    retur
4740: 6e 20 67 7a 77 72 69 74 65 28 66 69 6c 65 2c 20  n gzwrite(file, 
4750: 28 63 68 61 72 2a 29 73 2c 20 28 75 6e 73 69 67  (char*)s, (unsig
4760: 6e 65 64 29 73 74 72 6c 65 6e 28 73 29 29 3b 0a  ned)strlen(s));.
4770: 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  }../* ==========
4780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
47a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
47b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
47c0: 3d 0a 20 20 20 20 20 46 6c 75 73 68 65 73 20 61  =.     Flushes a
47d0: 6c 6c 20 70 65 6e 64 69 6e 67 20 6f 75 74 70 75  ll pending outpu
47e0: 74 20 69 6e 74 6f 20 74 68 65 20 63 6f 6d 70 72  t into the compr
47f0: 65 73 73 65 64 20 66 69 6c 65 2e 20 54 68 65 20  essed file. The 
4800: 70 61 72 61 6d 65 74 65 72 0a 20 20 20 66 6c 75  parameter.   flu
4810: 73 68 20 69 73 20 61 73 20 69 6e 20 74 68 65 20  sh is as in the 
4820: 64 65 66 6c 61 74 65 28 29 20 66 75 6e 63 74 69  deflate() functi
4830: 6f 6e 2e 0a 2a 2f 0a 6c 6f 63 61 6c 20 69 6e 74  on..*/.local int
4840: 20 64 6f 5f 66 6c 75 73 68 20 28 66 69 6c 65 2c   do_flush (file,
4850: 20 66 6c 75 73 68 29 0a 20 20 20 20 67 7a 46 69   flush).    gzFi
4860: 6c 65 20 66 69 6c 65 3b 0a 20 20 20 20 69 6e 74  le file;.    int
4870: 20 66 6c 75 73 68 3b 0a 7b 0a 20 20 20 20 75 49   flush;.{.    uI
4880: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
4890: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 67 7a  done = 0;.    gz
48a0: 5f 73 74 72 65 61 6d 20 2a 73 20 3d 20 28 67 7a  _stream *s = (gz
48b0: 5f 73 74 72 65 61 6d 2a 29 66 69 6c 65 3b 0a 0a  _stream*)file;..
48c0: 20 20 20 20 69 66 20 28 73 20 3d 3d 20 4e 55 4c      if (s == NUL
48d0: 4c 20 7c 7c 20 73 2d 3e 6d 6f 64 65 20 21 3d 20  L || s->mode != 
48e0: 27 77 27 29 20 72 65 74 75 72 6e 20 5a 5f 53 54  'w') return Z_ST
48f0: 52 45 41 4d 5f 45 52 52 4f 52 3b 0a 0a 20 20 20  REAM_ERROR;..   
4900: 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c   s->stream.avail
4910: 5f 69 6e 20 3d 20 30 3b 20 2f 2a 20 73 68 6f 75  _in = 0; /* shou
4920: 6c 64 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61  ld be zero alrea
4930: 64 79 20 61 6e 79 77 61 79 20 2a 2f 0a 0a 20 20  dy anyway */..  
4940: 20 20 66 6f 72 20 28 3b 3b 29 20 7b 0a 20 20 20    for (;;) {.   
4950: 20 20 20 20 20 6c 65 6e 20 3d 20 5a 5f 42 55 46       len = Z_BUF
4960: 53 49 5a 45 20 2d 20 73 2d 3e 73 74 72 65 61 6d  SIZE - s->stream
4970: 2e 61 76 61 69 6c 5f 6f 75 74 3b 0a 0a 20 20 20  .avail_out;..   
4980: 20 20 20 20 20 69 66 20 28 6c 65 6e 20 21 3d 20       if (len != 
4990: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
49a0: 20 69 66 20 28 28 75 49 6e 74 29 66 77 72 69 74   if ((uInt)fwrit
49b0: 65 28 73 2d 3e 6f 75 74 62 75 66 2c 20 31 2c 20  e(s->outbuf, 1, 
49c0: 6c 65 6e 2c 20 73 2d 3e 66 69 6c 65 29 20 21 3d  len, s->file) !=
49d0: 20 6c 65 6e 29 20 7b 0a 20 20 20 20 20 20 20 20   len) {.        
49e0: 20 20 20 20 20 20 20 20 73 2d 3e 7a 5f 65 72 72          s->z_err
49f0: 20 3d 20 5a 5f 45 52 52 4e 4f 3b 0a 20 20 20 20   = Z_ERRNO;.    
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4a10: 72 6e 20 5a 5f 45 52 52 4e 4f 3b 0a 20 20 20 20  rn Z_ERRNO;.    
4a20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4a30: 20 20 20 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e        s->stream.
4a40: 6e 65 78 74 5f 6f 75 74 20 3d 20 73 2d 3e 6f 75  next_out = s->ou
4a50: 74 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  tbuf;.          
4a60: 20 20 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69    s->stream.avai
4a70: 6c 5f 6f 75 74 20 3d 20 5a 5f 42 55 46 53 49 5a  l_out = Z_BUFSIZ
4a80: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
4a90: 20 20 20 20 20 69 66 20 28 64 6f 6e 65 29 20 62       if (done) b
4aa0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 2d  reak;.        s-
4ab0: 3e 7a 5f 65 72 72 20 3d 20 64 65 66 6c 61 74 65  >z_err = deflate
4ac0: 28 26 28 73 2d 3e 73 74 72 65 61 6d 29 2c 20 66  (&(s->stream), f
4ad0: 6c 75 73 68 29 3b 0a 0a 09 2f 2a 20 49 67 6e 6f  lush);.../* Igno
4ae0: 72 65 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66  re the second of
4af0: 20 74 77 6f 20 63 6f 6e 73 65 63 75 74 69 76 65   two consecutive
4b00: 20 66 6c 75 73 68 65 73 3a 20 2a 2f 0a 09 69 66   flushes: */..if
4b10: 20 28 6c 65 6e 20 3d 3d 20 30 20 26 26 20 73 2d   (len == 0 && s-
4b20: 3e 7a 5f 65 72 72 20 3d 3d 20 5a 5f 42 55 46 5f  >z_err == Z_BUF_
4b30: 45 52 52 4f 52 29 20 73 2d 3e 7a 5f 65 72 72 20  ERROR) s->z_err 
4b40: 3d 20 5a 5f 4f 4b 3b 0a 0a 20 20 20 20 20 20 20  = Z_OK;..       
4b50: 20 2f 2a 20 64 65 66 6c 61 74 65 20 68 61 73 20   /* deflate has 
4b60: 66 69 6e 69 73 68 65 64 20 66 6c 75 73 68 69 6e  finished flushin
4b70: 67 20 6f 6e 6c 79 20 77 68 65 6e 20 69 74 20 68  g only when it h
4b80: 61 73 6e 27 74 20 75 73 65 64 20 75 70 0a 20 20  asn't used up.  
4b90: 20 20 20 20 20 20 20 2a 20 61 6c 6c 20 74 68 65         * all the
4ba0: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65   available space
4bb0: 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62   in the output b
4bc0: 75 66 66 65 72 3a 20 0a 20 20 20 20 20 20 20 20  uffer: .        
4bd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 6f 6e 65   */.        done
4be0: 20 3d 20 28 73 2d 3e 73 74 72 65 61 6d 2e 61 76   = (s->stream.av
4bf0: 61 69 6c 5f 6f 75 74 20 21 3d 20 30 20 7c 7c 20  ail_out != 0 || 
4c00: 73 2d 3e 7a 5f 65 72 72 20 3d 3d 20 5a 5f 53 54  s->z_err == Z_ST
4c10: 52 45 41 4d 5f 45 4e 44 29 3b 0a 20 0a 20 20 20  REAM_END);. .   
4c20: 20 20 20 20 20 69 66 20 28 73 2d 3e 7a 5f 65 72       if (s->z_er
4c30: 72 20 21 3d 20 5a 5f 4f 4b 20 26 26 20 73 2d 3e  r != Z_OK && s->
4c40: 7a 5f 65 72 72 20 21 3d 20 5a 5f 53 54 52 45 41  z_err != Z_STREA
4c50: 4d 5f 45 4e 44 29 20 62 72 65 61 6b 3b 0a 20 20  M_END) break;.  
4c60: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 20    }.    return  
4c70: 73 2d 3e 7a 5f 65 72 72 20 3d 3d 20 5a 5f 53 54  s->z_err == Z_ST
4c80: 52 45 41 4d 5f 45 4e 44 20 3f 20 5a 5f 4f 4b 20  REAM_END ? Z_OK 
4c90: 3a 20 73 2d 3e 7a 5f 65 72 72 3b 0a 7d 0a 0a 69  : s->z_err;.}..i
4ca0: 6e 74 20 5a 45 58 50 4f 52 54 20 67 7a 66 6c 75  nt ZEXPORT gzflu
4cb0: 73 68 20 28 66 69 6c 65 2c 20 66 6c 75 73 68 29  sh (file, flush)
4cc0: 0a 20 20 20 20 20 67 7a 46 69 6c 65 20 66 69 6c  .     gzFile fil
4cd0: 65 3b 0a 20 20 20 20 20 69 6e 74 20 66 6c 75 73  e;.     int flus
4ce0: 68 3b 0a 7b 0a 20 20 20 20 67 7a 5f 73 74 72 65  h;.{.    gz_stre
4cf0: 61 6d 20 2a 73 20 3d 20 28 67 7a 5f 73 74 72 65  am *s = (gz_stre
4d00: 61 6d 2a 29 66 69 6c 65 3b 0a 20 20 20 20 69 6e  am*)file;.    in
4d10: 74 20 65 72 72 20 3d 20 64 6f 5f 66 6c 75 73 68  t err = do_flush
4d20: 20 28 66 69 6c 65 2c 20 66 6c 75 73 68 29 3b 0a   (file, flush);.
4d30: 0a 20 20 20 20 69 66 20 28 65 72 72 29 20 72 65  .    if (err) re
4d40: 74 75 72 6e 20 65 72 72 3b 0a 20 20 20 20 66 66  turn err;.    ff
4d50: 6c 75 73 68 28 73 2d 3e 66 69 6c 65 29 3b 0a 20  lush(s->file);. 
4d60: 20 20 20 72 65 74 75 72 6e 20 20 73 2d 3e 7a 5f     return  s->z_
4d70: 65 72 72 20 3d 3d 20 5a 5f 53 54 52 45 41 4d 5f  err == Z_STREAM_
4d80: 45 4e 44 20 3f 20 5a 5f 4f 4b 20 3a 20 73 2d 3e  END ? Z_OK : s->
4d90: 7a 5f 65 72 72 3b 0a 7d 0a 23 65 6e 64 69 66 20  z_err;.}.#endif 
4da0: 2f 2a 20 4e 4f 5f 44 45 46 4c 41 54 45 20 2a 2f  /* NO_DEFLATE */
4db0: 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ../* ===========
4dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4e00: 0a 20 20 20 20 20 20 53 65 74 73 20 74 68 65 20  .      Sets the 
4e10: 73 74 61 72 74 69 6e 67 20 70 6f 73 69 74 69 6f  starting positio
4e20: 6e 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 67  n for the next g
4e30: 7a 72 65 61 64 20 6f 72 20 67 7a 77 72 69 74 65  zread or gzwrite
4e40: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 0a 20 20   on the given.  
4e50: 20 63 6f 6d 70 72 65 73 73 65 64 20 66 69 6c 65   compressed file
4e60: 2e 20 54 68 65 20 6f 66 66 73 65 74 20 72 65 70  . The offset rep
4e70: 72 65 73 65 6e 74 73 20 61 20 6e 75 6d 62 65 72  resents a number
4e80: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
4e90: 0a 20 20 20 20 20 20 67 7a 73 65 65 6b 20 72 65  .      gzseek re
4ea0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
4eb0: 69 6e 67 20 6f 66 66 73 65 74 20 6c 6f 63 61 74  ing offset locat
4ec0: 69 6f 6e 20 61 73 20 6d 65 61 73 75 72 65 64 20  ion as measured 
4ed0: 69 6e 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20  in bytes from.  
4ee0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
4ef0: 66 20 74 68 65 20 75 6e 63 6f 6d 70 72 65 73 73  f the uncompress
4f00: 65 64 20 73 74 72 65 61 6d 2c 20 6f 72 20 2d 31  ed stream, or -1
4f10: 20 69 6e 20 63 61 73 65 20 6f 66 20 65 72 72 6f   in case of erro
4f20: 72 2e 0a 20 20 20 20 20 20 53 45 45 4b 5f 45 4e  r..      SEEK_EN
4f30: 44 20 69 73 20 6e 6f 74 20 69 6d 70 6c 65 6d 65  D is not impleme
4f40: 6e 74 65 64 2c 20 72 65 74 75 72 6e 73 20 65 72  nted, returns er
4f50: 72 6f 72 2e 0a 20 20 20 20 20 20 49 6e 20 74 68  ror..      In th
4f60: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68  is version of th
4f70: 65 20 6c 69 62 72 61 72 79 2c 20 67 7a 73 65 65  e library, gzsee
4f80: 6b 20 63 61 6e 20 62 65 20 65 78 74 72 65 6d 65  k can be extreme
4f90: 6c 79 20 73 6c 6f 77 2e 0a 2a 2f 0a 7a 5f 6f 66  ly slow..*/.z_of
4fa0: 66 5f 74 20 5a 45 58 50 4f 52 54 20 67 7a 73 65  f_t ZEXPORT gzse
4fb0: 65 6b 20 28 66 69 6c 65 2c 20 6f 66 66 73 65 74  ek (file, offset
4fc0: 2c 20 77 68 65 6e 63 65 29 0a 20 20 20 20 67 7a  , whence).    gz
4fd0: 46 69 6c 65 20 66 69 6c 65 3b 0a 20 20 20 20 7a  File file;.    z
4fe0: 5f 6f 66 66 5f 74 20 6f 66 66 73 65 74 3b 0a 20  _off_t offset;. 
4ff0: 20 20 20 69 6e 74 20 77 68 65 6e 63 65 3b 0a 7b     int whence;.{
5000: 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d 20 2a  .    gz_stream *
5010: 73 20 3d 20 28 67 7a 5f 73 74 72 65 61 6d 2a 29  s = (gz_stream*)
5020: 66 69 6c 65 3b 0a 0a 20 20 20 20 69 66 20 28 73  file;..    if (s
5030: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 77 68 65 6e   == NULL || when
5040: 63 65 20 3d 3d 20 53 45 45 4b 5f 45 4e 44 20 7c  ce == SEEK_END |
5050: 7c 0a 09 73 2d 3e 7a 5f 65 72 72 20 3d 3d 20 5a  |..s->z_err == Z
5060: 5f 45 52 52 4e 4f 20 7c 7c 20 73 2d 3e 7a 5f 65  _ERRNO || s->z_e
5070: 72 72 20 3d 3d 20 5a 5f 44 41 54 41 5f 45 52 52  rr == Z_DATA_ERR
5080: 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 2d 31  OR) {..return -1
5090: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20 20  L;.    }.    .  
50a0: 20 20 69 66 20 28 73 2d 3e 6d 6f 64 65 20 3d 3d    if (s->mode ==
50b0: 20 27 77 27 29 20 7b 0a 23 69 66 64 65 66 20 4e   'w') {.#ifdef N
50c0: 4f 5f 44 45 46 4c 41 54 45 0a 09 72 65 74 75 72  O_DEFLATE..retur
50d0: 6e 20 2d 31 4c 3b 0a 23 65 6c 73 65 0a 09 69 66  n -1L;.#else..if
50e0: 20 28 77 68 65 6e 63 65 20 3d 3d 20 53 45 45 4b   (whence == SEEK
50f0: 5f 53 45 54 29 20 7b 0a 09 20 20 20 20 6f 66 66  _SET) {..    off
5100: 73 65 74 20 2d 3d 20 73 2d 3e 73 74 72 65 61 6d  set -= s->stream
5110: 2e 74 6f 74 61 6c 5f 69 6e 3b 0a 09 7d 0a 09 69  .total_in;..}..i
5120: 66 20 28 6f 66 66 73 65 74 20 3c 20 30 29 20 72  f (offset < 0) r
5130: 65 74 75 72 6e 20 2d 31 4c 3b 0a 0a 09 2f 2a 20  eturn -1L;.../* 
5140: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f  At this point, o
5150: 66 66 73 65 74 20 69 73 20 74 68 65 20 6e 75 6d  ffset is the num
5160: 62 65 72 20 6f 66 20 7a 65 72 6f 20 62 79 74 65  ber of zero byte
5170: 73 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 09  s to write. */..
5180: 69 66 20 28 73 2d 3e 69 6e 62 75 66 20 3d 3d 20  if (s->inbuf == 
5190: 5a 5f 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 73  Z_NULL) {..    s
51a0: 2d 3e 69 6e 62 75 66 20 3d 20 28 42 79 74 65 2a  ->inbuf = (Byte*
51b0: 29 41 4c 4c 4f 43 28 5a 5f 42 55 46 53 49 5a 45  )ALLOC(Z_BUFSIZE
51c0: 29 3b 20 2f 2a 20 66 6f 72 20 73 65 65 6b 69 6e  ); /* for seekin
51d0: 67 20 2a 2f 0a 09 20 20 20 20 7a 6d 65 6d 7a 65  g */..    zmemze
51e0: 72 6f 28 73 2d 3e 69 6e 62 75 66 2c 20 5a 5f 42  ro(s->inbuf, Z_B
51f0: 55 46 53 49 5a 45 29 3b 0a 09 7d 0a 09 77 68 69  UFSIZE);..}..whi
5200: 6c 65 20 28 6f 66 66 73 65 74 20 3e 20 30 29 20  le (offset > 0) 
5210: 20 7b 0a 09 20 20 20 20 75 49 6e 74 20 73 69 7a   {..    uInt siz
5220: 65 20 3d 20 5a 5f 42 55 46 53 49 5a 45 3b 0a 09  e = Z_BUFSIZE;..
5230: 20 20 20 20 69 66 20 28 6f 66 66 73 65 74 20 3c      if (offset <
5240: 20 5a 5f 42 55 46 53 49 5a 45 29 20 73 69 7a 65   Z_BUFSIZE) size
5250: 20 3d 20 28 75 49 6e 74 29 6f 66 66 73 65 74 3b   = (uInt)offset;
5260: 0a 0a 09 20 20 20 20 73 69 7a 65 20 3d 20 67 7a  ...    size = gz
5270: 77 72 69 74 65 28 66 69 6c 65 2c 20 73 2d 3e 69  write(file, s->i
5280: 6e 62 75 66 2c 20 73 69 7a 65 29 3b 0a 09 20 20  nbuf, size);..  
5290: 20 20 69 66 20 28 73 69 7a 65 20 3d 3d 20 30 29    if (size == 0)
52a0: 20 72 65 74 75 72 6e 20 2d 31 4c 3b 0a 0a 09 20   return -1L;... 
52b0: 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 73 69 7a     offset -= siz
52c0: 65 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 28 7a  e;..}..return (z
52d0: 5f 6f 66 66 5f 74 29 73 2d 3e 73 74 72 65 61 6d  _off_t)s->stream
52e0: 2e 74 6f 74 61 6c 5f 69 6e 3b 0a 23 65 6e 64 69  .total_in;.#endi
52f0: 66 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 52  f.    }.    /* R
5300: 65 73 74 20 6f 66 20 66 75 6e 63 74 69 6f 6e 20  est of function 
5310: 69 73 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  is for reading o
5320: 6e 6c 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 63  nly */..    /* c
5330: 6f 6d 70 75 74 65 20 61 62 73 6f 6c 75 74 65 20  ompute absolute 
5340: 70 6f 73 69 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  position */.    
5350: 69 66 20 28 77 68 65 6e 63 65 20 3d 3d 20 53 45  if (whence == SE
5360: 45 4b 5f 43 55 52 29 20 7b 0a 09 6f 66 66 73 65  EK_CUR) {..offse
5370: 74 20 2b 3d 20 73 2d 3e 73 74 72 65 61 6d 2e 74  t += s->stream.t
5380: 6f 74 61 6c 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  otal_out;.    }.
5390: 20 20 20 20 69 66 20 28 6f 66 66 73 65 74 20 3c      if (offset <
53a0: 20 30 29 20 72 65 74 75 72 6e 20 2d 31 4c 3b 0a   0) return -1L;.
53b0: 0a 20 20 20 20 69 66 20 28 73 2d 3e 74 72 61 6e  .    if (s->tran
53c0: 73 70 61 72 65 6e 74 29 20 7b 0a 09 2f 2a 20 6d  sparent) {../* m
53d0: 61 70 20 74 6f 20 66 73 65 65 6b 20 2a 2f 0a 09  ap to fseek */..
53e0: 73 2d 3e 73 74 72 65 61 6d 2e 61 76 61 69 6c 5f  s->stream.avail_
53f0: 69 6e 20 3d 20 30 3b 0a 09 73 2d 3e 73 74 72 65  in = 0;..s->stre
5400: 61 6d 2e 6e 65 78 74 5f 69 6e 20 3d 20 73 2d 3e  am.next_in = s->
5410: 69 6e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 69  inbuf;.        i
5420: 66 20 28 66 73 65 65 6b 28 73 2d 3e 66 69 6c 65  f (fseek(s->file
5430: 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53  , offset, SEEK_S
5440: 45 54 29 20 3c 20 30 29 20 72 65 74 75 72 6e 20  ET) < 0) return 
5450: 2d 31 4c 3b 0a 0a 09 73 2d 3e 73 74 72 65 61 6d  -1L;...s->stream
5460: 2e 74 6f 74 61 6c 5f 69 6e 20 3d 20 73 2d 3e 73  .total_in = s->s
5470: 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74 20  tream.total_out 
5480: 3d 20 28 75 4c 6f 6e 67 29 6f 66 66 73 65 74 3b  = (uLong)offset;
5490: 0a 09 72 65 74 75 72 6e 20 6f 66 66 73 65 74 3b  ..return offset;
54a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
54b0: 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 73 65  or a negative se
54c0: 65 6b 2c 20 72 65 77 69 6e 64 20 61 6e 64 20 75  ek, rewind and u
54d0: 73 65 20 70 6f 73 69 74 69 76 65 20 73 65 65 6b  se positive seek
54e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 75 4c 6f   */.    if ((uLo
54f0: 6e 67 29 6f 66 66 73 65 74 20 3e 3d 20 73 2d 3e  ng)offset >= s->
5500: 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f 75 74  stream.total_out
5510: 29 20 7b 0a 09 6f 66 66 73 65 74 20 2d 3d 20 73  ) {..offset -= s
5520: 2d 3e 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f  ->stream.total_o
5530: 75 74 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ut;.    } else i
5540: 66 20 28 67 7a 72 65 77 69 6e 64 28 66 69 6c 65  f (gzrewind(file
5550: 29 20 3c 20 30 29 20 7b 0a 09 72 65 74 75 72 6e  ) < 0) {..return
5560: 20 2d 31 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20   -1L;.    }.    
5570: 2f 2a 20 6f 66 66 73 65 74 20 69 73 20 6e 6f 77  /* offset is now
5580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
5590: 79 74 65 73 20 74 6f 20 73 6b 69 70 2e 20 2a 2f  ytes to skip. */
55a0: 0a 0a 20 20 20 20 69 66 20 28 6f 66 66 73 65 74  ..    if (offset
55b0: 20 21 3d 20 30 20 26 26 20 73 2d 3e 6f 75 74 62   != 0 && s->outb
55c0: 75 66 20 3d 3d 20 5a 5f 4e 55 4c 4c 29 20 7b 0a  uf == Z_NULL) {.
55d0: 09 73 2d 3e 6f 75 74 62 75 66 20 3d 20 28 42 79  .s->outbuf = (By
55e0: 74 65 2a 29 41 4c 4c 4f 43 28 5a 5f 42 55 46 53  te*)ALLOC(Z_BUFS
55f0: 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  IZE);.    }.    
5600: 77 68 69 6c 65 20 28 6f 66 66 73 65 74 20 3e 20  while (offset > 
5610: 30 29 20 20 7b 0a 09 69 6e 74 20 73 69 7a 65 20  0)  {..int size 
5620: 3d 20 5a 5f 42 55 46 53 49 5a 45 3b 0a 09 69 66  = Z_BUFSIZE;..if
5630: 20 28 6f 66 66 73 65 74 20 3c 20 5a 5f 42 55 46   (offset < Z_BUF
5640: 53 49 5a 45 29 20 73 69 7a 65 20 3d 20 28 69 6e  SIZE) size = (in
5650: 74 29 6f 66 66 73 65 74 3b 0a 0a 09 73 69 7a 65  t)offset;...size
5660: 20 3d 20 67 7a 72 65 61 64 28 66 69 6c 65 2c 20   = gzread(file, 
5670: 73 2d 3e 6f 75 74 62 75 66 2c 20 28 75 49 6e 74  s->outbuf, (uInt
5680: 29 73 69 7a 65 29 3b 0a 09 69 66 20 28 73 69 7a  )size);..if (siz
5690: 65 20 3c 3d 20 30 29 20 72 65 74 75 72 6e 20 2d  e <= 0) return -
56a0: 31 4c 3b 0a 09 6f 66 66 73 65 74 20 2d 3d 20 73  1L;..offset -= s
56b0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ize;.    }.    r
56c0: 65 74 75 72 6e 20 28 7a 5f 6f 66 66 5f 74 29 73  eturn (z_off_t)s
56d0: 2d 3e 73 74 72 65 61 6d 2e 74 6f 74 61 6c 5f 6f  ->stream.total_o
56e0: 75 74 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d  ut;.}../* ======
56f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5730: 3d 3d 3d 3d 3d 0a 20 20 20 20 20 52 65 77 69 6e  =====.     Rewin
5740: 64 73 20 69 6e 70 75 74 20 66 69 6c 65 2e 20 0a  ds input file. .
5750: 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f 52 54 20 67  */.int ZEXPORT g
5760: 7a 72 65 77 69 6e 64 20 28 66 69 6c 65 29 0a 20  zrewind (file). 
5770: 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65 3b 0a     gzFile file;.
5780: 7b 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d 20  {.    gz_stream 
5790: 2a 73 20 3d 20 28 67 7a 5f 73 74 72 65 61 6d 2a  *s = (gz_stream*
57a0: 29 66 69 6c 65 3b 0a 20 20 20 20 0a 20 20 20 20  )file;.    .    
57b0: 69 66 20 28 73 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  if (s == NULL ||
57c0: 20 73 2d 3e 6d 6f 64 65 20 21 3d 20 27 72 27 29   s->mode != 'r')
57d0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 0a 20 20 20   return -1;..   
57e0: 20 73 2d 3e 7a 5f 65 72 72 20 3d 20 5a 5f 4f 4b   s->z_err = Z_OK
57f0: 3b 0a 20 20 20 20 73 2d 3e 7a 5f 65 6f 66 20 3d  ;.    s->z_eof =
5800: 20 30 3b 0a 20 20 20 20 73 2d 3e 73 74 72 65 61   0;.    s->strea
5810: 6d 2e 61 76 61 69 6c 5f 69 6e 20 3d 20 30 3b 0a  m.avail_in = 0;.
5820: 20 20 20 20 73 2d 3e 73 74 72 65 61 6d 2e 6e 65      s->stream.ne
5830: 78 74 5f 69 6e 20 3d 20 73 2d 3e 69 6e 62 75 66  xt_in = s->inbuf
5840: 3b 0a 20 20 20 20 73 2d 3e 63 72 63 20 3d 20 63  ;.    s->crc = c
5850: 72 63 33 32 28 30 4c 2c 20 5a 5f 4e 55 4c 4c 2c  rc32(0L, Z_NULL,
5860: 20 30 29 3b 0a 09 0a 20 20 20 20 69 66 20 28 73   0);...    if (s
5870: 2d 3e 73 74 61 72 74 70 6f 73 20 3d 3d 20 30 29  ->startpos == 0)
5880: 20 7b 20 2f 2a 20 6e 6f 74 20 61 20 63 6f 6d 70   { /* not a comp
5890: 72 65 73 73 65 64 20 66 69 6c 65 20 2a 2f 0a 09  ressed file */..
58a0: 72 65 77 69 6e 64 28 73 2d 3e 66 69 6c 65 29 3b  rewind(s->file);
58b0: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
58c0: 7d 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 69 6e  }..    (void) in
58d0: 66 6c 61 74 65 52 65 73 65 74 28 26 73 2d 3e 73  flateReset(&s->s
58e0: 74 72 65 61 6d 29 3b 0a 20 20 20 20 72 65 74 75  tream);.    retu
58f0: 72 6e 20 66 73 65 65 6b 28 73 2d 3e 66 69 6c 65  rn fseek(s->file
5900: 2c 20 73 2d 3e 73 74 61 72 74 70 6f 73 2c 20 53  , s->startpos, S
5910: 45 45 4b 5f 53 45 54 29 3b 0a 7d 0a 0a 2f 2a 20  EEK_SET);.}../* 
5920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5930: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5960: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20  ===========.    
5970: 20 52 65 74 75 72 6e 73 20 74 68 65 20 73 74 61   Returns the sta
5980: 72 74 69 6e 67 20 70 6f 73 69 74 69 6f 6e 20 66  rting position f
5990: 6f 72 20 74 68 65 20 6e 65 78 74 20 67 7a 72 65  or the next gzre
59a0: 61 64 20 6f 72 20 67 7a 77 72 69 74 65 20 6f 6e  ad or gzwrite on
59b0: 20 74 68 65 0a 20 20 20 67 69 76 65 6e 20 63 6f   the.   given co
59c0: 6d 70 72 65 73 73 65 64 20 66 69 6c 65 2e 20 54  mpressed file. T
59d0: 68 69 73 20 70 6f 73 69 74 69 6f 6e 20 72 65 70  his position rep
59e0: 72 65 73 65 6e 74 73 20 61 20 6e 75 6d 62 65 72  resents a number
59f0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
5a00: 0a 20 20 20 75 6e 63 6f 6d 70 72 65 73 73 65 64  .   uncompressed
5a10: 20 64 61 74 61 20 73 74 72 65 61 6d 2e 0a 2a 2f   data stream..*/
5a20: 0a 7a 5f 6f 66 66 5f 74 20 5a 45 58 50 4f 52 54  .z_off_t ZEXPORT
5a30: 20 67 7a 74 65 6c 6c 20 28 66 69 6c 65 29 0a 20   gztell (file). 
5a40: 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65 3b 0a     gzFile file;.
5a50: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 7a 73  {.    return gzs
5a60: 65 65 6b 28 66 69 6c 65 2c 20 30 4c 2c 20 53 45  eek(file, 0L, SE
5a70: 45 4b 5f 43 55 52 29 3b 0a 7d 0a 0a 2f 2a 20 3d  EK_CUR);.}../* =
5a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20 20 20 20 20  ==========.     
5ad0: 52 65 74 75 72 6e 73 20 31 20 77 68 65 6e 20 45  Returns 1 when E
5ae0: 4f 46 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c  OF has previousl
5af0: 79 20 62 65 65 6e 20 64 65 74 65 63 74 65 64 20  y been detected 
5b00: 72 65 61 64 69 6e 67 20 74 68 65 20 67 69 76 65  reading the give
5b10: 6e 0a 20 20 20 69 6e 70 75 74 20 73 74 72 65 61  n.   input strea
5b20: 6d 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72  m, otherwise zer
5b30: 6f 2e 0a 2a 2f 0a 69 6e 74 20 5a 45 58 50 4f 52  o..*/.int ZEXPOR
5b40: 54 20 67 7a 65 6f 66 20 28 66 69 6c 65 29 0a 20  T gzeof (file). 
5b50: 20 20 20 67 7a 46 69 6c 65 20 66 69 6c 65 3b 0a     gzFile file;.
5b60: 7b 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d 20  {.    gz_stream 
5b70: 2a 73 20 3d 20 28 67 7a 5f 73 74 72 65 61 6d 2a  *s = (gz_stream*
5b80: 29 66 69 6c 65 3b 0a 20 20 20 20 0a 20 20 20 20  )file;.    .    
5b90: 72 65 74 75 72 6e 20 28 73 20 3d 3d 20 4e 55 4c  return (s == NUL
5ba0: 4c 20 7c 7c 20 73 2d 3e 6d 6f 64 65 20 21 3d 20  L || s->mode != 
5bb0: 27 72 27 29 20 3f 20 30 20 3a 20 73 2d 3e 7a 5f  'r') ? 0 : s->z_
5bc0: 65 6f 66 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d  eof;.}../* =====
5bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c10: 3d 3d 3d 3d 3d 3d 0a 20 20 20 4f 75 74 70 75 74  ======.   Output
5c20: 73 20 61 20 6c 6f 6e 67 20 69 6e 20 4c 53 42 20  s a long in LSB 
5c30: 6f 72 64 65 72 20 74 6f 20 74 68 65 20 67 69 76  order to the giv
5c40: 65 6e 20 66 69 6c 65 0a 2a 2f 0a 6c 6f 63 61 6c  en file.*/.local
5c50: 20 76 6f 69 64 20 70 75 74 4c 6f 6e 67 20 28 66   void putLong (f
5c60: 69 6c 65 2c 20 78 29 0a 20 20 20 20 46 49 4c 45  ile, x).    FILE
5c70: 20 2a 66 69 6c 65 3b 0a 20 20 20 20 75 4c 6f 6e   *file;.    uLon
5c80: 67 20 78 3b 0a 7b 0a 20 20 20 20 69 6e 74 20 6e  g x;.{.    int n
5c90: 3b 0a 20 20 20 20 66 6f 72 20 28 6e 20 3d 20 30  ;.    for (n = 0
5ca0: 3b 20 6e 20 3c 20 34 3b 20 6e 2b 2b 29 20 7b 0a  ; n < 4; n++) {.
5cb0: 20 20 20 20 20 20 20 20 66 70 75 74 63 28 28 69          fputc((i
5cc0: 6e 74 29 28 78 20 26 20 30 78 66 66 29 2c 20 66  nt)(x & 0xff), f
5cd0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 78 20  ile);.        x 
5ce0: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  >>= 8;.    }.}..
5cf0: 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  /* =============
5d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 20  ==============. 
5d40: 20 20 52 65 61 64 73 20 61 20 6c 6f 6e 67 20 69    Reads a long i
5d50: 6e 20 4c 53 42 20 6f 72 64 65 72 20 66 72 6f 6d  n LSB order from
5d60: 20 74 68 65 20 67 69 76 65 6e 20 67 7a 5f 73 74   the given gz_st
5d70: 72 65 61 6d 2e 20 53 65 74 73 20 7a 5f 65 72 72  ream. Sets z_err
5d80: 20 69 6e 20 63 61 73 65 0a 20 20 20 6f 66 20 65   in case.   of e
5d90: 72 72 6f 72 2e 0a 2a 2f 0a 6c 6f 63 61 6c 20 75  rror..*/.local u
5da0: 4c 6f 6e 67 20 67 65 74 4c 6f 6e 67 20 28 73 29  Long getLong (s)
5db0: 0a 20 20 20 20 67 7a 5f 73 74 72 65 61 6d 20 2a  .    gz_stream *
5dc0: 73 3b 0a 7b 0a 20 20 20 20 75 4c 6f 6e 67 20 78  s;.{.    uLong x
5dd0: 20 3d 20 28 75 4c 6f 6e 67 29 67 65 74 5f 62 79   = (uLong)get_by
5de0: 74 65 28 73 29 3b 0a 20 20 20 20 69 6e 74 20 63  te(s);.    int c
5df0: 3b 0a 0a 20 20 20 20 78 20 2b 3d 20 28 28 75 4c  ;..    x += ((uL
5e00: 6f 6e 67 29 67 65 74 5f 62 79 74 65 28 73 29 29  ong)get_byte(s))
5e10: 3c 3c 38 3b 0a 20 20 20 20 78 20 2b 3d 20 28 28  <<8;.    x += ((
5e20: 75 4c 6f 6e 67 29 67 65 74 5f 62 79 74 65 28 73  uLong)get_byte(s
5e30: 29 29 3c 3c 31 36 3b 0a 20 20 20 20 63 20 3d 20  ))<<16;.    c = 
5e40: 67 65 74 5f 62 79 74 65 28 73 29 3b 0a 20 20 20  get_byte(s);.   
5e50: 20 69 66 20 28 63 20 3d 3d 20 45 4f 46 29 20 73   if (c == EOF) s
5e60: 2d 3e 7a 5f 65 72 72 20 3d 20 5a 5f 44 41 54 41  ->z_err = Z_DATA
5e70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 78 20 2b 3d  _ERROR;.    x +=
5e80: 20 28 28 75 4c 6f 6e 67 29 63 29 3c 3c 32 34 3b   ((uLong)c)<<24;
5e90: 0a 20 20 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d  .    return x;.}
5ea0: 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ../* ===========
5eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ef0: 0a 20 20 20 20 20 46 6c 75 73 68 65 73 20 61 6c  .     Flushes al
5f00: 6c 20 70 65 6e 64 69 6e 67 20 6f 75 74 70 75 74  l pending output
5f10: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 63   if necessary, c
5f20: 6c 6f 73 65 73 20 74 68 65 20 63 6f 6d 70 72 65  loses the compre
5f30: 73 73 65 64 20 66 69 6c 65 0a 20 20 20 61 6e 64  ssed file.   and
5f40: 20 64 65 61 6c 6c 6f 63 61 74 65 73 20 61 6c 6c   deallocates all
5f50: 20 74 68 65 20 28 64 65 29 63 6f 6d 70 72 65 73   the (de)compres
5f60: 73 69 6f 6e 20 73 74 61 74 65 2e 0a 2a 2f 0a 69  sion state..*/.i
5f70: 6e 74 20 5a 45 58 50 4f 52 54 20 67 7a 63 6c 6f  nt ZEXPORT gzclo
5f80: 73 65 20 28 66 69 6c 65 29 0a 20 20 20 20 67 7a  se (file).    gz
5f90: 46 69 6c 65 20 66 69 6c 65 3b 0a 7b 0a 20 20 20  File file;.{.   
5fa0: 20 67 7a 5f 73 74 72 65 61 6d 20 2a 73 20 3d 20   gz_stream *s = 
5fb0: 28 67 7a 5f 73 74 72 65 61 6d 2a 29 66 69 6c 65  (gz_stream*)file
5fc0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 20 3d 3d 20  ;..    if (s == 
5fd0: 4e 55 4c 4c 29 20 72 65 74 75 72 6e 20 5a 5f 53  NULL) return Z_S
5fe0: 54 52 45 41 4d 5f 45 52 52 4f 52 3b 0a 0a 20 20  TREAM_ERROR;..  
5ff0: 20 20 69 66 20 28 73 2d 3e 6d 6f 64 65 20 3d 3d    if (s->mode ==
6000: 20 27 77 27 29 20 7b 0a 23 69 66 64 65 66 20 4e   'w') {.#ifdef N
6010: 4f 5f 44 45 46 4c 41 54 45 0a 09 72 65 74 75 72  O_DEFLATE..retur
6020: 6e 20 5a 5f 53 54 52 45 41 4d 5f 45 52 52 4f 52  n Z_STREAM_ERROR
6030: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
6040: 65 72 72 20 3d 20 64 6f 5f 66 6c 75 73 68 20 28  err = do_flush (
6050: 66 69 6c 65 2c 20 5a 5f 46 49 4e 49 53 48 29 3b  file, Z_FINISH);
6060: 0a 20 20 20 20 20 20 20 20 69 66 20 28 65 72 72  .        if (err
6070: 20 21 3d 20 5a 5f 4f 4b 29 20 72 65 74 75 72 6e   != Z_OK) return
6080: 20 64 65 73 74 72 6f 79 28 28 67 7a 5f 73 74 72   destroy((gz_str
6090: 65 61 6d 2a 29 66 69 6c 65 29 3b 0a 0a 20 20 20  eam*)file);..   
60a0: 20 20 20 20 20 70 75 74 4c 6f 6e 67 20 28 73 2d       putLong (s-
60b0: 3e 66 69 6c 65 2c 20 73 2d 3e 63 72 63 29 3b 0a  >file, s->crc);.
60c0: 20 20 20 20 20 20 20 20 70 75 74 4c 6f 6e 67 20          putLong 
60d0: 28 73 2d 3e 66 69 6c 65 2c 20 73 2d 3e 73 74 72  (s->file, s->str
60e0: 65 61 6d 2e 74 6f 74 61 6c 5f 69 6e 29 3b 0a 23  eam.total_in);.#
60f0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
6100: 72 65 74 75 72 6e 20 64 65 73 74 72 6f 79 28 28  return destroy((
6110: 67 7a 5f 73 74 72 65 61 6d 2a 29 66 69 6c 65 29  gz_stream*)file)
6120: 3b 0a 7d 0a 0a 2f 2a 20 3d 3d 3d 3d 3d 3d 3d 3d  ;.}../* ========
6130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6170: 3d 3d 3d 0a 20 20 20 20 20 52 65 74 75 72 6e 73  ===.     Returns
6180: 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
6190: 67 65 20 66 6f 72 20 74 68 65 20 6c 61 73 74 20  ge for the last 
61a0: 65 72 72 6f 72 20 77 68 69 63 68 20 6f 63 63 75  error which occu
61b0: 72 65 64 20 6f 6e 20 74 68 65 0a 20 20 20 67 69  red on the.   gi
61c0: 76 65 6e 20 63 6f 6d 70 72 65 73 73 65 64 20 66  ven compressed f
61d0: 69 6c 65 2e 20 65 72 72 6e 75 6d 20 69 73 20 73  ile. errnum is s
61e0: 65 74 20 74 6f 20 7a 6c 69 62 20 65 72 72 6f 72  et to zlib error
61f0: 20 6e 75 6d 62 65 72 2e 20 49 66 20 61 6e 0a 20   number. If an. 
6200: 20 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20    error occured 
6210: 69 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74  in the file syst
6220: 65 6d 20 61 6e 64 20 6e 6f 74 20 69 6e 20 74 68  em and not in th
6230: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 6c 69  e compression li
6240: 62 72 61 72 79 2c 0a 20 20 20 65 72 72 6e 75 6d  brary,.   errnum
6250: 20 69 73 20 73 65 74 20 74 6f 20 5a 5f 45 52 52   is set to Z_ERR
6260: 4e 4f 20 61 6e 64 20 74 68 65 20 61 70 70 6c 69  NO and the appli
6270: 63 61 74 69 6f 6e 20 6d 61 79 20 63 6f 6e 73 75  cation may consu
6280: 6c 74 20 65 72 72 6e 6f 0a 20 20 20 74 6f 20 67  lt errno.   to g
6290: 65 74 20 74 68 65 20 65 78 61 63 74 20 65 72 72  et the exact err
62a0: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 63 6f 6e 73  or code..*/.cons
62b0: 74 20 63 68 61 72 2a 20 20 5a 45 58 50 4f 52 54  t char*  ZEXPORT
62c0: 20 67 7a 65 72 72 6f 72 20 28 66 69 6c 65 2c 20   gzerror (file, 
62d0: 65 72 72 6e 75 6d 29 0a 20 20 20 20 67 7a 46 69  errnum).    gzFi
62e0: 6c 65 20 66 69 6c 65 3b 0a 20 20 20 20 69 6e 74  le file;.    int
62f0: 20 2a 65 72 72 6e 75 6d 3b 0a 7b 0a 20 20 20 20   *errnum;.{.    
6300: 63 68 61 72 20 2a 6d 3b 0a 20 20 20 20 67 7a 5f  char *m;.    gz_
6310: 73 74 72 65 61 6d 20 2a 73 20 3d 20 28 67 7a 5f  stream *s = (gz_
6320: 73 74 72 65 61 6d 2a 29 66 69 6c 65 3b 0a 0a 20  stream*)file;.. 
6330: 20 20 20 69 66 20 28 73 20 3d 3d 20 4e 55 4c 4c     if (s == NULL
6340: 29 20 7b 0a 20 20 20 20 20 20 20 20 2a 65 72 72  ) {.        *err
6350: 6e 75 6d 20 3d 20 5a 5f 53 54 52 45 41 4d 5f 45  num = Z_STREAM_E
6360: 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 72 65  RROR;.        re
6370: 74 75 72 6e 20 28 63 6f 6e 73 74 20 63 68 61 72  turn (const char
6380: 2a 29 45 52 52 5f 4d 53 47 28 5a 5f 53 54 52 45  *)ERR_MSG(Z_STRE
6390: 41 4d 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  AM_ERROR);.    }
63a0: 0a 20 20 20 20 2a 65 72 72 6e 75 6d 20 3d 20 73  .    *errnum = s
63b0: 2d 3e 7a 5f 65 72 72 3b 0a 20 20 20 20 69 66 20  ->z_err;.    if 
63c0: 28 2a 65 72 72 6e 75 6d 20 3d 3d 20 5a 5f 4f 4b  (*errnum == Z_OK
63d0: 29 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20  ) return (const 
63e0: 63 68 61 72 2a 29 22 22 3b 0a 0a 20 20 20 20 6d  char*)"";..    m
63f0: 20 3d 20 20 28 63 68 61 72 2a 29 28 2a 65 72 72   =  (char*)(*err
6400: 6e 75 6d 20 3d 3d 20 5a 5f 45 52 52 4e 4f 20 3f  num == Z_ERRNO ?
6410: 20 7a 73 74 72 65 72 72 6f 72 28 65 72 72 6e 6f   zstrerror(errno
6420: 29 20 3a 20 73 2d 3e 73 74 72 65 61 6d 2e 6d 73  ) : s->stream.ms
6430: 67 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 20 3d  g);..    if (m =
6440: 3d 20 4e 55 4c 4c 20 7c 7c 20 2a 6d 20 3d 3d 20  = NULL || *m == 
6450: 27 5c 30 27 29 20 6d 20 3d 20 28 63 68 61 72 2a  '\0') m = (char*
6460: 29 45 52 52 5f 4d 53 47 28 73 2d 3e 7a 5f 65 72  )ERR_MSG(s->z_er
6470: 72 29 3b 0a 0a 20 20 20 20 54 52 59 46 52 45 45  r);..    TRYFREE
6480: 28 73 2d 3e 6d 73 67 29 3b 0a 20 20 20 20 73 2d  (s->msg);.    s-
6490: 3e 6d 73 67 20 3d 20 28 63 68 61 72 2a 29 41 4c  >msg = (char*)AL
64a0: 4c 4f 43 28 73 74 72 6c 65 6e 28 73 2d 3e 70 61  LOC(strlen(s->pa
64b0: 74 68 29 20 2b 20 73 74 72 6c 65 6e 28 6d 29 20  th) + strlen(m) 
64c0: 2b 20 33 29 3b 0a 20 20 20 20 73 74 72 63 70 79  + 3);.    strcpy
64d0: 28 73 2d 3e 6d 73 67 2c 20 73 2d 3e 70 61 74 68  (s->msg, s->path
64e0: 29 3b 0a 20 20 20 20 73 74 72 63 61 74 28 73 2d  );.    strcat(s-
64f0: 3e 6d 73 67 2c 20 22 3a 20 22 29 3b 0a 20 20 20  >msg, ": ");.   
6500: 20 73 74 72 63 61 74 28 73 2d 3e 6d 73 67 2c 20   strcat(s->msg, 
6510: 6d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  m);.    return (
6520: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2d 3e 6d  const char*)s->m
6530: 73 67 3b 0a 7d 0a                                sg;.}.