1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* gzguts.h -- zlib internal header definitions for gz* operations 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * Copyright (C) 2004, 2005, 2010 Mark Adler 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) * For conditions of distribution and use, see copyright notice in zlib.h 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) */ 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef _LARGEFILE64_SOURCE 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# ifndef _LARGEFILE_SOURCE 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define _LARGEFILE_SOURCE 1 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# endif 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# ifdef _FILE_OFFSET_BITS 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# undef _FILE_OFFSET_BITS 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# endif 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if ((__GNUC__-0) * 10 + __GNUC_MINOR__-0 >= 33) && !defined(NO_VIZ) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define ZLIB_INTERNAL 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <stdio.h> 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "zlib.h" 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef STDC 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <string.h> 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <stdlib.h> 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <limits.h> 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <fcntl.h> 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef NO_DEFLATE /* for compatibility with old definition */ 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define NO_GZCOMPRESS 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef _MSC_VER 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <io.h> 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define vsnprintf _vsnprintf 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef local 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define local static 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* compile with -Dlocal if your debugger can't find static symbols */ 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* gz* functions always use library allocation functions */ 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef STDC 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extern voidp malloc OF((uInt size)); 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) extern void free OF((voidpf ptr)); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* get errno and strerror definition */ 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined UNDER_CE 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <windows.h> 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define zstrerror() gz_strwinerror((DWORD)GetLastError()) 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# ifdef STDC 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# include <errno.h> 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define zstrerror() strerror(errno) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# else 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define zstrerror() "stdio error (consult errno)" 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# endif 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* provide prototypes for these when building zlib without LFS */ 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* default i/o buffer size -- double this for output when reading */ 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZBUFSIZE 8192 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* gzip modes, also provide a little integrity check on the passed structure */ 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZ_NONE 0 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZ_READ 7247 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZ_WRITE 31153 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* values for gz_state how */ 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define LOOK 0 /* look for a gzip header */ 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define COPY 1 /* copy input directly */ 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define GZIP 2 /* decompress a gzip stream */ 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* internal gzip file state data structure */ 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef struct { 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* used for both reading and writing */ 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int mode; /* see gzip modes above */ 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int fd; /* file descriptor */ 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char *path; /* path or fd for error messages */ 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) z_off64_t pos; /* current position in uncompressed data */ 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned size; /* buffer size, zero if not allocated yet */ 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned want; /* requested buffer size, default is GZBUFSIZE */ 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char *in; /* input buffer */ 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char *out; /* output buffer (double-sized when reading) */ 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned char *next; /* next output data to deliver or write */ 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* just for reading */ 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unsigned have; /* amount of output data unused at next */ 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int eof; /* true if end of input file reached */ 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) z_off64_t start; /* where the gzip data started, for rewinding */ 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) z_off64_t raw; /* where the raw data started, for seeking */ 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int how; /* 0: get header, 1: copy, 2: decompress */ 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int direct; /* true if last read direct, false if gzip */ 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* just for writing */ 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int level; /* compression level */ 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int strategy; /* compression strategy */ 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* seek request */ 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) z_off64_t skip; /* amount to skip (already rewound if backwards) */ 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int seek; /* true if seek request pending */ 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* error information */ 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int err; /* error code */ 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) char *msg; /* error message */ 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) /* zlib inflate or deflate stream */ 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) z_stream strm; /* stream structure in-place (not a pointer) */ 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} gz_state; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef gz_state FAR *gz_statep; 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* shared functions */ 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined UNDER_CE 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) value -- needed when comparing unsigned to z_off64_t, which is signed 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) (possible z_off64_t types off_t, off64_t, and long are all signed) */ 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifdef INT_MAX 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#else 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)unsigned ZLIB_INTERNAL gz_intmax OF((void)); 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 133