1*c9083b85SXin LI /* gzguts.h -- zlib internal header definitions for gz* operations 2*c9083b85SXin LI * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler 3*c9083b85SXin LI * For conditions of distribution and use, see copyright notice in zlib.h 4*c9083b85SXin LI */ 5*c9083b85SXin LI 6*c9083b85SXin LI #ifdef _LARGEFILE64_SOURCE 7*c9083b85SXin LI # ifndef _LARGEFILE_SOURCE 8*c9083b85SXin LI # define _LARGEFILE_SOURCE 1 9*c9083b85SXin LI # endif 10*c9083b85SXin LI # ifdef _FILE_OFFSET_BITS 11*c9083b85SXin LI # undef _FILE_OFFSET_BITS 12*c9083b85SXin LI # endif 13*c9083b85SXin LI #endif 14*c9083b85SXin LI 15*c9083b85SXin LI #ifdef HAVE_HIDDEN 16*c9083b85SXin LI # define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) 17*c9083b85SXin LI #else 18*c9083b85SXin LI # define ZLIB_INTERNAL 19*c9083b85SXin LI #endif 20*c9083b85SXin LI 21*c9083b85SXin LI #include <stdio.h> 22*c9083b85SXin LI #include "zlib.h" 23*c9083b85SXin LI #ifdef STDC 24*c9083b85SXin LI # include <string.h> 25*c9083b85SXin LI # include <stdlib.h> 26*c9083b85SXin LI # include <limits.h> 27*c9083b85SXin LI #endif 28*c9083b85SXin LI 29*c9083b85SXin LI #ifndef _POSIX_SOURCE 30*c9083b85SXin LI # define _POSIX_SOURCE 31*c9083b85SXin LI #endif 32*c9083b85SXin LI #include <fcntl.h> 33*c9083b85SXin LI 34*c9083b85SXin LI #ifdef _WIN32 35*c9083b85SXin LI # include <stddef.h> 36*c9083b85SXin LI #endif 37*c9083b85SXin LI 38*c9083b85SXin LI #if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) 39*c9083b85SXin LI # include <io.h> 40*c9083b85SXin LI #endif 41*c9083b85SXin LI 42*c9083b85SXin LI #if defined(_WIN32) || defined(__CYGWIN__) 43*c9083b85SXin LI # define WIDECHAR 44*c9083b85SXin LI #endif 45*c9083b85SXin LI 46*c9083b85SXin LI #ifdef WINAPI_FAMILY 47*c9083b85SXin LI # define open _open 48*c9083b85SXin LI # define read _read 49*c9083b85SXin LI # define write _write 50*c9083b85SXin LI # define close _close 51*c9083b85SXin LI #endif 52*c9083b85SXin LI 53*c9083b85SXin LI #ifdef NO_DEFLATE /* for compatibility with old definition */ 54*c9083b85SXin LI # define NO_GZCOMPRESS 55*c9083b85SXin LI #endif 56*c9083b85SXin LI 57*c9083b85SXin LI #if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) 58*c9083b85SXin LI # ifndef HAVE_VSNPRINTF 59*c9083b85SXin LI # define HAVE_VSNPRINTF 60*c9083b85SXin LI # endif 61*c9083b85SXin LI #endif 62*c9083b85SXin LI 63*c9083b85SXin LI #if defined(__CYGWIN__) 64*c9083b85SXin LI # ifndef HAVE_VSNPRINTF 65*c9083b85SXin LI # define HAVE_VSNPRINTF 66*c9083b85SXin LI # endif 67*c9083b85SXin LI #endif 68*c9083b85SXin LI 69*c9083b85SXin LI #if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) 70*c9083b85SXin LI # ifndef HAVE_VSNPRINTF 71*c9083b85SXin LI # define HAVE_VSNPRINTF 72*c9083b85SXin LI # endif 73*c9083b85SXin LI #endif 74*c9083b85SXin LI 75*c9083b85SXin LI #ifndef HAVE_VSNPRINTF 76*c9083b85SXin LI # ifdef MSDOS 77*c9083b85SXin LI /* vsnprintf may exist on some MS-DOS compilers (DJGPP?), 78*c9083b85SXin LI but for now we just assume it doesn't. */ 79*c9083b85SXin LI # define NO_vsnprintf 80*c9083b85SXin LI # endif 81*c9083b85SXin LI # ifdef __TURBOC__ 82*c9083b85SXin LI # define NO_vsnprintf 83*c9083b85SXin LI # endif 84*c9083b85SXin LI # ifdef WIN32 85*c9083b85SXin LI /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ 86*c9083b85SXin LI # if !defined(vsnprintf) && !defined(NO_vsnprintf) 87*c9083b85SXin LI # if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) 88*c9083b85SXin LI # define vsnprintf _vsnprintf 89*c9083b85SXin LI # endif 90*c9083b85SXin LI # endif 91*c9083b85SXin LI # endif 92*c9083b85SXin LI # ifdef __SASC 93*c9083b85SXin LI # define NO_vsnprintf 94*c9083b85SXin LI # endif 95*c9083b85SXin LI # ifdef VMS 96*c9083b85SXin LI # define NO_vsnprintf 97*c9083b85SXin LI # endif 98*c9083b85SXin LI # ifdef __OS400__ 99*c9083b85SXin LI # define NO_vsnprintf 100*c9083b85SXin LI # endif 101*c9083b85SXin LI # ifdef __MVS__ 102*c9083b85SXin LI # define NO_vsnprintf 103*c9083b85SXin LI # endif 104*c9083b85SXin LI #endif 105*c9083b85SXin LI 106*c9083b85SXin LI /* unlike snprintf (which is required in C99), _snprintf does not guarantee 107*c9083b85SXin LI null termination of the result -- however this is only used in gzlib.c where 108*c9083b85SXin LI the result is assured to fit in the space provided */ 109*c9083b85SXin LI #if defined(_MSC_VER) && _MSC_VER < 1900 110*c9083b85SXin LI # define snprintf _snprintf 111*c9083b85SXin LI #endif 112*c9083b85SXin LI 113*c9083b85SXin LI #ifndef local 114*c9083b85SXin LI # define local static 115*c9083b85SXin LI #endif 116*c9083b85SXin LI /* since "static" is used to mean two completely different things in C, we 117*c9083b85SXin LI define "local" for the non-static meaning of "static", for readability 118*c9083b85SXin LI (compile with -Dlocal if your debugger can't find static symbols) */ 119*c9083b85SXin LI 120*c9083b85SXin LI /* gz* functions always use library allocation functions */ 121*c9083b85SXin LI #ifndef STDC 122*c9083b85SXin LI extern voidp malloc OF((uInt size)); 123*c9083b85SXin LI extern void free OF((voidpf ptr)); 124*c9083b85SXin LI #endif 125*c9083b85SXin LI 126*c9083b85SXin LI /* get errno and strerror definition */ 127*c9083b85SXin LI #if defined UNDER_CE 128*c9083b85SXin LI # include <windows.h> 129*c9083b85SXin LI # define zstrerror() gz_strwinerror((DWORD)GetLastError()) 130*c9083b85SXin LI #else 131*c9083b85SXin LI # ifndef NO_STRERROR 132*c9083b85SXin LI # include <errno.h> 133*c9083b85SXin LI # define zstrerror() strerror(errno) 134*c9083b85SXin LI # else 135*c9083b85SXin LI # define zstrerror() "stdio error (consult errno)" 136*c9083b85SXin LI # endif 137*c9083b85SXin LI #endif 138*c9083b85SXin LI 139*c9083b85SXin LI /* provide prototypes for these when building zlib without LFS */ 140*c9083b85SXin LI #if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 141*c9083b85SXin LI ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); 142*c9083b85SXin LI ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); 143*c9083b85SXin LI ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); 144*c9083b85SXin LI ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); 145*c9083b85SXin LI #endif 146*c9083b85SXin LI 147*c9083b85SXin LI /* default memLevel */ 148*c9083b85SXin LI #if MAX_MEM_LEVEL >= 8 149*c9083b85SXin LI # define DEF_MEM_LEVEL 8 150*c9083b85SXin LI #else 151*c9083b85SXin LI # define DEF_MEM_LEVEL MAX_MEM_LEVEL 152*c9083b85SXin LI #endif 153*c9083b85SXin LI 154*c9083b85SXin LI /* default i/o buffer size -- double this for output when reading (this and 155*c9083b85SXin LI twice this must be able to fit in an unsigned type) */ 156*c9083b85SXin LI #define GZBUFSIZE 8192 157*c9083b85SXin LI 158*c9083b85SXin LI /* gzip modes, also provide a little integrity check on the passed structure */ 159*c9083b85SXin LI #define GZ_NONE 0 160*c9083b85SXin LI #define GZ_READ 7247 161*c9083b85SXin LI #define GZ_WRITE 31153 162*c9083b85SXin LI #define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ 163*c9083b85SXin LI 164*c9083b85SXin LI /* values for gz_state how */ 165*c9083b85SXin LI #define LOOK 0 /* look for a gzip header */ 166*c9083b85SXin LI #define COPY 1 /* copy input directly */ 167*c9083b85SXin LI #define GZIP 2 /* decompress a gzip stream */ 168*c9083b85SXin LI 169*c9083b85SXin LI /* internal gzip file state data structure */ 170*c9083b85SXin LI typedef struct { 171*c9083b85SXin LI /* exposed contents for gzgetc() macro */ 172*c9083b85SXin LI struct gzFile_s x; /* "x" for exposed */ 173*c9083b85SXin LI /* x.have: number of bytes available at x.next */ 174*c9083b85SXin LI /* x.next: next output data to deliver or write */ 175*c9083b85SXin LI /* x.pos: current position in uncompressed data */ 176*c9083b85SXin LI /* used for both reading and writing */ 177*c9083b85SXin LI int mode; /* see gzip modes above */ 178*c9083b85SXin LI int fd; /* file descriptor */ 179*c9083b85SXin LI char *path; /* path or fd for error messages */ 180*c9083b85SXin LI unsigned size; /* buffer size, zero if not allocated yet */ 181*c9083b85SXin LI unsigned want; /* requested buffer size, default is GZBUFSIZE */ 182*c9083b85SXin LI unsigned char *in; /* input buffer (double-sized when writing) */ 183*c9083b85SXin LI unsigned char *out; /* output buffer (double-sized when reading) */ 184*c9083b85SXin LI int direct; /* 0 if processing gzip, 1 if transparent */ 185*c9083b85SXin LI /* just for reading */ 186*c9083b85SXin LI int how; /* 0: get header, 1: copy, 2: decompress */ 187*c9083b85SXin LI z_off64_t start; /* where the gzip data started, for rewinding */ 188*c9083b85SXin LI int eof; /* true if end of input file reached */ 189*c9083b85SXin LI int past; /* true if read requested past end */ 190*c9083b85SXin LI /* just for writing */ 191*c9083b85SXin LI int level; /* compression level */ 192*c9083b85SXin LI int strategy; /* compression strategy */ 193*c9083b85SXin LI /* seek request */ 194*c9083b85SXin LI z_off64_t skip; /* amount to skip (already rewound if backwards) */ 195*c9083b85SXin LI int seek; /* true if seek request pending */ 196*c9083b85SXin LI /* error information */ 197*c9083b85SXin LI int err; /* error code */ 198*c9083b85SXin LI char *msg; /* error message */ 199*c9083b85SXin LI /* zlib inflate or deflate stream */ 200*c9083b85SXin LI z_stream strm; /* stream structure in-place (not a pointer) */ 201*c9083b85SXin LI } gz_state; 202*c9083b85SXin LI typedef gz_state FAR *gz_statep; 203*c9083b85SXin LI 204*c9083b85SXin LI /* shared functions */ 205*c9083b85SXin LI void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); 206*c9083b85SXin LI #if defined UNDER_CE 207*c9083b85SXin LI char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); 208*c9083b85SXin LI #endif 209*c9083b85SXin LI 210*c9083b85SXin LI /* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t 211*c9083b85SXin LI value -- needed when comparing unsigned to z_off64_t, which is signed 212*c9083b85SXin LI (possible z_off64_t types off_t, off64_t, and long are all signed) */ 213*c9083b85SXin LI #ifdef INT_MAX 214*c9083b85SXin LI # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) 215*c9083b85SXin LI #else 216*c9083b85SXin LI unsigned ZLIB_INTERNAL gz_intmax OF((void)); 217*c9083b85SXin LI # define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) 218*c9083b85SXin LI #endif 219