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