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