gzguts.h revision 237410
154359Sroberto/* gzguts.h -- zlib internal header definitions for gz* operations 254359Sroberto * Copyright (C) 2004, 2005, 2010, 2011, 2012 Mark Adler 354359Sroberto * For conditions of distribution and use, see copyright notice in zlib.h 4285612Sdelphij */ 554359Sroberto 6285612Sdelphij#ifdef _LARGEFILE64_SOURCE 7182007Sroberto# ifndef _LARGEFILE_SOURCE 8182007Sroberto# define _LARGEFILE_SOURCE 1 9182007Sroberto# endif 10285612Sdelphij# ifdef _FILE_OFFSET_BITS 11285612Sdelphij# undef _FILE_OFFSET_BITS 12285612Sdelphij# endif 13285612Sdelphij#endif 14285612Sdelphij 15285612Sdelphij#ifdef HAVE_HIDDEN 16285612Sdelphij# define ZLIB_INTERNAL __attribute__((visibility ("hidden"))) 17285612Sdelphij#else 18285612Sdelphij# define ZLIB_INTERNAL 19285612Sdelphij#endif 20285612Sdelphij 21182007Sroberto#include <stdio.h> 2282498Sroberto#include "zlib.h" 2382498Sroberto#ifdef STDC 2482498Sroberto# include <string.h> 25285612Sdelphij# include <stdlib.h> 26285612Sdelphij# include <limits.h> 27285612Sdelphij#endif 28285612Sdelphij#include <fcntl.h> 29285612Sdelphij 30285612Sdelphij#ifdef _WIN32 31285612Sdelphij# include <stddef.h> 3282498Sroberto#endif 33285612Sdelphij 34182007Sroberto#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32) 35293650Sglebius# include <io.h> 3654359Sroberto#endif 3754359Sroberto 38182007Sroberto#ifdef NO_DEFLATE /* for compatibility with old definition */ 39182007Sroberto# define NO_GZCOMPRESS 40182007Sroberto#endif 4154359Sroberto 4254359Sroberto#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550) 43182007Sroberto# ifndef HAVE_VSNPRINTF 44182007Sroberto# define HAVE_VSNPRINTF 45182007Sroberto# endif 46182007Sroberto#endif 47182007Sroberto 4854359Sroberto#if defined(__CYGWIN__) 4954359Sroberto# ifndef HAVE_VSNPRINTF 5054359Sroberto# define HAVE_VSNPRINTF 5154359Sroberto# endif 5254359Sroberto#endif 5354359Sroberto 5454359Sroberto#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410) 5554359Sroberto# ifndef HAVE_VSNPRINTF 5654359Sroberto# define HAVE_VSNPRINTF 5754359Sroberto# endif 5854359Sroberto#endif 5954359Sroberto 60182007Sroberto#ifndef HAVE_VSNPRINTF 6154359Sroberto# ifdef MSDOS 62285612Sdelphij/* vsnprintf may exist on some MS-DOS compilers (DJGPP?), 63285612Sdelphij but for now we just assume it doesn't. */ 6454359Sroberto# define NO_vsnprintf 6554359Sroberto# endif 66182007Sroberto# ifdef __TURBOC__ 67182007Sroberto# define NO_vsnprintf 68182007Sroberto# endif 69182007Sroberto# ifdef WIN32 70182007Sroberto/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */ 71285612Sdelphij# if !defined(vsnprintf) && !defined(NO_vsnprintf) 7254359Sroberto# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 ) 7354359Sroberto# define vsnprintf _vsnprintf 7454359Sroberto# endif 75285612Sdelphij# endif 76285612Sdelphij# endif 77285612Sdelphij# ifdef __SASC 78293650Sglebius# define NO_vsnprintf 79293650Sglebius# endif 80285612Sdelphij# ifdef VMS 81285612Sdelphij# define NO_vsnprintf 82285612Sdelphij# endif 83285612Sdelphij# ifdef __OS400__ 84285612Sdelphij# define NO_vsnprintf 85285612Sdelphij# endif 86285612Sdelphij# ifdef __MVS__ 87285612Sdelphij# define NO_vsnprintf 88285612Sdelphij# endif 89285612Sdelphij#endif 90285612Sdelphij 91285612Sdelphij#ifndef local 92285612Sdelphij# define local static 93285612Sdelphij#endif 94285612Sdelphij/* compile with -Dlocal if your debugger can't find static symbols */ 95285612Sdelphij 96285612Sdelphij/* gz* functions always use library allocation functions */ 97285612Sdelphij#ifndef STDC 98285612Sdelphij extern voidp malloc OF((uInt size)); 99285612Sdelphij extern void free OF((voidpf ptr)); 100285612Sdelphij#endif 101285612Sdelphij 102285612Sdelphij/* get errno and strerror definition */ 103285612Sdelphij#if defined UNDER_CE 104285612Sdelphij# include <windows.h> 10554359Sroberto# define zstrerror() gz_strwinerror((DWORD)GetLastError()) 10654359Sroberto#else 10754359Sroberto# ifndef NO_STRERROR 10854359Sroberto# include <errno.h> 10954359Sroberto# define zstrerror() strerror(errno) 11054359Sroberto# else 11154359Sroberto# define zstrerror() "stdio error (consult errno)" 11254359Sroberto# endif 11354359Sroberto#endif 11454359Sroberto 11554359Sroberto/* provide prototypes for these when building zlib without LFS */ 11654359Sroberto#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0 11754359Sroberto ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); 118182007Sroberto ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); 11954359Sroberto ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); 12054359Sroberto ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); 121182007Sroberto#endif 12254359Sroberto 12354359Sroberto/* default memLevel */ 124132451Sroberto#if MAX_MEM_LEVEL >= 8 125132451Sroberto# define DEF_MEM_LEVEL 8 12654359Sroberto#else 12754359Sroberto# define DEF_MEM_LEVEL MAX_MEM_LEVEL 12854359Sroberto#endif 12954359Sroberto 13054359Sroberto/* default i/o buffer size -- double this for output when reading */ 13154359Sroberto#define GZBUFSIZE 8192 13254359Sroberto 13354359Sroberto/* gzip modes, also provide a little integrity check on the passed structure */ 13454359Sroberto#define GZ_NONE 0 13554359Sroberto#define GZ_READ 7247 13654359Sroberto#define GZ_WRITE 31153 13754359Sroberto#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */ 13854359Sroberto 13954359Sroberto/* values for gz_state how */ 14054359Sroberto#define LOOK 0 /* look for a gzip header */ 14154359Sroberto#define COPY 1 /* copy input directly */ 142182007Sroberto#define GZIP 2 /* decompress a gzip stream */ 14354359Sroberto 14454359Sroberto/* internal gzip file state data structure */ 14554359Srobertotypedef struct { 14654359Sroberto /* exposed contents for gzgetc() macro */ 14754359Sroberto struct gzFile_s x; /* "x" for exposed */ 14854359Sroberto /* x.have: number of bytes available at x.next */ 14954359Sroberto /* x.next: next output data to deliver or write */ 15054359Sroberto /* x.pos: current position in uncompressed data */ 15154359Sroberto /* used for both reading and writing */ 15254359Sroberto int mode; /* see gzip modes above */ 15354359Sroberto int fd; /* file descriptor */ 15454359Sroberto char *path; /* path or fd for error messages */ 15554359Sroberto unsigned size; /* buffer size, zero if not allocated yet */ 15654359Sroberto unsigned want; /* requested buffer size, default is GZBUFSIZE */ 15754359Sroberto unsigned char *in; /* input buffer */ 15854359Sroberto unsigned char *out; /* output buffer (double-sized when reading) */ 159285612Sdelphij int direct; /* 0 if processing gzip, 1 if transparent */ 16054359Sroberto /* just for reading */ 16154359Sroberto int how; /* 0: get header, 1: copy, 2: decompress */ 16254359Sroberto z_off64_t start; /* where the gzip data started, for rewinding */ 16354359Sroberto int eof; /* true if end of input file reached */ 16454359Sroberto int past; /* true if read requested past end */ 16554359Sroberto /* just for writing */ 16654359Sroberto int level; /* compression level */ 167182007Sroberto int strategy; /* compression strategy */ 168182007Sroberto /* seek request */ 16954359Sroberto z_off64_t skip; /* amount to skip (already rewound if backwards) */ 17054359Sroberto int seek; /* true if seek request pending */ 17154359Sroberto /* error information */ 17254359Sroberto int err; /* error code */ 173285612Sdelphij char *msg; /* error message */ 174285612Sdelphij /* zlib inflate or deflate stream */ 17554359Sroberto z_stream strm; /* stream structure in-place (not a pointer) */ 17654359Sroberto} gz_state; 177132451Srobertotypedef gz_state FAR *gz_statep; 17854359Sroberto 179132451Sroberto/* shared functions */ 180132451Srobertovoid ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *)); 181132451Sroberto#if defined UNDER_CE 18254359Srobertochar ZLIB_INTERNAL *gz_strwinerror OF((DWORD error)); 183132451Sroberto#endif 18454359Sroberto 18554359Sroberto/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t 18654359Sroberto value -- needed when comparing unsigned to z_off64_t, which is signed 18754359Sroberto (possible z_off64_t types off_t, off64_t, and long are all signed) */ 18854359Sroberto#ifdef INT_MAX 18954359Sroberto# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX) 19054359Sroberto#else 19154359Srobertounsigned ZLIB_INTERNAL gz_intmax OF((void)); 19254359Sroberto# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax()) 19354359Sroberto#endif 19454359Sroberto