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