1205194Sdelphij/* gzguts.h -- zlib internal header definitions for gz* operations
2313796Sdelphij * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
3205194Sdelphij * For conditions of distribution and use, see copyright notice in zlib.h
4205194Sdelphij */
5205194Sdelphij
6206499Sdelphij#ifdef _LARGEFILE64_SOURCE
7205194Sdelphij#  ifndef _LARGEFILE_SOURCE
8205990Sdelphij#    define _LARGEFILE_SOURCE 1
9205194Sdelphij#  endif
10205194Sdelphij#  ifdef _FILE_OFFSET_BITS
11205194Sdelphij#    undef _FILE_OFFSET_BITS
12205194Sdelphij#  endif
13205194Sdelphij#endif
14205194Sdelphij
15237248Sdelphij#ifdef HAVE_HIDDEN
16206905Sdelphij#  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
17206905Sdelphij#else
18206905Sdelphij#  define ZLIB_INTERNAL
19206905Sdelphij#endif
20205194Sdelphij
21205194Sdelphij#include <stdio.h>
22205194Sdelphij#include "zlib.h"
23205194Sdelphij#ifdef STDC
24205194Sdelphij#  include <string.h>
25205194Sdelphij#  include <stdlib.h>
26205194Sdelphij#  include <limits.h>
27205194Sdelphij#endif
28313796Sdelphij
29313796Sdelphij#ifndef _POSIX_SOURCE
30313796Sdelphij#  define _POSIX_SOURCE
31313796Sdelphij#endif
32205194Sdelphij#include <fcntl.h>
33205194Sdelphij
34237248Sdelphij#ifdef _WIN32
35237248Sdelphij#  include <stddef.h>
36237248Sdelphij#endif
37237248Sdelphij
38237248Sdelphij#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
39230837Sdelphij#  include <io.h>
40230837Sdelphij#endif
41230837Sdelphij
42313796Sdelphij#if defined(_WIN32) || defined(__CYGWIN__)
43313796Sdelphij#  define WIDECHAR
44313796Sdelphij#endif
45313796Sdelphij
46250224Sdelphij#ifdef WINAPI_FAMILY
47250224Sdelphij#  define open _open
48250224Sdelphij#  define read _read
49250224Sdelphij#  define write _write
50250224Sdelphij#  define close _close
51250224Sdelphij#endif
52250224Sdelphij
53205194Sdelphij#ifdef NO_DEFLATE       /* for compatibility with old definition */
54205194Sdelphij#  define NO_GZCOMPRESS
55205194Sdelphij#endif
56205194Sdelphij
57230837Sdelphij#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
58230837Sdelphij#  ifndef HAVE_VSNPRINTF
59230837Sdelphij#    define HAVE_VSNPRINTF
60230837Sdelphij#  endif
61205194Sdelphij#endif
62205194Sdelphij
63230837Sdelphij#if defined(__CYGWIN__)
64230837Sdelphij#  ifndef HAVE_VSNPRINTF
65230837Sdelphij#    define HAVE_VSNPRINTF
66230837Sdelphij#  endif
67230837Sdelphij#endif
68230837Sdelphij
69230837Sdelphij#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
70230837Sdelphij#  ifndef HAVE_VSNPRINTF
71230837Sdelphij#    define HAVE_VSNPRINTF
72230837Sdelphij#  endif
73230837Sdelphij#endif
74230837Sdelphij
75230837Sdelphij#ifndef HAVE_VSNPRINTF
76230837Sdelphij#  ifdef MSDOS
77230837Sdelphij/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
78250224Sdelphij   but for now we just assume it doesn't. */
79230837Sdelphij#    define NO_vsnprintf
80230837Sdelphij#  endif
81230837Sdelphij#  ifdef __TURBOC__
82230837Sdelphij#    define NO_vsnprintf
83230837Sdelphij#  endif
84230837Sdelphij#  ifdef WIN32
85230837Sdelphij/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
86230837Sdelphij#    if !defined(vsnprintf) && !defined(NO_vsnprintf)
87230837Sdelphij#      if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
88230837Sdelphij#         define vsnprintf _vsnprintf
89230837Sdelphij#      endif
90230837Sdelphij#    endif
91230837Sdelphij#  endif
92230837Sdelphij#  ifdef __SASC
93230837Sdelphij#    define NO_vsnprintf
94230837Sdelphij#  endif
95230837Sdelphij#  ifdef VMS
96230837Sdelphij#    define NO_vsnprintf
97230837Sdelphij#  endif
98230837Sdelphij#  ifdef __OS400__
99230837Sdelphij#    define NO_vsnprintf
100230837Sdelphij#  endif
101230837Sdelphij#  ifdef __MVS__
102230837Sdelphij#    define NO_vsnprintf
103230837Sdelphij#  endif
104230837Sdelphij#endif
105230837Sdelphij
106313796Sdelphij/* unlike snprintf (which is required in C99), _snprintf does not guarantee
107313796Sdelphij   null termination of the result -- however this is only used in gzlib.c where
108250224Sdelphij   the result is assured to fit in the space provided */
109313796Sdelphij#if defined(_MSC_VER) && _MSC_VER < 1900
110250224Sdelphij#  define snprintf _snprintf
111250224Sdelphij#endif
112250224Sdelphij
113205194Sdelphij#ifndef local
114205194Sdelphij#  define local static
115205194Sdelphij#endif
116313796Sdelphij/* since "static" is used to mean two completely different things in C, we
117313796Sdelphij   define "local" for the non-static meaning of "static", for readability
118313796Sdelphij   (compile with -Dlocal if your debugger can't find static symbols) */
119205194Sdelphij
120205194Sdelphij/* gz* functions always use library allocation functions */
121205194Sdelphij#ifndef STDC
122205194Sdelphij  extern voidp  malloc OF((uInt size));
123205194Sdelphij  extern void   free   OF((voidpf ptr));
124205194Sdelphij#endif
125205194Sdelphij
126205194Sdelphij/* get errno and strerror definition */
127205990Sdelphij#if defined UNDER_CE
128205194Sdelphij#  include <windows.h>
129205194Sdelphij#  define zstrerror() gz_strwinerror((DWORD)GetLastError())
130205194Sdelphij#else
131237248Sdelphij#  ifndef NO_STRERROR
132205194Sdelphij#    include <errno.h>
133205194Sdelphij#    define zstrerror() strerror(errno)
134205194Sdelphij#  else
135205194Sdelphij#    define zstrerror() "stdio error (consult errno)"
136205194Sdelphij#  endif
137205194Sdelphij#endif
138205194Sdelphij
139206499Sdelphij/* provide prototypes for these when building zlib without LFS */
140206499Sdelphij#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
141206499Sdelphij    ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
142206499Sdelphij    ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
143206499Sdelphij    ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
144206499Sdelphij    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
145205194Sdelphij#endif
146205194Sdelphij
147230837Sdelphij/* default memLevel */
148230837Sdelphij#if MAX_MEM_LEVEL >= 8
149230837Sdelphij#  define DEF_MEM_LEVEL 8
150230837Sdelphij#else
151230837Sdelphij#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL
152230837Sdelphij#endif
153230837Sdelphij
154250224Sdelphij/* default i/o buffer size -- double this for output when reading (this and
155250224Sdelphij   twice this must be able to fit in an unsigned type) */
156205194Sdelphij#define GZBUFSIZE 8192
157205194Sdelphij
158205194Sdelphij/* gzip modes, also provide a little integrity check on the passed structure */
159205194Sdelphij#define GZ_NONE 0
160205194Sdelphij#define GZ_READ 7247
161205194Sdelphij#define GZ_WRITE 31153
162205194Sdelphij#define GZ_APPEND 1     /* mode set to GZ_WRITE after the file is opened */
163205194Sdelphij
164205194Sdelphij/* values for gz_state how */
165205194Sdelphij#define LOOK 0      /* look for a gzip header */
166205194Sdelphij#define COPY 1      /* copy input directly */
167205194Sdelphij#define GZIP 2      /* decompress a gzip stream */
168205194Sdelphij
169205194Sdelphij/* internal gzip file state data structure */
170205194Sdelphijtypedef struct {
171230837Sdelphij        /* exposed contents for gzgetc() macro */
172230837Sdelphij    struct gzFile_s x;      /* "x" for exposed */
173230837Sdelphij                            /* x.have: number of bytes available at x.next */
174230837Sdelphij                            /* x.next: next output data to deliver or write */
175230837Sdelphij                            /* x.pos: current position in uncompressed data */
176205194Sdelphij        /* used for both reading and writing */
177205194Sdelphij    int mode;               /* see gzip modes above */
178205194Sdelphij    int fd;                 /* file descriptor */
179205194Sdelphij    char *path;             /* path or fd for error messages */
180205194Sdelphij    unsigned size;          /* buffer size, zero if not allocated yet */
181205194Sdelphij    unsigned want;          /* requested buffer size, default is GZBUFSIZE */
182313796Sdelphij    unsigned char *in;      /* input buffer (double-sized when writing) */
183205194Sdelphij    unsigned char *out;     /* output buffer (double-sized when reading) */
184230837Sdelphij    int direct;             /* 0 if processing gzip, 1 if transparent */
185205194Sdelphij        /* just for reading */
186230837Sdelphij    int how;                /* 0: get header, 1: copy, 2: decompress */
187230837Sdelphij    z_off64_t start;        /* where the gzip data started, for rewinding */
188205194Sdelphij    int eof;                /* true if end of input file reached */
189230837Sdelphij    int past;               /* true if read requested past end */
190205194Sdelphij        /* just for writing */
191205194Sdelphij    int level;              /* compression level */
192205194Sdelphij    int strategy;           /* compression strategy */
193205194Sdelphij        /* seek request */
194205194Sdelphij    z_off64_t skip;         /* amount to skip (already rewound if backwards) */
195205194Sdelphij    int seek;               /* true if seek request pending */
196205194Sdelphij        /* error information */
197205194Sdelphij    int err;                /* error code */
198205194Sdelphij    char *msg;              /* error message */
199205194Sdelphij        /* zlib inflate or deflate stream */
200205194Sdelphij    z_stream strm;          /* stream structure in-place (not a pointer) */
201205194Sdelphij} gz_state;
202205194Sdelphijtypedef gz_state FAR *gz_statep;
203205194Sdelphij
204205194Sdelphij/* shared functions */
205206905Sdelphijvoid ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
206205990Sdelphij#if defined UNDER_CE
207206905Sdelphijchar ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
208205194Sdelphij#endif
209205194Sdelphij
210205194Sdelphij/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
211205194Sdelphij   value -- needed when comparing unsigned to z_off64_t, which is signed
212205194Sdelphij   (possible z_off64_t types off_t, off64_t, and long are all signed) */
213205194Sdelphij#ifdef INT_MAX
214205194Sdelphij#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
215205194Sdelphij#else
216206905Sdelphijunsigned ZLIB_INTERNAL gz_intmax OF((void));
217205194Sdelphij#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
218205194Sdelphij#endif
219