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