xref: /netbsd-src/external/bsd/zstd/dist/zlibWrapper/zstd_zlibwrapper.c (revision 3117ece4fc4a4ca4489ba793710b60b0d26bab6c)
1*3117ece4Schristos /*
2*3117ece4Schristos  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*3117ece4Schristos  * All rights reserved.
4*3117ece4Schristos  *
5*3117ece4Schristos  * This source code is licensed under both the BSD-style license (found in the
6*3117ece4Schristos  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*3117ece4Schristos  * in the COPYING file in the root directory of this source tree).
8*3117ece4Schristos  * You may select, at your option, one of the above-listed licenses.
9*3117ece4Schristos  */
10*3117ece4Schristos 
11*3117ece4Schristos 
12*3117ece4Schristos /* ===   Tuning parameters   === */
13*3117ece4Schristos #ifndef ZWRAP_USE_ZSTD
14*3117ece4Schristos     #define ZWRAP_USE_ZSTD 0
15*3117ece4Schristos #endif
16*3117ece4Schristos 
17*3117ece4Schristos 
18*3117ece4Schristos /* ===   Dependencies   === */
19*3117ece4Schristos #include <stdlib.h>
20*3117ece4Schristos #include <stdio.h>                 /* vsprintf */
21*3117ece4Schristos #include <stdarg.h>                /* va_list, for z_gzprintf */
22*3117ece4Schristos #include <string.h>
23*3117ece4Schristos #define NO_DUMMY_DECL
24*3117ece4Schristos #define ZLIB_CONST
25*3117ece4Schristos #include <zlib.h>                  /* without #define Z_PREFIX */
26*3117ece4Schristos #include "zstd_zlibwrapper.h"
27*3117ece4Schristos #define ZSTD_STATIC_LINKING_ONLY   /* ZSTD_isFrame, ZSTD_MAGICNUMBER, ZSTD_customMem */
28*3117ece4Schristos #include "zstd.h"
29*3117ece4Schristos 
30*3117ece4Schristos 
31*3117ece4Schristos /* ===   Constants   === */
32*3117ece4Schristos #define Z_INFLATE_SYNC              8
33*3117ece4Schristos #define ZLIB_HEADERSIZE             4
34*3117ece4Schristos #define ZSTD_HEADERSIZE             ZSTD_FRAMEHEADERSIZE_MIN(ZSTD_f_zstd1)
35*3117ece4Schristos #define ZWRAP_DEFAULT_CLEVEL        3   /* Z_DEFAULT_COMPRESSION is translated to ZWRAP_DEFAULT_CLEVEL for zstd */
36*3117ece4Schristos 
37*3117ece4Schristos 
38*3117ece4Schristos /* ===   Debug   === */
39*3117ece4Schristos #define LOG_WRAPPERC(...)  /* fprintf(stderr, __VA_ARGS__) */
40*3117ece4Schristos #define LOG_WRAPPERD(...)  /* fprintf(stderr, __VA_ARGS__) */
41*3117ece4Schristos 
42*3117ece4Schristos #define FINISH_WITH_GZ_ERR(msg) { (void)msg; return Z_STREAM_ERROR; }
43*3117ece4Schristos #define FINISH_WITH_NULL_ERR(msg) { (void)msg; return NULL; }
44*3117ece4Schristos 
45*3117ece4Schristos /* ===   Utility   === */
46*3117ece4Schristos 
47*3117ece4Schristos #define MIN(x,y) ((x) < (y) ? (x) : (y))
48*3117ece4Schristos 
49*3117ece4Schristos static unsigned ZWRAP_isLittleEndian(void)
50*3117ece4Schristos {
51*3117ece4Schristos     const union { unsigned u; char c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
52*3117ece4Schristos     return one.c[0];
53*3117ece4Schristos }
54*3117ece4Schristos 
55*3117ece4Schristos #ifndef __has_builtin
56*3117ece4Schristos # define __has_builtin(x) 0
57*3117ece4Schristos #endif
58*3117ece4Schristos 
59*3117ece4Schristos static unsigned ZWRAP_swap32(unsigned in)
60*3117ece4Schristos {
61*3117ece4Schristos #if defined(_MSC_VER)     /* Visual Studio */
62*3117ece4Schristos     return _byteswap_ulong(in);
63*3117ece4Schristos #elif (defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)) \
64*3117ece4Schristos   || (defined(__clang__) && __has_builtin(__builtin_bswap32))
65*3117ece4Schristos     return __builtin_bswap32(in);
66*3117ece4Schristos #else
67*3117ece4Schristos     return  ((in << 24) & 0xff000000 ) |
68*3117ece4Schristos             ((in <<  8) & 0x00ff0000 ) |
69*3117ece4Schristos             ((in >>  8) & 0x0000ff00 ) |
70*3117ece4Schristos             ((in >> 24) & 0x000000ff );
71*3117ece4Schristos #endif
72*3117ece4Schristos }
73*3117ece4Schristos 
74*3117ece4Schristos static unsigned ZWRAP_readLE32(const void* ptr)
75*3117ece4Schristos {
76*3117ece4Schristos     unsigned value;
77*3117ece4Schristos     memcpy(&value, ptr, sizeof(value));
78*3117ece4Schristos     if (ZWRAP_isLittleEndian())
79*3117ece4Schristos         return value;
80*3117ece4Schristos     else
81*3117ece4Schristos         return ZWRAP_swap32(value);
82*3117ece4Schristos }
83*3117ece4Schristos 
84*3117ece4Schristos 
85*3117ece4Schristos /* ===   Wrapper   === */
86*3117ece4Schristos static int g_ZWRAP_useZSTDcompression = ZWRAP_USE_ZSTD; /* 0 = don't use ZSTD */
87*3117ece4Schristos 
88*3117ece4Schristos void ZWRAP_useZSTDcompression(int turn_on) { g_ZWRAP_useZSTDcompression = turn_on; }
89*3117ece4Schristos 
90*3117ece4Schristos int ZWRAP_isUsingZSTDcompression(void) { return g_ZWRAP_useZSTDcompression; }
91*3117ece4Schristos 
92*3117ece4Schristos 
93*3117ece4Schristos 
94*3117ece4Schristos static ZWRAP_decompress_type g_ZWRAPdecompressionType = ZWRAP_AUTO;
95*3117ece4Schristos 
96*3117ece4Schristos void ZWRAP_setDecompressionType(ZWRAP_decompress_type type) { g_ZWRAPdecompressionType = type; }
97*3117ece4Schristos 
98*3117ece4Schristos ZWRAP_decompress_type ZWRAP_getDecompressionType(void) { return g_ZWRAPdecompressionType; }
99*3117ece4Schristos 
100*3117ece4Schristos 
101*3117ece4Schristos 
102*3117ece4Schristos const char * zstdVersion(void) { return ZSTD_VERSION_STRING; }
103*3117ece4Schristos 
104*3117ece4Schristos ZEXTERN const char * ZEXPORT z_zlibVersion _Z_OF((void)) { return zlibVersion();  }
105*3117ece4Schristos 
106*3117ece4Schristos static void* ZWRAP_allocFunction(void* opaque, size_t size)
107*3117ece4Schristos {
108*3117ece4Schristos     z_streamp strm = (z_streamp) opaque;
109*3117ece4Schristos     void* address = strm->zalloc(strm->opaque, 1, (uInt)size);
110*3117ece4Schristos     /* LOG_WRAPPERC("ZWRAP alloc %p, %d \n", address, (int)size); */
111*3117ece4Schristos     return address;
112*3117ece4Schristos }
113*3117ece4Schristos 
114*3117ece4Schristos static void ZWRAP_freeFunction(void* opaque, void* address)
115*3117ece4Schristos {
116*3117ece4Schristos     z_streamp strm = (z_streamp) opaque;
117*3117ece4Schristos     strm->zfree(strm->opaque, address);
118*3117ece4Schristos    /* if (address) LOG_WRAPPERC("ZWRAP free %p \n", address); */
119*3117ece4Schristos }
120*3117ece4Schristos 
121*3117ece4Schristos static void* ZWRAP_customMalloc(size_t size, ZSTD_customMem customMem)
122*3117ece4Schristos {
123*3117ece4Schristos     if (customMem.customAlloc)
124*3117ece4Schristos         return customMem.customAlloc(customMem.opaque, size);
125*3117ece4Schristos     return malloc(size);
126*3117ece4Schristos }
127*3117ece4Schristos 
128*3117ece4Schristos static void* ZWRAP_customCalloc(size_t size, ZSTD_customMem customMem)
129*3117ece4Schristos {
130*3117ece4Schristos     if (customMem.customAlloc) {
131*3117ece4Schristos         /* calloc implemented as malloc+memset;
132*3117ece4Schristos          * not as efficient as calloc, but next best guess for custom malloc */
133*3117ece4Schristos         void* const ptr = customMem.customAlloc(customMem.opaque, size);
134*3117ece4Schristos         memset(ptr, 0, size);
135*3117ece4Schristos         return ptr;
136*3117ece4Schristos     }
137*3117ece4Schristos     return calloc(1, size);
138*3117ece4Schristos }
139*3117ece4Schristos 
140*3117ece4Schristos static void ZWRAP_customFree(void* ptr, ZSTD_customMem customMem)
141*3117ece4Schristos {
142*3117ece4Schristos     if (ptr!=NULL) {
143*3117ece4Schristos         if (customMem.customFree)
144*3117ece4Schristos             customMem.customFree(customMem.opaque, ptr);
145*3117ece4Schristos         else
146*3117ece4Schristos             free(ptr);
147*3117ece4Schristos     }
148*3117ece4Schristos }
149*3117ece4Schristos 
150*3117ece4Schristos 
151*3117ece4Schristos 
152*3117ece4Schristos /* ===   Compression   === */
153*3117ece4Schristos typedef enum { ZWRAP_useInit, ZWRAP_useReset, ZWRAP_streamEnd } ZWRAP_state_t;
154*3117ece4Schristos 
155*3117ece4Schristos typedef struct {
156*3117ece4Schristos     ZSTD_CStream* zbc;
157*3117ece4Schristos     int compressionLevel;
158*3117ece4Schristos     int streamEnd; /* a flag to signal the end of a stream */
159*3117ece4Schristos     unsigned long long totalInBytes; /* we need it as strm->total_in can be reset by user */
160*3117ece4Schristos     ZSTD_customMem customMem;
161*3117ece4Schristos     z_stream allocFunc; /* copy of zalloc, zfree, opaque */
162*3117ece4Schristos     ZSTD_inBuffer inBuffer;
163*3117ece4Schristos     ZSTD_outBuffer outBuffer;
164*3117ece4Schristos     ZWRAP_state_t comprState;
165*3117ece4Schristos     unsigned long long pledgedSrcSize;
166*3117ece4Schristos } ZWRAP_CCtx;
167*3117ece4Schristos 
168*3117ece4Schristos /* typedef ZWRAP_CCtx internal_state; */
169*3117ece4Schristos 
170*3117ece4Schristos 
171*3117ece4Schristos 
172*3117ece4Schristos static size_t ZWRAP_freeCCtx(ZWRAP_CCtx* zwc)
173*3117ece4Schristos {
174*3117ece4Schristos     if (zwc==NULL) return 0;   /* support free on NULL */
175*3117ece4Schristos     ZSTD_freeCStream(zwc->zbc);
176*3117ece4Schristos     ZWRAP_customFree(zwc, zwc->customMem);
177*3117ece4Schristos     return 0;
178*3117ece4Schristos }
179*3117ece4Schristos 
180*3117ece4Schristos 
181*3117ece4Schristos static ZWRAP_CCtx* ZWRAP_createCCtx(z_streamp strm)
182*3117ece4Schristos {
183*3117ece4Schristos     ZWRAP_CCtx* zwc;
184*3117ece4Schristos     ZSTD_customMem customMem = { NULL, NULL, NULL };
185*3117ece4Schristos 
186*3117ece4Schristos     if (strm->zalloc && strm->zfree) {
187*3117ece4Schristos         customMem.customAlloc = ZWRAP_allocFunction;
188*3117ece4Schristos         customMem.customFree = ZWRAP_freeFunction;
189*3117ece4Schristos     }
190*3117ece4Schristos     customMem.opaque = strm;
191*3117ece4Schristos 
192*3117ece4Schristos     zwc = (ZWRAP_CCtx*)ZWRAP_customCalloc(sizeof(ZWRAP_CCtx), customMem);
193*3117ece4Schristos     if (zwc == NULL) return NULL;
194*3117ece4Schristos     zwc->allocFunc = *strm;
195*3117ece4Schristos     customMem.opaque = &zwc->allocFunc;
196*3117ece4Schristos     zwc->customMem = customMem;
197*3117ece4Schristos 
198*3117ece4Schristos     return zwc;
199*3117ece4Schristos }
200*3117ece4Schristos 
201*3117ece4Schristos 
202*3117ece4Schristos static int ZWRAP_initializeCStream(ZWRAP_CCtx* zwc, const void* dict, size_t dictSize, unsigned long long pledgedSrcSize)
203*3117ece4Schristos {
204*3117ece4Schristos     LOG_WRAPPERC("- ZWRAP_initializeCStream=%p\n", zwc);
205*3117ece4Schristos     if (zwc == NULL || zwc->zbc == NULL) return Z_STREAM_ERROR;
206*3117ece4Schristos 
207*3117ece4Schristos     if (!pledgedSrcSize) pledgedSrcSize = zwc->pledgedSrcSize;
208*3117ece4Schristos     {   unsigned initErr = 0;
209*3117ece4Schristos         ZSTD_parameters const params = ZSTD_getParams(zwc->compressionLevel, pledgedSrcSize, dictSize);
210*3117ece4Schristos         ZSTD_CCtx_params* cctxParams = ZSTD_createCCtxParams();
211*3117ece4Schristos         if (!cctxParams) return Z_STREAM_ERROR;
212*3117ece4Schristos         LOG_WRAPPERC("pledgedSrcSize=%d windowLog=%d chainLog=%d hashLog=%d searchLog=%d minMatch=%d strategy=%d\n",
213*3117ece4Schristos                     (int)pledgedSrcSize, params.cParams.windowLog, params.cParams.chainLog, params.cParams.hashLog, params.cParams.searchLog, params.cParams.minMatch, params.cParams.strategy);
214*3117ece4Schristos 
215*3117ece4Schristos         initErr |= ZSTD_isError(ZSTD_CCtx_reset(zwc->zbc, ZSTD_reset_session_only));
216*3117ece4Schristos         initErr |= ZSTD_isError(ZSTD_CCtxParams_init_advanced(cctxParams, params));
217*3117ece4Schristos         initErr |= ZSTD_isError(ZSTD_CCtx_setParametersUsingCCtxParams(zwc->zbc, cctxParams));
218*3117ece4Schristos         initErr |= ZSTD_isError(ZSTD_CCtx_setPledgedSrcSize(zwc->zbc, pledgedSrcSize));
219*3117ece4Schristos         initErr |= ZSTD_isError(ZSTD_CCtx_loadDictionary(zwc->zbc, dict, dictSize));
220*3117ece4Schristos 
221*3117ece4Schristos         ZSTD_freeCCtxParams(cctxParams);
222*3117ece4Schristos         if (initErr) return Z_STREAM_ERROR;
223*3117ece4Schristos     }
224*3117ece4Schristos 
225*3117ece4Schristos     return Z_OK;
226*3117ece4Schristos }
227*3117ece4Schristos 
228*3117ece4Schristos 
229*3117ece4Schristos static int ZWRAPC_finishWithError(ZWRAP_CCtx* zwc, z_streamp strm, int error)
230*3117ece4Schristos {
231*3117ece4Schristos     LOG_WRAPPERC("- ZWRAPC_finishWithError=%d\n", error);
232*3117ece4Schristos     if (zwc) ZWRAP_freeCCtx(zwc);
233*3117ece4Schristos     if (strm) strm->state = NULL;
234*3117ece4Schristos     return (error) ? error : Z_STREAM_ERROR;
235*3117ece4Schristos }
236*3117ece4Schristos 
237*3117ece4Schristos 
238*3117ece4Schristos static int ZWRAPC_finishWithErrorMsg(z_streamp strm, char* message)
239*3117ece4Schristos {
240*3117ece4Schristos     ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
241*3117ece4Schristos     strm->msg = message;
242*3117ece4Schristos     if (zwc == NULL) return Z_STREAM_ERROR;
243*3117ece4Schristos 
244*3117ece4Schristos     return ZWRAPC_finishWithError(zwc, strm, 0);
245*3117ece4Schristos }
246*3117ece4Schristos 
247*3117ece4Schristos 
248*3117ece4Schristos int ZWRAP_setPledgedSrcSize(z_streamp strm, unsigned long long pledgedSrcSize)
249*3117ece4Schristos {
250*3117ece4Schristos     ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
251*3117ece4Schristos     if (zwc == NULL) return Z_STREAM_ERROR;
252*3117ece4Schristos 
253*3117ece4Schristos     zwc->pledgedSrcSize = pledgedSrcSize;
254*3117ece4Schristos     zwc->comprState = ZWRAP_useInit;
255*3117ece4Schristos     return Z_OK;
256*3117ece4Schristos }
257*3117ece4Schristos 
258*3117ece4Schristos static struct internal_state* convert_into_sis(void* ptr)
259*3117ece4Schristos {
260*3117ece4Schristos     return (struct internal_state*) ptr;
261*3117ece4Schristos }
262*3117ece4Schristos 
263*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateInit_ _Z_OF((z_streamp strm, int level,
264*3117ece4Schristos                                      const char *version, int stream_size))
265*3117ece4Schristos {
266*3117ece4Schristos     ZWRAP_CCtx* zwc;
267*3117ece4Schristos 
268*3117ece4Schristos     LOG_WRAPPERC("- deflateInit level=%d\n", level);
269*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression) {
270*3117ece4Schristos         return deflateInit_((strm), (level), version, stream_size);
271*3117ece4Schristos     }
272*3117ece4Schristos 
273*3117ece4Schristos     zwc = ZWRAP_createCCtx(strm);
274*3117ece4Schristos     if (zwc == NULL) return Z_MEM_ERROR;
275*3117ece4Schristos 
276*3117ece4Schristos     if (level == Z_DEFAULT_COMPRESSION)
277*3117ece4Schristos         level = ZWRAP_DEFAULT_CLEVEL;
278*3117ece4Schristos 
279*3117ece4Schristos     zwc->streamEnd = 0;
280*3117ece4Schristos     zwc->totalInBytes = 0;
281*3117ece4Schristos     zwc->compressionLevel = level;
282*3117ece4Schristos     strm->state = convert_into_sis(zwc); /* use state which in not used by user */
283*3117ece4Schristos     strm->total_in = 0;
284*3117ece4Schristos     strm->total_out = 0;
285*3117ece4Schristos     strm->adler = 0;
286*3117ece4Schristos     return Z_OK;
287*3117ece4Schristos }
288*3117ece4Schristos 
289*3117ece4Schristos 
290*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateInit2_ _Z_OF((z_streamp strm, int level, int method,
291*3117ece4Schristos                                       int windowBits, int memLevel,
292*3117ece4Schristos                                       int strategy, const char *version,
293*3117ece4Schristos                                       int stream_size))
294*3117ece4Schristos {
295*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
296*3117ece4Schristos         return deflateInit2_(strm, level, method, windowBits, memLevel, strategy, version, stream_size);
297*3117ece4Schristos 
298*3117ece4Schristos     return z_deflateInit_ (strm, level, version, stream_size);
299*3117ece4Schristos }
300*3117ece4Schristos 
301*3117ece4Schristos 
302*3117ece4Schristos int ZWRAP_deflateReset_keepDict(z_streamp strm)
303*3117ece4Schristos {
304*3117ece4Schristos     LOG_WRAPPERC("- ZWRAP_deflateReset_keepDict\n");
305*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
306*3117ece4Schristos         return deflateReset(strm);
307*3117ece4Schristos 
308*3117ece4Schristos     { ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
309*3117ece4Schristos       if (zwc) {
310*3117ece4Schristos           zwc->streamEnd = 0;
311*3117ece4Schristos           zwc->totalInBytes = 0;
312*3117ece4Schristos       }
313*3117ece4Schristos     }
314*3117ece4Schristos 
315*3117ece4Schristos     strm->total_in = 0;
316*3117ece4Schristos     strm->total_out = 0;
317*3117ece4Schristos     strm->adler = 0;
318*3117ece4Schristos     return Z_OK;
319*3117ece4Schristos }
320*3117ece4Schristos 
321*3117ece4Schristos 
322*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateReset _Z_OF((z_streamp strm))
323*3117ece4Schristos {
324*3117ece4Schristos     LOG_WRAPPERC("- deflateReset\n");
325*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
326*3117ece4Schristos         return deflateReset(strm);
327*3117ece4Schristos 
328*3117ece4Schristos     ZWRAP_deflateReset_keepDict(strm);
329*3117ece4Schristos 
330*3117ece4Schristos     { ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
331*3117ece4Schristos       if (zwc) zwc->comprState = ZWRAP_useInit;
332*3117ece4Schristos     }
333*3117ece4Schristos     return Z_OK;
334*3117ece4Schristos }
335*3117ece4Schristos 
336*3117ece4Schristos 
337*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateSetDictionary _Z_OF((z_streamp strm,
338*3117ece4Schristos                                              const Bytef *dictionary,
339*3117ece4Schristos                                              uInt  dictLength))
340*3117ece4Schristos {
341*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression) {
342*3117ece4Schristos         LOG_WRAPPERC("- deflateSetDictionary\n");
343*3117ece4Schristos         return deflateSetDictionary(strm, dictionary, dictLength);
344*3117ece4Schristos     }
345*3117ece4Schristos 
346*3117ece4Schristos     {   ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
347*3117ece4Schristos         LOG_WRAPPERC("- deflateSetDictionary level=%d\n", (int)zwc->compressionLevel);
348*3117ece4Schristos         if (!zwc) return Z_STREAM_ERROR;
349*3117ece4Schristos         if (zwc->zbc == NULL) {
350*3117ece4Schristos             zwc->zbc = ZSTD_createCStream_advanced(zwc->customMem);
351*3117ece4Schristos             if (zwc->zbc == NULL) return ZWRAPC_finishWithError(zwc, strm, 0);
352*3117ece4Schristos         }
353*3117ece4Schristos         { int res = ZWRAP_initializeCStream(zwc, dictionary, dictLength, ZSTD_CONTENTSIZE_UNKNOWN);
354*3117ece4Schristos           if (res != Z_OK) return ZWRAPC_finishWithError(zwc, strm, res); }
355*3117ece4Schristos         zwc->comprState = ZWRAP_useReset;
356*3117ece4Schristos     }
357*3117ece4Schristos 
358*3117ece4Schristos     return Z_OK;
359*3117ece4Schristos }
360*3117ece4Schristos 
361*3117ece4Schristos 
362*3117ece4Schristos ZEXTERN int ZEXPORT z_deflate _Z_OF((z_streamp strm, int flush))
363*3117ece4Schristos {
364*3117ece4Schristos     ZWRAP_CCtx* zwc;
365*3117ece4Schristos 
366*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression) {
367*3117ece4Schristos         LOG_WRAPPERC("- deflate1 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d\n",
368*3117ece4Schristos                     (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
369*3117ece4Schristos         return deflate(strm, flush);
370*3117ece4Schristos     }
371*3117ece4Schristos 
372*3117ece4Schristos     zwc = (ZWRAP_CCtx*) strm->state;
373*3117ece4Schristos     if (zwc == NULL) { LOG_WRAPPERC("zwc == NULL\n"); return Z_STREAM_ERROR; }
374*3117ece4Schristos 
375*3117ece4Schristos     if (zwc->zbc == NULL) {
376*3117ece4Schristos         zwc->zbc = ZSTD_createCStream_advanced(zwc->customMem);
377*3117ece4Schristos         if (zwc->zbc == NULL) return ZWRAPC_finishWithError(zwc, strm, 0);
378*3117ece4Schristos         { int const initErr = ZWRAP_initializeCStream(zwc, NULL, 0, (flush == Z_FINISH) ? strm->avail_in : ZSTD_CONTENTSIZE_UNKNOWN);
379*3117ece4Schristos           if (initErr != Z_OK) return ZWRAPC_finishWithError(zwc, strm, initErr); }
380*3117ece4Schristos         if (flush != Z_FINISH) zwc->comprState = ZWRAP_useReset;
381*3117ece4Schristos     } else {
382*3117ece4Schristos         if (zwc->totalInBytes == 0) {
383*3117ece4Schristos             if (zwc->comprState == ZWRAP_useReset) {
384*3117ece4Schristos                 size_t resetErr = ZSTD_CCtx_reset(zwc->zbc, ZSTD_reset_session_only);
385*3117ece4Schristos                 if (ZSTD_isError(resetErr)) {
386*3117ece4Schristos                     LOG_WRAPPERC("ERROR: ZSTD_CCtx_reset errorCode=%s\n",
387*3117ece4Schristos                                 ZSTD_getErrorName(resetErr));
388*3117ece4Schristos                     return ZWRAPC_finishWithError(zwc, strm, 0);
389*3117ece4Schristos                 }
390*3117ece4Schristos                 resetErr = ZSTD_CCtx_setPledgedSrcSize(zwc->zbc, (flush == Z_FINISH) ? strm->avail_in : zwc->pledgedSrcSize);
391*3117ece4Schristos                 if (ZSTD_isError(resetErr)) {
392*3117ece4Schristos                     LOG_WRAPPERC("ERROR: ZSTD_CCtx_setPledgedSrcSize errorCode=%s\n",
393*3117ece4Schristos                                 ZSTD_getErrorName(resetErr));
394*3117ece4Schristos                     return ZWRAPC_finishWithError(zwc, strm, 0);
395*3117ece4Schristos                 }
396*3117ece4Schristos             } else {
397*3117ece4Schristos                 int const res = ZWRAP_initializeCStream(zwc, NULL, 0, (flush == Z_FINISH) ? strm->avail_in : ZSTD_CONTENTSIZE_UNKNOWN);
398*3117ece4Schristos                 if (res != Z_OK) return ZWRAPC_finishWithError(zwc, strm, res);
399*3117ece4Schristos                 if (flush != Z_FINISH) zwc->comprState = ZWRAP_useReset;
400*3117ece4Schristos             }
401*3117ece4Schristos         }  /* (zwc->totalInBytes == 0) */
402*3117ece4Schristos     }  /* ! (zwc->zbc == NULL) */
403*3117ece4Schristos 
404*3117ece4Schristos     LOG_WRAPPERC("- deflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d\n", (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
405*3117ece4Schristos     if (strm->avail_in > 0) {
406*3117ece4Schristos         zwc->inBuffer.src = strm->next_in;
407*3117ece4Schristos         zwc->inBuffer.size = strm->avail_in;
408*3117ece4Schristos         zwc->inBuffer.pos = 0;
409*3117ece4Schristos         zwc->outBuffer.dst = strm->next_out;
410*3117ece4Schristos         zwc->outBuffer.size = strm->avail_out;
411*3117ece4Schristos         zwc->outBuffer.pos = 0;
412*3117ece4Schristos         { size_t const cErr = ZSTD_compressStream(zwc->zbc, &zwc->outBuffer, &zwc->inBuffer);
413*3117ece4Schristos           LOG_WRAPPERC("deflate ZSTD_compressStream srcSize=%d dstCapacity=%d\n", (int)zwc->inBuffer.size, (int)zwc->outBuffer.size);
414*3117ece4Schristos           if (ZSTD_isError(cErr)) return ZWRAPC_finishWithError(zwc, strm, 0);
415*3117ece4Schristos         }
416*3117ece4Schristos         strm->next_out += zwc->outBuffer.pos;
417*3117ece4Schristos         strm->total_out += zwc->outBuffer.pos;
418*3117ece4Schristos         strm->avail_out -= zwc->outBuffer.pos;
419*3117ece4Schristos         strm->total_in += zwc->inBuffer.pos;
420*3117ece4Schristos         zwc->totalInBytes += zwc->inBuffer.pos;
421*3117ece4Schristos         strm->next_in += zwc->inBuffer.pos;
422*3117ece4Schristos         strm->avail_in -= zwc->inBuffer.pos;
423*3117ece4Schristos     }
424*3117ece4Schristos 
425*3117ece4Schristos     if (flush == Z_FULL_FLUSH
426*3117ece4Schristos #if ZLIB_VERNUM >= 0x1240
427*3117ece4Schristos         || flush == Z_TREES
428*3117ece4Schristos #endif
429*3117ece4Schristos         || flush == Z_BLOCK)
430*3117ece4Schristos         return ZWRAPC_finishWithErrorMsg(strm, "Z_FULL_FLUSH, Z_BLOCK and Z_TREES are not supported!");
431*3117ece4Schristos 
432*3117ece4Schristos     if (flush == Z_FINISH) {
433*3117ece4Schristos         size_t bytesLeft;
434*3117ece4Schristos         if (zwc->streamEnd) return Z_STREAM_END;
435*3117ece4Schristos         zwc->outBuffer.dst = strm->next_out;
436*3117ece4Schristos         zwc->outBuffer.size = strm->avail_out;
437*3117ece4Schristos         zwc->outBuffer.pos = 0;
438*3117ece4Schristos         bytesLeft = ZSTD_endStream(zwc->zbc, &zwc->outBuffer);
439*3117ece4Schristos         LOG_WRAPPERC("deflate ZSTD_endStream dstCapacity=%d bytesLeft=%d\n", (int)strm->avail_out, (int)bytesLeft);
440*3117ece4Schristos         if (ZSTD_isError(bytesLeft)) return ZWRAPC_finishWithError(zwc, strm, 0);
441*3117ece4Schristos         strm->next_out += zwc->outBuffer.pos;
442*3117ece4Schristos         strm->total_out += zwc->outBuffer.pos;
443*3117ece4Schristos         strm->avail_out -= zwc->outBuffer.pos;
444*3117ece4Schristos         if (bytesLeft == 0) {
445*3117ece4Schristos             zwc->streamEnd = 1;
446*3117ece4Schristos             LOG_WRAPPERC("Z_STREAM_END2 strm->total_in=%d strm->avail_out=%d strm->total_out=%d\n",
447*3117ece4Schristos                         (int)strm->total_in, (int)strm->avail_out, (int)strm->total_out);
448*3117ece4Schristos             return Z_STREAM_END;
449*3117ece4Schristos     }   }
450*3117ece4Schristos     else
451*3117ece4Schristos     if (flush == Z_SYNC_FLUSH || flush == Z_PARTIAL_FLUSH) {
452*3117ece4Schristos         size_t bytesLeft;
453*3117ece4Schristos         zwc->outBuffer.dst = strm->next_out;
454*3117ece4Schristos         zwc->outBuffer.size = strm->avail_out;
455*3117ece4Schristos         zwc->outBuffer.pos = 0;
456*3117ece4Schristos         bytesLeft = ZSTD_flushStream(zwc->zbc, &zwc->outBuffer);
457*3117ece4Schristos         LOG_WRAPPERC("deflate ZSTD_flushStream dstCapacity=%d bytesLeft=%d\n", (int)strm->avail_out, (int)bytesLeft);
458*3117ece4Schristos         if (ZSTD_isError(bytesLeft)) return ZWRAPC_finishWithError(zwc, strm, 0);
459*3117ece4Schristos         strm->next_out += zwc->outBuffer.pos;
460*3117ece4Schristos         strm->total_out += zwc->outBuffer.pos;
461*3117ece4Schristos         strm->avail_out -= zwc->outBuffer.pos;
462*3117ece4Schristos     }
463*3117ece4Schristos     LOG_WRAPPERC("- deflate3 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d\n", (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
464*3117ece4Schristos     return Z_OK;
465*3117ece4Schristos }
466*3117ece4Schristos 
467*3117ece4Schristos 
468*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateEnd _Z_OF((z_streamp strm))
469*3117ece4Schristos {
470*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression) {
471*3117ece4Schristos         LOG_WRAPPERC("- deflateEnd\n");
472*3117ece4Schristos         return deflateEnd(strm);
473*3117ece4Schristos     }
474*3117ece4Schristos     LOG_WRAPPERC("- deflateEnd total_in=%d total_out=%d\n", (int)(strm->total_in), (int)(strm->total_out));
475*3117ece4Schristos     {   size_t errorCode;
476*3117ece4Schristos         ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
477*3117ece4Schristos         if (zwc == NULL) return Z_OK;  /* structures are already freed */
478*3117ece4Schristos         strm->state = NULL;
479*3117ece4Schristos         errorCode = ZWRAP_freeCCtx(zwc);
480*3117ece4Schristos         if (ZSTD_isError(errorCode)) return Z_STREAM_ERROR;
481*3117ece4Schristos     }
482*3117ece4Schristos     return Z_OK;
483*3117ece4Schristos }
484*3117ece4Schristos 
485*3117ece4Schristos 
486*3117ece4Schristos ZEXTERN uLong ZEXPORT z_deflateBound _Z_OF((z_streamp strm,
487*3117ece4Schristos                                        uLong sourceLen))
488*3117ece4Schristos {
489*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
490*3117ece4Schristos         return deflateBound(strm, sourceLen);
491*3117ece4Schristos 
492*3117ece4Schristos     return ZSTD_compressBound(sourceLen);
493*3117ece4Schristos }
494*3117ece4Schristos 
495*3117ece4Schristos 
496*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateParams _Z_OF((z_streamp strm,
497*3117ece4Schristos                                       int level,
498*3117ece4Schristos                                       int strategy))
499*3117ece4Schristos {
500*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression) {
501*3117ece4Schristos         LOG_WRAPPERC("- deflateParams level=%d strategy=%d\n", level, strategy);
502*3117ece4Schristos         return deflateParams(strm, level, strategy);
503*3117ece4Schristos     }
504*3117ece4Schristos 
505*3117ece4Schristos     return Z_OK;
506*3117ece4Schristos }
507*3117ece4Schristos 
508*3117ece4Schristos 
509*3117ece4Schristos 
510*3117ece4Schristos 
511*3117ece4Schristos 
512*3117ece4Schristos /* ===   Decompression   === */
513*3117ece4Schristos 
514*3117ece4Schristos typedef enum { ZWRAP_ZLIB_STREAM, ZWRAP_ZSTD_STREAM, ZWRAP_UNKNOWN_STREAM } ZWRAP_stream_type;
515*3117ece4Schristos 
516*3117ece4Schristos typedef struct {
517*3117ece4Schristos     ZSTD_DStream* zbd;
518*3117ece4Schristos     char headerBuf[16];   /* must be >= ZSTD_frameHeaderSize_min */
519*3117ece4Schristos     int errorCount;
520*3117ece4Schristos     unsigned long long totalInBytes; /* we need it as strm->total_in can be reset by user */
521*3117ece4Schristos     ZWRAP_state_t decompState;
522*3117ece4Schristos     ZSTD_inBuffer inBuffer;
523*3117ece4Schristos     ZSTD_outBuffer outBuffer;
524*3117ece4Schristos 
525*3117ece4Schristos     /* zlib params */
526*3117ece4Schristos     int stream_size;
527*3117ece4Schristos     char *version;
528*3117ece4Schristos     int windowBits;
529*3117ece4Schristos     ZSTD_customMem customMem;
530*3117ece4Schristos     z_stream allocFunc; /* just to copy zalloc, zfree, opaque */
531*3117ece4Schristos } ZWRAP_DCtx;
532*3117ece4Schristos 
533*3117ece4Schristos 
534*3117ece4Schristos static void ZWRAP_initDCtx(ZWRAP_DCtx* zwd)
535*3117ece4Schristos {
536*3117ece4Schristos     zwd->errorCount = 0;
537*3117ece4Schristos     zwd->outBuffer.pos = 0;
538*3117ece4Schristos     zwd->outBuffer.size = 0;
539*3117ece4Schristos }
540*3117ece4Schristos 
541*3117ece4Schristos static ZWRAP_DCtx* ZWRAP_createDCtx(z_streamp strm)
542*3117ece4Schristos {
543*3117ece4Schristos     ZWRAP_DCtx* zwd;
544*3117ece4Schristos     ZSTD_customMem customMem = { NULL, NULL, NULL };
545*3117ece4Schristos 
546*3117ece4Schristos     if (strm->zalloc && strm->zfree) {
547*3117ece4Schristos         customMem.customAlloc = ZWRAP_allocFunction;
548*3117ece4Schristos         customMem.customFree = ZWRAP_freeFunction;
549*3117ece4Schristos     }
550*3117ece4Schristos     customMem.opaque = strm;
551*3117ece4Schristos 
552*3117ece4Schristos     zwd = (ZWRAP_DCtx*)ZWRAP_customCalloc(sizeof(ZWRAP_DCtx), customMem);
553*3117ece4Schristos     if (zwd == NULL) return NULL;
554*3117ece4Schristos     zwd->allocFunc = *strm;
555*3117ece4Schristos     customMem.opaque = &zwd->allocFunc;
556*3117ece4Schristos     zwd->customMem = customMem;
557*3117ece4Schristos 
558*3117ece4Schristos     ZWRAP_initDCtx(zwd);
559*3117ece4Schristos     return zwd;
560*3117ece4Schristos }
561*3117ece4Schristos 
562*3117ece4Schristos static size_t ZWRAP_freeDCtx(ZWRAP_DCtx* zwd)
563*3117ece4Schristos {
564*3117ece4Schristos     if (zwd==NULL) return 0;   /* support free on null */
565*3117ece4Schristos     ZSTD_freeDStream(zwd->zbd);
566*3117ece4Schristos     ZWRAP_customFree(zwd->version, zwd->customMem);
567*3117ece4Schristos     ZWRAP_customFree(zwd, zwd->customMem);
568*3117ece4Schristos     return 0;
569*3117ece4Schristos }
570*3117ece4Schristos 
571*3117ece4Schristos 
572*3117ece4Schristos int ZWRAP_isUsingZSTDdecompression(z_streamp strm)
573*3117ece4Schristos {
574*3117ece4Schristos     if (strm == NULL) return 0;
575*3117ece4Schristos     return (strm->reserved == ZWRAP_ZSTD_STREAM);
576*3117ece4Schristos }
577*3117ece4Schristos 
578*3117ece4Schristos 
579*3117ece4Schristos static int ZWRAPD_finishWithError(ZWRAP_DCtx* zwd, z_streamp strm, int error)
580*3117ece4Schristos {
581*3117ece4Schristos     LOG_WRAPPERD("- ZWRAPD_finishWithError=%d\n", error);
582*3117ece4Schristos     ZWRAP_freeDCtx(zwd);
583*3117ece4Schristos     strm->state = NULL;
584*3117ece4Schristos     return (error) ? error : Z_STREAM_ERROR;
585*3117ece4Schristos }
586*3117ece4Schristos 
587*3117ece4Schristos static int ZWRAPD_finishWithErrorMsg(z_streamp strm, char* message)
588*3117ece4Schristos {
589*3117ece4Schristos     ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state;
590*3117ece4Schristos     strm->msg = message;
591*3117ece4Schristos     if (zwd == NULL) return Z_STREAM_ERROR;
592*3117ece4Schristos 
593*3117ece4Schristos     return ZWRAPD_finishWithError(zwd, strm, 0);
594*3117ece4Schristos }
595*3117ece4Schristos 
596*3117ece4Schristos 
597*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateInit_ _Z_OF((z_streamp strm,
598*3117ece4Schristos                                      const char* version, int stream_size))
599*3117ece4Schristos {
600*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) {
601*3117ece4Schristos         strm->reserved = ZWRAP_ZLIB_STREAM;
602*3117ece4Schristos         return inflateInit(strm);
603*3117ece4Schristos     }
604*3117ece4Schristos 
605*3117ece4Schristos     {   ZWRAP_DCtx* const zwd = ZWRAP_createDCtx(strm);
606*3117ece4Schristos         LOG_WRAPPERD("- inflateInit\n");
607*3117ece4Schristos         if (zwd == NULL) return ZWRAPD_finishWithError(zwd, strm, 0);
608*3117ece4Schristos 
609*3117ece4Schristos         zwd->version = (char*)ZWRAP_customMalloc(strlen(version)+1, zwd->customMem);
610*3117ece4Schristos         if (zwd->version == NULL) return ZWRAPD_finishWithError(zwd, strm, 0);
611*3117ece4Schristos         strcpy(zwd->version, version);
612*3117ece4Schristos 
613*3117ece4Schristos         zwd->stream_size = stream_size;
614*3117ece4Schristos         zwd->totalInBytes = 0;
615*3117ece4Schristos         strm->state = convert_into_sis(zwd);
616*3117ece4Schristos         strm->total_in = 0;
617*3117ece4Schristos         strm->total_out = 0;
618*3117ece4Schristos         strm->reserved = ZWRAP_UNKNOWN_STREAM;
619*3117ece4Schristos         strm->adler = 0;
620*3117ece4Schristos     }
621*3117ece4Schristos 
622*3117ece4Schristos     return Z_OK;
623*3117ece4Schristos }
624*3117ece4Schristos 
625*3117ece4Schristos 
626*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateInit2_ _Z_OF((z_streamp strm, int  windowBits,
627*3117ece4Schristos                                       const char *version, int stream_size))
628*3117ece4Schristos {
629*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB) {
630*3117ece4Schristos         return inflateInit2_(strm, windowBits, version, stream_size);
631*3117ece4Schristos     }
632*3117ece4Schristos 
633*3117ece4Schristos     {   int const ret = z_inflateInit_ (strm, version, stream_size);
634*3117ece4Schristos         LOG_WRAPPERD("- inflateInit2 windowBits=%d\n", windowBits);
635*3117ece4Schristos         if (ret == Z_OK) {
636*3117ece4Schristos             ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*)strm->state;
637*3117ece4Schristos             if (zwd == NULL) return Z_STREAM_ERROR;
638*3117ece4Schristos             zwd->windowBits = windowBits;
639*3117ece4Schristos         }
640*3117ece4Schristos         return ret;
641*3117ece4Schristos     }
642*3117ece4Schristos }
643*3117ece4Schristos 
644*3117ece4Schristos int ZWRAP_inflateReset_keepDict(z_streamp strm)
645*3117ece4Schristos {
646*3117ece4Schristos     LOG_WRAPPERD("- ZWRAP_inflateReset_keepDict\n");
647*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
648*3117ece4Schristos         return inflateReset(strm);
649*3117ece4Schristos 
650*3117ece4Schristos     {   ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state;
651*3117ece4Schristos         if (zwd == NULL) return Z_STREAM_ERROR;
652*3117ece4Schristos         ZWRAP_initDCtx(zwd);
653*3117ece4Schristos         zwd->decompState = ZWRAP_useReset;
654*3117ece4Schristos         zwd->totalInBytes = 0;
655*3117ece4Schristos     }
656*3117ece4Schristos 
657*3117ece4Schristos     strm->total_in = 0;
658*3117ece4Schristos     strm->total_out = 0;
659*3117ece4Schristos     return Z_OK;
660*3117ece4Schristos }
661*3117ece4Schristos 
662*3117ece4Schristos 
663*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateReset _Z_OF((z_streamp strm))
664*3117ece4Schristos {
665*3117ece4Schristos     LOG_WRAPPERD("- inflateReset\n");
666*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
667*3117ece4Schristos         return inflateReset(strm);
668*3117ece4Schristos 
669*3117ece4Schristos     { int const ret = ZWRAP_inflateReset_keepDict(strm);
670*3117ece4Schristos       if (ret != Z_OK) return ret; }
671*3117ece4Schristos 
672*3117ece4Schristos     { ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state;
673*3117ece4Schristos       if (zwd == NULL) return Z_STREAM_ERROR;
674*3117ece4Schristos       zwd->decompState = ZWRAP_useInit; }
675*3117ece4Schristos 
676*3117ece4Schristos     return Z_OK;
677*3117ece4Schristos }
678*3117ece4Schristos 
679*3117ece4Schristos 
680*3117ece4Schristos #if ZLIB_VERNUM >= 0x1240
681*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateReset2 _Z_OF((z_streamp strm,
682*3117ece4Schristos                                       int windowBits))
683*3117ece4Schristos {
684*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
685*3117ece4Schristos         return inflateReset2(strm, windowBits);
686*3117ece4Schristos 
687*3117ece4Schristos     {   int const ret = z_inflateReset (strm);
688*3117ece4Schristos         if (ret == Z_OK) {
689*3117ece4Schristos             ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*)strm->state;
690*3117ece4Schristos             if (zwd == NULL) return Z_STREAM_ERROR;
691*3117ece4Schristos             zwd->windowBits = windowBits;
692*3117ece4Schristos         }
693*3117ece4Schristos         return ret;
694*3117ece4Schristos     }
695*3117ece4Schristos }
696*3117ece4Schristos #endif
697*3117ece4Schristos 
698*3117ece4Schristos 
699*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateSetDictionary _Z_OF((z_streamp strm,
700*3117ece4Schristos                                              const Bytef *dictionary,
701*3117ece4Schristos                                              uInt  dictLength))
702*3117ece4Schristos {
703*3117ece4Schristos     LOG_WRAPPERD("- inflateSetDictionary\n");
704*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
705*3117ece4Schristos         return inflateSetDictionary(strm, dictionary, dictLength);
706*3117ece4Schristos 
707*3117ece4Schristos     {   ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state;
708*3117ece4Schristos         if (zwd == NULL || zwd->zbd == NULL) return Z_STREAM_ERROR;
709*3117ece4Schristos         { size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only);
710*3117ece4Schristos           if (ZSTD_isError(resetErr)) return ZWRAPD_finishWithError(zwd, strm, 0); }
711*3117ece4Schristos         { size_t const loadErr = ZSTD_DCtx_loadDictionary(zwd->zbd, dictionary, dictLength);
712*3117ece4Schristos           if (ZSTD_isError(loadErr)) return ZWRAPD_finishWithError(zwd, strm, 0); }
713*3117ece4Schristos         zwd->decompState = ZWRAP_useReset;
714*3117ece4Schristos 
715*3117ece4Schristos         if (zwd->totalInBytes == ZSTD_HEADERSIZE) {
716*3117ece4Schristos             zwd->inBuffer.src = zwd->headerBuf;
717*3117ece4Schristos             zwd->inBuffer.size = zwd->totalInBytes;
718*3117ece4Schristos             zwd->inBuffer.pos = 0;
719*3117ece4Schristos             zwd->outBuffer.dst = strm->next_out;
720*3117ece4Schristos             zwd->outBuffer.size = 0;
721*3117ece4Schristos             zwd->outBuffer.pos = 0;
722*3117ece4Schristos             {   size_t const errorCode = ZSTD_decompressStream(zwd->zbd, &zwd->outBuffer, &zwd->inBuffer);
723*3117ece4Schristos                 LOG_WRAPPERD("inflateSetDictionary ZSTD_decompressStream errorCode=%d srcSize=%d dstCapacity=%d\n",
724*3117ece4Schristos                              (int)errorCode, (int)zwd->inBuffer.size, (int)zwd->outBuffer.size);
725*3117ece4Schristos                 if (zwd->inBuffer.pos < zwd->outBuffer.size || ZSTD_isError(errorCode)) {
726*3117ece4Schristos                     LOG_WRAPPERD("ERROR: ZSTD_decompressStream %s\n",
727*3117ece4Schristos                                  ZSTD_getErrorName(errorCode));
728*3117ece4Schristos                     return ZWRAPD_finishWithError(zwd, strm, 0);
729*3117ece4Schristos     }   }   }   }
730*3117ece4Schristos 
731*3117ece4Schristos     return Z_OK;
732*3117ece4Schristos }
733*3117ece4Schristos 
734*3117ece4Schristos 
735*3117ece4Schristos ZEXTERN int ZEXPORT z_inflate _Z_OF((z_streamp strm, int flush))
736*3117ece4Schristos {
737*3117ece4Schristos     ZWRAP_DCtx* zwd;
738*3117ece4Schristos 
739*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) {
740*3117ece4Schristos         int const result = inflate(strm, flush);
741*3117ece4Schristos         LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
742*3117ece4Schristos                      (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, result);
743*3117ece4Schristos         return result;
744*3117ece4Schristos     }
745*3117ece4Schristos 
746*3117ece4Schristos     if (strm->avail_in <= 0) return Z_OK;
747*3117ece4Schristos 
748*3117ece4Schristos     zwd = (ZWRAP_DCtx*) strm->state;
749*3117ece4Schristos     LOG_WRAPPERD("- inflate1 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d\n",
750*3117ece4Schristos                  (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
751*3117ece4Schristos 
752*3117ece4Schristos     if (zwd == NULL) return Z_STREAM_ERROR;
753*3117ece4Schristos     if (zwd->decompState == ZWRAP_streamEnd) return Z_STREAM_END;
754*3117ece4Schristos 
755*3117ece4Schristos     if (zwd->totalInBytes < ZLIB_HEADERSIZE) {
756*3117ece4Schristos         if (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) {
757*3117ece4Schristos             if (ZWRAP_readLE32(strm->next_in) != ZSTD_MAGICNUMBER) {
758*3117ece4Schristos                 {   int const initErr = (zwd->windowBits) ?
759*3117ece4Schristos                                 inflateInit2_(strm, zwd->windowBits, zwd->version, zwd->stream_size) :
760*3117ece4Schristos                                 inflateInit_(strm, zwd->version, zwd->stream_size);
761*3117ece4Schristos                     LOG_WRAPPERD("ZLIB inflateInit errorCode=%d\n", initErr);
762*3117ece4Schristos                     if (initErr != Z_OK) return ZWRAPD_finishWithError(zwd, strm, initErr);
763*3117ece4Schristos                 }
764*3117ece4Schristos 
765*3117ece4Schristos                 strm->reserved = ZWRAP_ZLIB_STREAM;
766*3117ece4Schristos                 { size_t const freeErr = ZWRAP_freeDCtx(zwd);
767*3117ece4Schristos                   if (ZSTD_isError(freeErr)) goto error; }
768*3117ece4Schristos 
769*3117ece4Schristos                 {   int const result = (flush == Z_INFLATE_SYNC) ?
770*3117ece4Schristos                                         inflateSync(strm) :
771*3117ece4Schristos                                         inflate(strm, flush);
772*3117ece4Schristos                     LOG_WRAPPERD("- inflate3 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
773*3117ece4Schristos                                  (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, res);
774*3117ece4Schristos                     return result;
775*3117ece4Schristos             }   }
776*3117ece4Schristos         } else {  /* ! (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) */
777*3117ece4Schristos             size_t const srcSize = MIN(strm->avail_in, ZLIB_HEADERSIZE - zwd->totalInBytes);
778*3117ece4Schristos             memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
779*3117ece4Schristos             strm->total_in += srcSize;
780*3117ece4Schristos             zwd->totalInBytes += srcSize;
781*3117ece4Schristos             strm->next_in += srcSize;
782*3117ece4Schristos             strm->avail_in -= srcSize;
783*3117ece4Schristos             if (zwd->totalInBytes < ZLIB_HEADERSIZE) return Z_OK;
784*3117ece4Schristos 
785*3117ece4Schristos             if (ZWRAP_readLE32(zwd->headerBuf) != ZSTD_MAGICNUMBER) {
786*3117ece4Schristos                 z_stream strm2;
787*3117ece4Schristos                 strm2.next_in = strm->next_in;
788*3117ece4Schristos                 strm2.avail_in = strm->avail_in;
789*3117ece4Schristos                 strm2.next_out = strm->next_out;
790*3117ece4Schristos                 strm2.avail_out = strm->avail_out;
791*3117ece4Schristos 
792*3117ece4Schristos                 {   int const initErr = (zwd->windowBits) ?
793*3117ece4Schristos                                 inflateInit2_(strm, zwd->windowBits, zwd->version, zwd->stream_size) :
794*3117ece4Schristos                                 inflateInit_(strm, zwd->version, zwd->stream_size);
795*3117ece4Schristos                     LOG_WRAPPERD("ZLIB inflateInit errorCode=%d\n", initErr);
796*3117ece4Schristos                     if (initErr != Z_OK) return ZWRAPD_finishWithError(zwd, strm, initErr);
797*3117ece4Schristos                 }
798*3117ece4Schristos 
799*3117ece4Schristos                 /* inflate header */
800*3117ece4Schristos                 strm->next_in = (unsigned char*)zwd->headerBuf;
801*3117ece4Schristos                 strm->avail_in = ZLIB_HEADERSIZE;
802*3117ece4Schristos                 strm->avail_out = 0;
803*3117ece4Schristos                 {   int const dErr = inflate(strm, Z_NO_FLUSH);
804*3117ece4Schristos                     LOG_WRAPPERD("ZLIB inflate errorCode=%d strm->avail_in=%d\n",
805*3117ece4Schristos                                   dErr, (int)strm->avail_in);
806*3117ece4Schristos                     if (dErr != Z_OK)
807*3117ece4Schristos                         return ZWRAPD_finishWithError(zwd, strm, dErr);
808*3117ece4Schristos                 }
809*3117ece4Schristos                 if (strm->avail_in > 0) goto error;
810*3117ece4Schristos 
811*3117ece4Schristos                 strm->next_in = strm2.next_in;
812*3117ece4Schristos                 strm->avail_in = strm2.avail_in;
813*3117ece4Schristos                 strm->next_out = strm2.next_out;
814*3117ece4Schristos                 strm->avail_out = strm2.avail_out;
815*3117ece4Schristos 
816*3117ece4Schristos                 strm->reserved = ZWRAP_ZLIB_STREAM; /* mark as zlib stream */
817*3117ece4Schristos                 { size_t const freeErr = ZWRAP_freeDCtx(zwd);
818*3117ece4Schristos                   if (ZSTD_isError(freeErr)) goto error; }
819*3117ece4Schristos 
820*3117ece4Schristos                 {   int const result = (flush == Z_INFLATE_SYNC) ?
821*3117ece4Schristos                                        inflateSync(strm) :
822*3117ece4Schristos                                        inflate(strm, flush);
823*3117ece4Schristos                     LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
824*3117ece4Schristos                                  (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, res);
825*3117ece4Schristos                     return result;
826*3117ece4Schristos         }   }   }  /* if ! (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) */
827*3117ece4Schristos     }  /* (zwd->totalInBytes < ZLIB_HEADERSIZE) */
828*3117ece4Schristos 
829*3117ece4Schristos     strm->reserved = ZWRAP_ZSTD_STREAM; /* mark as zstd steam */
830*3117ece4Schristos 
831*3117ece4Schristos     if (flush == Z_INFLATE_SYNC) { strm->msg = "inflateSync is not supported!"; goto error; }
832*3117ece4Schristos 
833*3117ece4Schristos     if (!zwd->zbd) {
834*3117ece4Schristos         zwd->zbd = ZSTD_createDStream_advanced(zwd->customMem);
835*3117ece4Schristos         if (zwd->zbd == NULL) { LOG_WRAPPERD("ERROR: ZSTD_createDStream_advanced\n"); goto error; }
836*3117ece4Schristos         zwd->decompState = ZWRAP_useInit;
837*3117ece4Schristos     }
838*3117ece4Schristos 
839*3117ece4Schristos     if (zwd->totalInBytes < ZSTD_HEADERSIZE) {
840*3117ece4Schristos         if (zwd->totalInBytes == 0 && strm->avail_in >= ZSTD_HEADERSIZE) {
841*3117ece4Schristos             if (zwd->decompState == ZWRAP_useInit) {
842*3117ece4Schristos                 size_t const initErr = ZSTD_initDStream(zwd->zbd);
843*3117ece4Schristos                 if (ZSTD_isError(initErr)) {
844*3117ece4Schristos                     LOG_WRAPPERD("ERROR: ZSTD_initDStream errorCode=%s\n",
845*3117ece4Schristos                                  ZSTD_getErrorName(initErr));
846*3117ece4Schristos                     goto error;
847*3117ece4Schristos                 }
848*3117ece4Schristos             } else {
849*3117ece4Schristos                 size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only);
850*3117ece4Schristos                 if (ZSTD_isError(resetErr)) goto error;
851*3117ece4Schristos             }
852*3117ece4Schristos         } else {
853*3117ece4Schristos             size_t const srcSize = MIN(strm->avail_in, ZSTD_HEADERSIZE - zwd->totalInBytes);
854*3117ece4Schristos             memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
855*3117ece4Schristos             strm->total_in += srcSize;
856*3117ece4Schristos             zwd->totalInBytes += srcSize;
857*3117ece4Schristos             strm->next_in += srcSize;
858*3117ece4Schristos             strm->avail_in -= srcSize;
859*3117ece4Schristos             if (zwd->totalInBytes < ZSTD_HEADERSIZE) return Z_OK;
860*3117ece4Schristos 
861*3117ece4Schristos             if (zwd->decompState == ZWRAP_useInit) {
862*3117ece4Schristos                 size_t const initErr = ZSTD_initDStream(zwd->zbd);
863*3117ece4Schristos                 if (ZSTD_isError(initErr)) {
864*3117ece4Schristos                     LOG_WRAPPERD("ERROR: ZSTD_initDStream errorCode=%s\n",
865*3117ece4Schristos                                 ZSTD_getErrorName(initErr));
866*3117ece4Schristos                     goto error;
867*3117ece4Schristos                 }
868*3117ece4Schristos             } else {
869*3117ece4Schristos                 size_t const resetErr = ZSTD_DCtx_reset(zwd->zbd, ZSTD_reset_session_only);
870*3117ece4Schristos                 if (ZSTD_isError(resetErr)) goto error;
871*3117ece4Schristos             }
872*3117ece4Schristos 
873*3117ece4Schristos             zwd->inBuffer.src = zwd->headerBuf;
874*3117ece4Schristos             zwd->inBuffer.size = ZSTD_HEADERSIZE;
875*3117ece4Schristos             zwd->inBuffer.pos = 0;
876*3117ece4Schristos             zwd->outBuffer.dst = strm->next_out;
877*3117ece4Schristos             zwd->outBuffer.size = 0;
878*3117ece4Schristos             zwd->outBuffer.pos = 0;
879*3117ece4Schristos             {   size_t const dErr = ZSTD_decompressStream(zwd->zbd, &zwd->outBuffer, &zwd->inBuffer);
880*3117ece4Schristos                 LOG_WRAPPERD("inflate ZSTD_decompressStream1 errorCode=%d srcSize=%d dstCapacity=%d\n",
881*3117ece4Schristos                             (int)dErr, (int)zwd->inBuffer.size, (int)zwd->outBuffer.size);
882*3117ece4Schristos                 if (ZSTD_isError(dErr)) {
883*3117ece4Schristos                     LOG_WRAPPERD("ERROR: ZSTD_decompressStream1 %s\n", ZSTD_getErrorName(dErr));
884*3117ece4Schristos                     goto error;
885*3117ece4Schristos             }   }
886*3117ece4Schristos             if (zwd->inBuffer.pos != zwd->inBuffer.size) goto error; /* not consumed */
887*3117ece4Schristos         }
888*3117ece4Schristos     }   /* (zwd->totalInBytes < ZSTD_HEADERSIZE) */
889*3117ece4Schristos 
890*3117ece4Schristos     zwd->inBuffer.src = strm->next_in;
891*3117ece4Schristos     zwd->inBuffer.size = strm->avail_in;
892*3117ece4Schristos     zwd->inBuffer.pos = 0;
893*3117ece4Schristos     zwd->outBuffer.dst = strm->next_out;
894*3117ece4Schristos     zwd->outBuffer.size = strm->avail_out;
895*3117ece4Schristos     zwd->outBuffer.pos = 0;
896*3117ece4Schristos     {   size_t const dErr = ZSTD_decompressStream(zwd->zbd, &zwd->outBuffer, &zwd->inBuffer);
897*3117ece4Schristos         LOG_WRAPPERD("inflate ZSTD_decompressStream2 errorCode=%d srcSize=%d dstCapacity=%d\n",
898*3117ece4Schristos                     (int)dErr, (int)strm->avail_in, (int)strm->avail_out);
899*3117ece4Schristos         if (ZSTD_isError(dErr)) {
900*3117ece4Schristos             zwd->errorCount++;
901*3117ece4Schristos             LOG_WRAPPERD("ERROR: ZSTD_decompressStream2 %s zwd->errorCount=%d\n",
902*3117ece4Schristos                         ZSTD_getErrorName(dErr), zwd->errorCount);
903*3117ece4Schristos             if (zwd->errorCount<=1) return Z_NEED_DICT; else goto error;
904*3117ece4Schristos         }
905*3117ece4Schristos         LOG_WRAPPERD("inflate inBuffer.pos=%d inBuffer.size=%d outBuffer.pos=%d outBuffer.size=%d o\n",
906*3117ece4Schristos                     (int)zwd->inBuffer.pos, (int)zwd->inBuffer.size, (int)zwd->outBuffer.pos, (int)zwd->outBuffer.size);
907*3117ece4Schristos         strm->next_out += zwd->outBuffer.pos;
908*3117ece4Schristos         strm->total_out += zwd->outBuffer.pos;
909*3117ece4Schristos         strm->avail_out -= zwd->outBuffer.pos;
910*3117ece4Schristos         strm->total_in += zwd->inBuffer.pos;
911*3117ece4Schristos         zwd->totalInBytes += zwd->inBuffer.pos;
912*3117ece4Schristos         strm->next_in += zwd->inBuffer.pos;
913*3117ece4Schristos         strm->avail_in -= zwd->inBuffer.pos;
914*3117ece4Schristos         if (dErr == 0) {
915*3117ece4Schristos             LOG_WRAPPERD("inflate Z_STREAM_END1 avail_in=%d avail_out=%d total_in=%d total_out=%d\n",
916*3117ece4Schristos                         (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out);
917*3117ece4Schristos             zwd->decompState = ZWRAP_streamEnd;
918*3117ece4Schristos             return Z_STREAM_END;
919*3117ece4Schristos         }
920*3117ece4Schristos     }  /* dErr lifetime */
921*3117ece4Schristos 
922*3117ece4Schristos     LOG_WRAPPERD("- inflate2 flush=%d avail_in=%d avail_out=%d total_in=%d total_out=%d res=%d\n",
923*3117ece4Schristos                 (int)flush, (int)strm->avail_in, (int)strm->avail_out, (int)strm->total_in, (int)strm->total_out, Z_OK);
924*3117ece4Schristos     return Z_OK;
925*3117ece4Schristos 
926*3117ece4Schristos error:
927*3117ece4Schristos     return ZWRAPD_finishWithError(zwd, strm, 0);
928*3117ece4Schristos }
929*3117ece4Schristos 
930*3117ece4Schristos 
931*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateEnd _Z_OF((z_streamp strm))
932*3117ece4Schristos {
933*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
934*3117ece4Schristos         return inflateEnd(strm);
935*3117ece4Schristos 
936*3117ece4Schristos     LOG_WRAPPERD("- inflateEnd total_in=%d total_out=%d\n",
937*3117ece4Schristos                 (int)(strm->total_in), (int)(strm->total_out));
938*3117ece4Schristos     {   ZWRAP_DCtx* const zwd = (ZWRAP_DCtx*) strm->state;
939*3117ece4Schristos         if (zwd == NULL) return Z_OK;  /* structures are already freed */
940*3117ece4Schristos         { size_t const freeErr = ZWRAP_freeDCtx(zwd);
941*3117ece4Schristos           if (ZSTD_isError(freeErr)) return Z_STREAM_ERROR; }
942*3117ece4Schristos         strm->state = NULL;
943*3117ece4Schristos     }
944*3117ece4Schristos     return Z_OK;
945*3117ece4Schristos }
946*3117ece4Schristos 
947*3117ece4Schristos 
948*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateSync _Z_OF((z_streamp strm))
949*3117ece4Schristos {
950*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved) {
951*3117ece4Schristos         return inflateSync(strm);
952*3117ece4Schristos     }
953*3117ece4Schristos 
954*3117ece4Schristos     return z_inflate(strm, Z_INFLATE_SYNC);
955*3117ece4Schristos }
956*3117ece4Schristos 
957*3117ece4Schristos 
958*3117ece4Schristos 
959*3117ece4Schristos /* Advanced compression functions */
960*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateCopy _Z_OF((z_streamp dest,
961*3117ece4Schristos                                     z_streamp source))
962*3117ece4Schristos {
963*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
964*3117ece4Schristos         return deflateCopy(dest, source);
965*3117ece4Schristos     return ZWRAPC_finishWithErrorMsg(source, "deflateCopy is not supported!");
966*3117ece4Schristos }
967*3117ece4Schristos 
968*3117ece4Schristos 
969*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateTune _Z_OF((z_streamp strm,
970*3117ece4Schristos                                     int good_length,
971*3117ece4Schristos                                     int max_lazy,
972*3117ece4Schristos                                     int nice_length,
973*3117ece4Schristos                                     int max_chain))
974*3117ece4Schristos {
975*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
976*3117ece4Schristos         return deflateTune(strm, good_length, max_lazy, nice_length, max_chain);
977*3117ece4Schristos     return ZWRAPC_finishWithErrorMsg(strm, "deflateTune is not supported!");
978*3117ece4Schristos }
979*3117ece4Schristos 
980*3117ece4Schristos 
981*3117ece4Schristos #if ZLIB_VERNUM >= 0x1260
982*3117ece4Schristos ZEXTERN int ZEXPORT z_deflatePending _Z_OF((z_streamp strm,
983*3117ece4Schristos                                        unsigned *pending,
984*3117ece4Schristos                                        int *bits))
985*3117ece4Schristos {
986*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
987*3117ece4Schristos         return deflatePending(strm, pending, bits);
988*3117ece4Schristos     return ZWRAPC_finishWithErrorMsg(strm, "deflatePending is not supported!");
989*3117ece4Schristos }
990*3117ece4Schristos #endif
991*3117ece4Schristos 
992*3117ece4Schristos 
993*3117ece4Schristos ZEXTERN int ZEXPORT z_deflatePrime _Z_OF((z_streamp strm,
994*3117ece4Schristos                                      int bits,
995*3117ece4Schristos                                      int value))
996*3117ece4Schristos {
997*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
998*3117ece4Schristos         return deflatePrime(strm, bits, value);
999*3117ece4Schristos     return ZWRAPC_finishWithErrorMsg(strm, "deflatePrime is not supported!");
1000*3117ece4Schristos }
1001*3117ece4Schristos 
1002*3117ece4Schristos 
1003*3117ece4Schristos ZEXTERN int ZEXPORT z_deflateSetHeader _Z_OF((z_streamp strm,
1004*3117ece4Schristos                                          gz_headerp head))
1005*3117ece4Schristos {
1006*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
1007*3117ece4Schristos         return deflateSetHeader(strm, head);
1008*3117ece4Schristos     return ZWRAPC_finishWithErrorMsg(strm, "deflateSetHeader is not supported!");
1009*3117ece4Schristos }
1010*3117ece4Schristos 
1011*3117ece4Schristos 
1012*3117ece4Schristos 
1013*3117ece4Schristos 
1014*3117ece4Schristos /* Advanced decompression functions */
1015*3117ece4Schristos #if ZLIB_VERNUM >= 0x1280
1016*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateGetDictionary _Z_OF((z_streamp strm,
1017*3117ece4Schristos                                              Bytef *dictionary,
1018*3117ece4Schristos                                              uInt  *dictLength))
1019*3117ece4Schristos {
1020*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1021*3117ece4Schristos         return inflateGetDictionary(strm, dictionary, dictLength);
1022*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateGetDictionary is not supported!");
1023*3117ece4Schristos }
1024*3117ece4Schristos #endif
1025*3117ece4Schristos 
1026*3117ece4Schristos 
1027*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateCopy _Z_OF((z_streamp dest,
1028*3117ece4Schristos                                     z_streamp source))
1029*3117ece4Schristos {
1030*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !source->reserved)
1031*3117ece4Schristos         return inflateCopy(dest, source);
1032*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(source, "inflateCopy is not supported!");
1033*3117ece4Schristos }
1034*3117ece4Schristos 
1035*3117ece4Schristos 
1036*3117ece4Schristos #if ZLIB_VERNUM >= 0x1240
1037*3117ece4Schristos ZEXTERN long ZEXPORT z_inflateMark _Z_OF((z_streamp strm))
1038*3117ece4Schristos {
1039*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1040*3117ece4Schristos         return inflateMark(strm);
1041*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateMark is not supported!");
1042*3117ece4Schristos }
1043*3117ece4Schristos #endif
1044*3117ece4Schristos 
1045*3117ece4Schristos 
1046*3117ece4Schristos ZEXTERN int ZEXPORT z_inflatePrime _Z_OF((z_streamp strm,
1047*3117ece4Schristos                                      int bits,
1048*3117ece4Schristos                                      int value))
1049*3117ece4Schristos {
1050*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1051*3117ece4Schristos         return inflatePrime(strm, bits, value);
1052*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflatePrime is not supported!");
1053*3117ece4Schristos }
1054*3117ece4Schristos 
1055*3117ece4Schristos 
1056*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateGetHeader _Z_OF((z_streamp strm,
1057*3117ece4Schristos                                          gz_headerp head))
1058*3117ece4Schristos {
1059*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1060*3117ece4Schristos         return inflateGetHeader(strm, head);
1061*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateGetHeader is not supported!");
1062*3117ece4Schristos }
1063*3117ece4Schristos 
1064*3117ece4Schristos 
1065*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateBackInit_ _Z_OF((z_streamp strm, int windowBits,
1066*3117ece4Schristos                                          unsigned char FAR *window,
1067*3117ece4Schristos                                          const char *version,
1068*3117ece4Schristos                                          int stream_size))
1069*3117ece4Schristos {
1070*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1071*3117ece4Schristos         return inflateBackInit_(strm, windowBits, window, version, stream_size);
1072*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateBackInit is not supported!");
1073*3117ece4Schristos }
1074*3117ece4Schristos 
1075*3117ece4Schristos 
1076*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateBack _Z_OF((z_streamp strm,
1077*3117ece4Schristos                                     in_func in, void FAR *in_desc,
1078*3117ece4Schristos                                     out_func out, void FAR *out_desc))
1079*3117ece4Schristos {
1080*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1081*3117ece4Schristos         return inflateBack(strm, in, in_desc, out, out_desc);
1082*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateBack is not supported!");
1083*3117ece4Schristos }
1084*3117ece4Schristos 
1085*3117ece4Schristos 
1086*3117ece4Schristos ZEXTERN int ZEXPORT z_inflateBackEnd _Z_OF((z_streamp strm))
1087*3117ece4Schristos {
1088*3117ece4Schristos     if (g_ZWRAPdecompressionType == ZWRAP_FORCE_ZLIB || !strm->reserved)
1089*3117ece4Schristos         return inflateBackEnd(strm);
1090*3117ece4Schristos     return ZWRAPD_finishWithErrorMsg(strm, "inflateBackEnd is not supported!");
1091*3117ece4Schristos }
1092*3117ece4Schristos 
1093*3117ece4Schristos 
1094*3117ece4Schristos ZEXTERN uLong ZEXPORT z_zlibCompileFlags _Z_OF((void)) { return zlibCompileFlags(); }
1095*3117ece4Schristos 
1096*3117ece4Schristos 
1097*3117ece4Schristos 
1098*3117ece4Schristos                     /* ===   utility functions  === */
1099*3117ece4Schristos #ifndef Z_SOLO
1100*3117ece4Schristos 
1101*3117ece4Schristos ZEXTERN int ZEXPORT z_compress _Z_OF((Bytef *dest,   uLongf *destLen,
1102*3117ece4Schristos                                  const Bytef *source, uLong sourceLen))
1103*3117ece4Schristos {
1104*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
1105*3117ece4Schristos         return compress(dest, destLen, source, sourceLen);
1106*3117ece4Schristos 
1107*3117ece4Schristos     {   size_t dstCapacity = *destLen;
1108*3117ece4Schristos         size_t const cSize = ZSTD_compress(dest, dstCapacity,
1109*3117ece4Schristos                                            source, sourceLen,
1110*3117ece4Schristos                                            ZWRAP_DEFAULT_CLEVEL);
1111*3117ece4Schristos         LOG_WRAPPERD("z_compress sourceLen=%d dstCapacity=%d\n",
1112*3117ece4Schristos                     (int)sourceLen, (int)dstCapacity);
1113*3117ece4Schristos         if (ZSTD_isError(cSize)) return Z_STREAM_ERROR;
1114*3117ece4Schristos         *destLen = cSize;
1115*3117ece4Schristos     }
1116*3117ece4Schristos     return Z_OK;
1117*3117ece4Schristos }
1118*3117ece4Schristos 
1119*3117ece4Schristos 
1120*3117ece4Schristos ZEXTERN int ZEXPORT z_compress2 _Z_OF((Bytef *dest,   uLongf *destLen,
1121*3117ece4Schristos                                   const Bytef *source, uLong sourceLen,
1122*3117ece4Schristos                                   int level))
1123*3117ece4Schristos {
1124*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
1125*3117ece4Schristos         return compress2(dest, destLen, source, sourceLen, level);
1126*3117ece4Schristos 
1127*3117ece4Schristos     { size_t dstCapacity = *destLen;
1128*3117ece4Schristos       size_t const cSize = ZSTD_compress(dest, dstCapacity, source, sourceLen, level);
1129*3117ece4Schristos       if (ZSTD_isError(cSize)) return Z_STREAM_ERROR;
1130*3117ece4Schristos       *destLen = cSize;
1131*3117ece4Schristos     }
1132*3117ece4Schristos     return Z_OK;
1133*3117ece4Schristos }
1134*3117ece4Schristos 
1135*3117ece4Schristos 
1136*3117ece4Schristos ZEXTERN uLong ZEXPORT z_compressBound _Z_OF((uLong sourceLen))
1137*3117ece4Schristos {
1138*3117ece4Schristos     if (!g_ZWRAP_useZSTDcompression)
1139*3117ece4Schristos         return compressBound(sourceLen);
1140*3117ece4Schristos 
1141*3117ece4Schristos     return ZSTD_compressBound(sourceLen);
1142*3117ece4Schristos }
1143*3117ece4Schristos 
1144*3117ece4Schristos 
1145*3117ece4Schristos ZEXTERN int ZEXPORT z_uncompress _Z_OF((Bytef *dest,   uLongf *destLen,
1146*3117ece4Schristos                                    const Bytef *source, uLong sourceLen))
1147*3117ece4Schristos {
1148*3117ece4Schristos     if (!ZSTD_isFrame(source, sourceLen))
1149*3117ece4Schristos         return uncompress(dest, destLen, source, sourceLen);
1150*3117ece4Schristos 
1151*3117ece4Schristos     { size_t dstCapacity = *destLen;
1152*3117ece4Schristos       size_t const dSize = ZSTD_decompress(dest, dstCapacity, source, sourceLen);
1153*3117ece4Schristos       if (ZSTD_isError(dSize)) return Z_STREAM_ERROR;
1154*3117ece4Schristos       *destLen = dSize;
1155*3117ece4Schristos      }
1156*3117ece4Schristos     return Z_OK;
1157*3117ece4Schristos }
1158*3117ece4Schristos 
1159*3117ece4Schristos #endif /* !Z_SOLO */
1160*3117ece4Schristos 
1161*3117ece4Schristos 
1162*3117ece4Schristos                         /* checksum functions */
1163*3117ece4Schristos 
1164*3117ece4Schristos ZEXTERN uLong ZEXPORT z_adler32 _Z_OF((uLong adler, const Bytef *buf, uInt len))
1165*3117ece4Schristos {
1166*3117ece4Schristos     return adler32(adler, buf, len);
1167*3117ece4Schristos }
1168*3117ece4Schristos 
1169*3117ece4Schristos ZEXTERN uLong ZEXPORT z_crc32   _Z_OF((uLong crc, const Bytef *buf, uInt len))
1170*3117ece4Schristos {
1171*3117ece4Schristos     return crc32(crc, buf, len);
1172*3117ece4Schristos }
1173*3117ece4Schristos 
1174*3117ece4Schristos 
1175*3117ece4Schristos #if ZLIB_VERNUM >= 0x12B0
1176*3117ece4Schristos ZEXTERN uLong ZEXPORT z_adler32_z _Z_OF((uLong adler, const Bytef *buf, z_size_t len))
1177*3117ece4Schristos {
1178*3117ece4Schristos     return adler32_z(adler, buf, len);
1179*3117ece4Schristos }
1180*3117ece4Schristos 
1181*3117ece4Schristos ZEXTERN uLong ZEXPORT z_crc32_z _Z_OF((uLong crc, const Bytef *buf, z_size_t len))
1182*3117ece4Schristos {
1183*3117ece4Schristos     return crc32_z(crc, buf, len);
1184*3117ece4Schristos }
1185*3117ece4Schristos #endif
1186*3117ece4Schristos 
1187*3117ece4Schristos 
1188*3117ece4Schristos #if ZLIB_VERNUM >= 0x1270
1189*3117ece4Schristos ZEXTERN const z_crc_t FAR * ZEXPORT z_get_crc_table    _Z_OF((void))
1190*3117ece4Schristos {
1191*3117ece4Schristos     return get_crc_table();
1192*3117ece4Schristos }
1193*3117ece4Schristos #endif
1194*3117ece4Schristos 
1195*3117ece4Schristos                         /* Error function */
1196*3117ece4Schristos ZEXTERN const char * ZEXPORT z_zError _Z_OF((int err))
1197*3117ece4Schristos {
1198*3117ece4Schristos     /* Just use zlib Error function */
1199*3117ece4Schristos     return zError(err);
1200*3117ece4Schristos }
1201