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 #ifndef ZSTD_LEGACY_H 12*3117ece4Schristos #define ZSTD_LEGACY_H 13*3117ece4Schristos 14*3117ece4Schristos #if defined (__cplusplus) 15*3117ece4Schristos extern "C" { 16*3117ece4Schristos #endif 17*3117ece4Schristos 18*3117ece4Schristos /* ************************************* 19*3117ece4Schristos * Includes 20*3117ece4Schristos ***************************************/ 21*3117ece4Schristos #include "../common/mem.h" /* MEM_STATIC */ 22*3117ece4Schristos #include "../common/error_private.h" /* ERROR */ 23*3117ece4Schristos #include "../common/zstd_internal.h" /* ZSTD_inBuffer, ZSTD_outBuffer, ZSTD_frameSizeInfo */ 24*3117ece4Schristos 25*3117ece4Schristos #if !defined (ZSTD_LEGACY_SUPPORT) || (ZSTD_LEGACY_SUPPORT == 0) 26*3117ece4Schristos # undef ZSTD_LEGACY_SUPPORT 27*3117ece4Schristos # define ZSTD_LEGACY_SUPPORT 8 28*3117ece4Schristos #endif 29*3117ece4Schristos 30*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 1) 31*3117ece4Schristos # include "zstd_v01.h" 32*3117ece4Schristos #endif 33*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 2) 34*3117ece4Schristos # include "zstd_v02.h" 35*3117ece4Schristos #endif 36*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 3) 37*3117ece4Schristos # include "zstd_v03.h" 38*3117ece4Schristos #endif 39*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 40*3117ece4Schristos # include "zstd_v04.h" 41*3117ece4Schristos #endif 42*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 43*3117ece4Schristos # include "zstd_v05.h" 44*3117ece4Schristos #endif 45*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 46*3117ece4Schristos # include "zstd_v06.h" 47*3117ece4Schristos #endif 48*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 49*3117ece4Schristos # include "zstd_v07.h" 50*3117ece4Schristos #endif 51*3117ece4Schristos 52*3117ece4Schristos /** ZSTD_isLegacy() : 53*3117ece4Schristos @return : > 0 if supported by legacy decoder. 0 otherwise. 54*3117ece4Schristos return value is the version. 55*3117ece4Schristos */ 56*3117ece4Schristos MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize) 57*3117ece4Schristos { 58*3117ece4Schristos U32 magicNumberLE; 59*3117ece4Schristos if (srcSize<4) return 0; 60*3117ece4Schristos magicNumberLE = MEM_readLE32(src); 61*3117ece4Schristos switch(magicNumberLE) 62*3117ece4Schristos { 63*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 1) 64*3117ece4Schristos case ZSTDv01_magicNumberLE:return 1; 65*3117ece4Schristos #endif 66*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 2) 67*3117ece4Schristos case ZSTDv02_magicNumber : return 2; 68*3117ece4Schristos #endif 69*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 3) 70*3117ece4Schristos case ZSTDv03_magicNumber : return 3; 71*3117ece4Schristos #endif 72*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 73*3117ece4Schristos case ZSTDv04_magicNumber : return 4; 74*3117ece4Schristos #endif 75*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 76*3117ece4Schristos case ZSTDv05_MAGICNUMBER : return 5; 77*3117ece4Schristos #endif 78*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 79*3117ece4Schristos case ZSTDv06_MAGICNUMBER : return 6; 80*3117ece4Schristos #endif 81*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 82*3117ece4Schristos case ZSTDv07_MAGICNUMBER : return 7; 83*3117ece4Schristos #endif 84*3117ece4Schristos default : return 0; 85*3117ece4Schristos } 86*3117ece4Schristos } 87*3117ece4Schristos 88*3117ece4Schristos 89*3117ece4Schristos MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize) 90*3117ece4Schristos { 91*3117ece4Schristos U32 const version = ZSTD_isLegacy(src, srcSize); 92*3117ece4Schristos if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */ 93*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 94*3117ece4Schristos if (version==5) { 95*3117ece4Schristos ZSTDv05_parameters fParams; 96*3117ece4Schristos size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize); 97*3117ece4Schristos if (frResult != 0) return 0; 98*3117ece4Schristos return fParams.srcSize; 99*3117ece4Schristos } 100*3117ece4Schristos #endif 101*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 102*3117ece4Schristos if (version==6) { 103*3117ece4Schristos ZSTDv06_frameParams fParams; 104*3117ece4Schristos size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize); 105*3117ece4Schristos if (frResult != 0) return 0; 106*3117ece4Schristos return fParams.frameContentSize; 107*3117ece4Schristos } 108*3117ece4Schristos #endif 109*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 110*3117ece4Schristos if (version==7) { 111*3117ece4Schristos ZSTDv07_frameParams fParams; 112*3117ece4Schristos size_t const frResult = ZSTDv07_getFrameParams(&fParams, src, srcSize); 113*3117ece4Schristos if (frResult != 0) return 0; 114*3117ece4Schristos return fParams.frameContentSize; 115*3117ece4Schristos } 116*3117ece4Schristos #endif 117*3117ece4Schristos return 0; /* should not be possible */ 118*3117ece4Schristos } 119*3117ece4Schristos 120*3117ece4Schristos 121*3117ece4Schristos MEM_STATIC size_t ZSTD_decompressLegacy( 122*3117ece4Schristos void* dst, size_t dstCapacity, 123*3117ece4Schristos const void* src, size_t compressedSize, 124*3117ece4Schristos const void* dict,size_t dictSize) 125*3117ece4Schristos { 126*3117ece4Schristos U32 const version = ZSTD_isLegacy(src, compressedSize); 127*3117ece4Schristos char x; 128*3117ece4Schristos /* Avoid passing NULL to legacy decoding. */ 129*3117ece4Schristos if (dst == NULL) { 130*3117ece4Schristos assert(dstCapacity == 0); 131*3117ece4Schristos dst = &x; 132*3117ece4Schristos } 133*3117ece4Schristos if (src == NULL) { 134*3117ece4Schristos assert(compressedSize == 0); 135*3117ece4Schristos src = &x; 136*3117ece4Schristos } 137*3117ece4Schristos if (dict == NULL) { 138*3117ece4Schristos assert(dictSize == 0); 139*3117ece4Schristos dict = &x; 140*3117ece4Schristos } 141*3117ece4Schristos (void)dst; (void)dstCapacity; (void)dict; (void)dictSize; /* unused when ZSTD_LEGACY_SUPPORT >= 8 */ 142*3117ece4Schristos switch(version) 143*3117ece4Schristos { 144*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 1) 145*3117ece4Schristos case 1 : 146*3117ece4Schristos return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize); 147*3117ece4Schristos #endif 148*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 2) 149*3117ece4Schristos case 2 : 150*3117ece4Schristos return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize); 151*3117ece4Schristos #endif 152*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 3) 153*3117ece4Schristos case 3 : 154*3117ece4Schristos return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize); 155*3117ece4Schristos #endif 156*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 157*3117ece4Schristos case 4 : 158*3117ece4Schristos return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize); 159*3117ece4Schristos #endif 160*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 161*3117ece4Schristos case 5 : 162*3117ece4Schristos { size_t result; 163*3117ece4Schristos ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx(); 164*3117ece4Schristos if (zd==NULL) return ERROR(memory_allocation); 165*3117ece4Schristos result = ZSTDv05_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); 166*3117ece4Schristos ZSTDv05_freeDCtx(zd); 167*3117ece4Schristos return result; 168*3117ece4Schristos } 169*3117ece4Schristos #endif 170*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 171*3117ece4Schristos case 6 : 172*3117ece4Schristos { size_t result; 173*3117ece4Schristos ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx(); 174*3117ece4Schristos if (zd==NULL) return ERROR(memory_allocation); 175*3117ece4Schristos result = ZSTDv06_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); 176*3117ece4Schristos ZSTDv06_freeDCtx(zd); 177*3117ece4Schristos return result; 178*3117ece4Schristos } 179*3117ece4Schristos #endif 180*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 181*3117ece4Schristos case 7 : 182*3117ece4Schristos { size_t result; 183*3117ece4Schristos ZSTDv07_DCtx* const zd = ZSTDv07_createDCtx(); 184*3117ece4Schristos if (zd==NULL) return ERROR(memory_allocation); 185*3117ece4Schristos result = ZSTDv07_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize); 186*3117ece4Schristos ZSTDv07_freeDCtx(zd); 187*3117ece4Schristos return result; 188*3117ece4Schristos } 189*3117ece4Schristos #endif 190*3117ece4Schristos default : 191*3117ece4Schristos return ERROR(prefix_unknown); 192*3117ece4Schristos } 193*3117ece4Schristos } 194*3117ece4Schristos 195*3117ece4Schristos MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size_t srcSize) 196*3117ece4Schristos { 197*3117ece4Schristos ZSTD_frameSizeInfo frameSizeInfo; 198*3117ece4Schristos U32 const version = ZSTD_isLegacy(src, srcSize); 199*3117ece4Schristos switch(version) 200*3117ece4Schristos { 201*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 1) 202*3117ece4Schristos case 1 : 203*3117ece4Schristos ZSTDv01_findFrameSizeInfoLegacy(src, srcSize, 204*3117ece4Schristos &frameSizeInfo.compressedSize, 205*3117ece4Schristos &frameSizeInfo.decompressedBound); 206*3117ece4Schristos break; 207*3117ece4Schristos #endif 208*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 2) 209*3117ece4Schristos case 2 : 210*3117ece4Schristos ZSTDv02_findFrameSizeInfoLegacy(src, srcSize, 211*3117ece4Schristos &frameSizeInfo.compressedSize, 212*3117ece4Schristos &frameSizeInfo.decompressedBound); 213*3117ece4Schristos break; 214*3117ece4Schristos #endif 215*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 3) 216*3117ece4Schristos case 3 : 217*3117ece4Schristos ZSTDv03_findFrameSizeInfoLegacy(src, srcSize, 218*3117ece4Schristos &frameSizeInfo.compressedSize, 219*3117ece4Schristos &frameSizeInfo.decompressedBound); 220*3117ece4Schristos break; 221*3117ece4Schristos #endif 222*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 223*3117ece4Schristos case 4 : 224*3117ece4Schristos ZSTDv04_findFrameSizeInfoLegacy(src, srcSize, 225*3117ece4Schristos &frameSizeInfo.compressedSize, 226*3117ece4Schristos &frameSizeInfo.decompressedBound); 227*3117ece4Schristos break; 228*3117ece4Schristos #endif 229*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 230*3117ece4Schristos case 5 : 231*3117ece4Schristos ZSTDv05_findFrameSizeInfoLegacy(src, srcSize, 232*3117ece4Schristos &frameSizeInfo.compressedSize, 233*3117ece4Schristos &frameSizeInfo.decompressedBound); 234*3117ece4Schristos break; 235*3117ece4Schristos #endif 236*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 237*3117ece4Schristos case 6 : 238*3117ece4Schristos ZSTDv06_findFrameSizeInfoLegacy(src, srcSize, 239*3117ece4Schristos &frameSizeInfo.compressedSize, 240*3117ece4Schristos &frameSizeInfo.decompressedBound); 241*3117ece4Schristos break; 242*3117ece4Schristos #endif 243*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 244*3117ece4Schristos case 7 : 245*3117ece4Schristos ZSTDv07_findFrameSizeInfoLegacy(src, srcSize, 246*3117ece4Schristos &frameSizeInfo.compressedSize, 247*3117ece4Schristos &frameSizeInfo.decompressedBound); 248*3117ece4Schristos break; 249*3117ece4Schristos #endif 250*3117ece4Schristos default : 251*3117ece4Schristos frameSizeInfo.compressedSize = ERROR(prefix_unknown); 252*3117ece4Schristos frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; 253*3117ece4Schristos break; 254*3117ece4Schristos } 255*3117ece4Schristos if (!ZSTD_isError(frameSizeInfo.compressedSize) && frameSizeInfo.compressedSize > srcSize) { 256*3117ece4Schristos frameSizeInfo.compressedSize = ERROR(srcSize_wrong); 257*3117ece4Schristos frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR; 258*3117ece4Schristos } 259*3117ece4Schristos /* In all cases, decompressedBound == nbBlocks * ZSTD_BLOCKSIZE_MAX. 260*3117ece4Schristos * So we can compute nbBlocks without having to change every function. 261*3117ece4Schristos */ 262*3117ece4Schristos if (frameSizeInfo.decompressedBound != ZSTD_CONTENTSIZE_ERROR) { 263*3117ece4Schristos assert((frameSizeInfo.decompressedBound & (ZSTD_BLOCKSIZE_MAX - 1)) == 0); 264*3117ece4Schristos frameSizeInfo.nbBlocks = (size_t)(frameSizeInfo.decompressedBound / ZSTD_BLOCKSIZE_MAX); 265*3117ece4Schristos } 266*3117ece4Schristos return frameSizeInfo; 267*3117ece4Schristos } 268*3117ece4Schristos 269*3117ece4Schristos MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src, size_t srcSize) 270*3117ece4Schristos { 271*3117ece4Schristos ZSTD_frameSizeInfo frameSizeInfo = ZSTD_findFrameSizeInfoLegacy(src, srcSize); 272*3117ece4Schristos return frameSizeInfo.compressedSize; 273*3117ece4Schristos } 274*3117ece4Schristos 275*3117ece4Schristos MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version) 276*3117ece4Schristos { 277*3117ece4Schristos switch(version) 278*3117ece4Schristos { 279*3117ece4Schristos default : 280*3117ece4Schristos case 1 : 281*3117ece4Schristos case 2 : 282*3117ece4Schristos case 3 : 283*3117ece4Schristos (void)legacyContext; 284*3117ece4Schristos return ERROR(version_unsupported); 285*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 286*3117ece4Schristos case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext); 287*3117ece4Schristos #endif 288*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 289*3117ece4Schristos case 5 : return ZBUFFv05_freeDCtx((ZBUFFv05_DCtx*)legacyContext); 290*3117ece4Schristos #endif 291*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 292*3117ece4Schristos case 6 : return ZBUFFv06_freeDCtx((ZBUFFv06_DCtx*)legacyContext); 293*3117ece4Schristos #endif 294*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 295*3117ece4Schristos case 7 : return ZBUFFv07_freeDCtx((ZBUFFv07_DCtx*)legacyContext); 296*3117ece4Schristos #endif 297*3117ece4Schristos } 298*3117ece4Schristos } 299*3117ece4Schristos 300*3117ece4Schristos 301*3117ece4Schristos MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U32 newVersion, 302*3117ece4Schristos const void* dict, size_t dictSize) 303*3117ece4Schristos { 304*3117ece4Schristos char x; 305*3117ece4Schristos /* Avoid passing NULL to legacy decoding. */ 306*3117ece4Schristos if (dict == NULL) { 307*3117ece4Schristos assert(dictSize == 0); 308*3117ece4Schristos dict = &x; 309*3117ece4Schristos } 310*3117ece4Schristos DEBUGLOG(5, "ZSTD_initLegacyStream for v0.%u", newVersion); 311*3117ece4Schristos if (prevVersion != newVersion) ZSTD_freeLegacyStreamContext(*legacyContext, prevVersion); 312*3117ece4Schristos switch(newVersion) 313*3117ece4Schristos { 314*3117ece4Schristos default : 315*3117ece4Schristos case 1 : 316*3117ece4Schristos case 2 : 317*3117ece4Schristos case 3 : 318*3117ece4Schristos (void)dict; (void)dictSize; 319*3117ece4Schristos return 0; 320*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 321*3117ece4Schristos case 4 : 322*3117ece4Schristos { 323*3117ece4Schristos ZBUFFv04_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv04_createDCtx() : (ZBUFFv04_DCtx*)*legacyContext; 324*3117ece4Schristos if (dctx==NULL) return ERROR(memory_allocation); 325*3117ece4Schristos ZBUFFv04_decompressInit(dctx); 326*3117ece4Schristos ZBUFFv04_decompressWithDictionary(dctx, dict, dictSize); 327*3117ece4Schristos *legacyContext = dctx; 328*3117ece4Schristos return 0; 329*3117ece4Schristos } 330*3117ece4Schristos #endif 331*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 332*3117ece4Schristos case 5 : 333*3117ece4Schristos { 334*3117ece4Schristos ZBUFFv05_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv05_createDCtx() : (ZBUFFv05_DCtx*)*legacyContext; 335*3117ece4Schristos if (dctx==NULL) return ERROR(memory_allocation); 336*3117ece4Schristos ZBUFFv05_decompressInitDictionary(dctx, dict, dictSize); 337*3117ece4Schristos *legacyContext = dctx; 338*3117ece4Schristos return 0; 339*3117ece4Schristos } 340*3117ece4Schristos #endif 341*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 342*3117ece4Schristos case 6 : 343*3117ece4Schristos { 344*3117ece4Schristos ZBUFFv06_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv06_createDCtx() : (ZBUFFv06_DCtx*)*legacyContext; 345*3117ece4Schristos if (dctx==NULL) return ERROR(memory_allocation); 346*3117ece4Schristos ZBUFFv06_decompressInitDictionary(dctx, dict, dictSize); 347*3117ece4Schristos *legacyContext = dctx; 348*3117ece4Schristos return 0; 349*3117ece4Schristos } 350*3117ece4Schristos #endif 351*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 352*3117ece4Schristos case 7 : 353*3117ece4Schristos { 354*3117ece4Schristos ZBUFFv07_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv07_createDCtx() : (ZBUFFv07_DCtx*)*legacyContext; 355*3117ece4Schristos if (dctx==NULL) return ERROR(memory_allocation); 356*3117ece4Schristos ZBUFFv07_decompressInitDictionary(dctx, dict, dictSize); 357*3117ece4Schristos *legacyContext = dctx; 358*3117ece4Schristos return 0; 359*3117ece4Schristos } 360*3117ece4Schristos #endif 361*3117ece4Schristos } 362*3117ece4Schristos } 363*3117ece4Schristos 364*3117ece4Schristos 365*3117ece4Schristos 366*3117ece4Schristos MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version, 367*3117ece4Schristos ZSTD_outBuffer* output, ZSTD_inBuffer* input) 368*3117ece4Schristos { 369*3117ece4Schristos static char x; 370*3117ece4Schristos /* Avoid passing NULL to legacy decoding. */ 371*3117ece4Schristos if (output->dst == NULL) { 372*3117ece4Schristos assert(output->size == 0); 373*3117ece4Schristos output->dst = &x; 374*3117ece4Schristos } 375*3117ece4Schristos if (input->src == NULL) { 376*3117ece4Schristos assert(input->size == 0); 377*3117ece4Schristos input->src = &x; 378*3117ece4Schristos } 379*3117ece4Schristos DEBUGLOG(5, "ZSTD_decompressLegacyStream for v0.%u", version); 380*3117ece4Schristos switch(version) 381*3117ece4Schristos { 382*3117ece4Schristos default : 383*3117ece4Schristos case 1 : 384*3117ece4Schristos case 2 : 385*3117ece4Schristos case 3 : 386*3117ece4Schristos (void)legacyContext; (void)output; (void)input; 387*3117ece4Schristos return ERROR(version_unsupported); 388*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 4) 389*3117ece4Schristos case 4 : 390*3117ece4Schristos { 391*3117ece4Schristos ZBUFFv04_DCtx* dctx = (ZBUFFv04_DCtx*) legacyContext; 392*3117ece4Schristos const void* src = (const char*)input->src + input->pos; 393*3117ece4Schristos size_t readSize = input->size - input->pos; 394*3117ece4Schristos void* dst = (char*)output->dst + output->pos; 395*3117ece4Schristos size_t decodedSize = output->size - output->pos; 396*3117ece4Schristos size_t const hintSize = ZBUFFv04_decompressContinue(dctx, dst, &decodedSize, src, &readSize); 397*3117ece4Schristos output->pos += decodedSize; 398*3117ece4Schristos input->pos += readSize; 399*3117ece4Schristos return hintSize; 400*3117ece4Schristos } 401*3117ece4Schristos #endif 402*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 5) 403*3117ece4Schristos case 5 : 404*3117ece4Schristos { 405*3117ece4Schristos ZBUFFv05_DCtx* dctx = (ZBUFFv05_DCtx*) legacyContext; 406*3117ece4Schristos const void* src = (const char*)input->src + input->pos; 407*3117ece4Schristos size_t readSize = input->size - input->pos; 408*3117ece4Schristos void* dst = (char*)output->dst + output->pos; 409*3117ece4Schristos size_t decodedSize = output->size - output->pos; 410*3117ece4Schristos size_t const hintSize = ZBUFFv05_decompressContinue(dctx, dst, &decodedSize, src, &readSize); 411*3117ece4Schristos output->pos += decodedSize; 412*3117ece4Schristos input->pos += readSize; 413*3117ece4Schristos return hintSize; 414*3117ece4Schristos } 415*3117ece4Schristos #endif 416*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 6) 417*3117ece4Schristos case 6 : 418*3117ece4Schristos { 419*3117ece4Schristos ZBUFFv06_DCtx* dctx = (ZBUFFv06_DCtx*) legacyContext; 420*3117ece4Schristos const void* src = (const char*)input->src + input->pos; 421*3117ece4Schristos size_t readSize = input->size - input->pos; 422*3117ece4Schristos void* dst = (char*)output->dst + output->pos; 423*3117ece4Schristos size_t decodedSize = output->size - output->pos; 424*3117ece4Schristos size_t const hintSize = ZBUFFv06_decompressContinue(dctx, dst, &decodedSize, src, &readSize); 425*3117ece4Schristos output->pos += decodedSize; 426*3117ece4Schristos input->pos += readSize; 427*3117ece4Schristos return hintSize; 428*3117ece4Schristos } 429*3117ece4Schristos #endif 430*3117ece4Schristos #if (ZSTD_LEGACY_SUPPORT <= 7) 431*3117ece4Schristos case 7 : 432*3117ece4Schristos { 433*3117ece4Schristos ZBUFFv07_DCtx* dctx = (ZBUFFv07_DCtx*) legacyContext; 434*3117ece4Schristos const void* src = (const char*)input->src + input->pos; 435*3117ece4Schristos size_t readSize = input->size - input->pos; 436*3117ece4Schristos void* dst = (char*)output->dst + output->pos; 437*3117ece4Schristos size_t decodedSize = output->size - output->pos; 438*3117ece4Schristos size_t const hintSize = ZBUFFv07_decompressContinue(dctx, dst, &decodedSize, src, &readSize); 439*3117ece4Schristos output->pos += decodedSize; 440*3117ece4Schristos input->pos += readSize; 441*3117ece4Schristos return hintSize; 442*3117ece4Schristos } 443*3117ece4Schristos #endif 444*3117ece4Schristos } 445*3117ece4Schristos } 446*3117ece4Schristos 447*3117ece4Schristos 448*3117ece4Schristos #if defined (__cplusplus) 449*3117ece4Schristos } 450*3117ece4Schristos #endif 451*3117ece4Schristos 452*3117ece4Schristos #endif /* ZSTD_LEGACY_H */ 453