xref: /netbsd-src/external/bsd/zstd/dist/lib/legacy/zstd_legacy.h (revision 3117ece4fc4a4ca4489ba793710b60b0d26bab6c)
1*3117ece4Schristos /*
2*3117ece4Schristos  * Copyright (c) Meta Platforms, Inc. and affiliates.
3*3117ece4Schristos  * All rights reserved.
4*3117ece4Schristos  *
5*3117ece4Schristos  * This source code is licensed under both the BSD-style license (found in the
6*3117ece4Schristos  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*3117ece4Schristos  * in the COPYING file in the root directory of this source tree).
8*3117ece4Schristos  * You may select, at your option, one of the above-listed licenses.
9*3117ece4Schristos  */
10*3117ece4Schristos 
11*3117ece4Schristos #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