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