Path: blob/main/sys/contrib/zstd/lib/legacy/zstd_legacy.h
48378 views
/*1* Copyright (c) Yann Collet, Facebook, Inc.2* All rights reserved.3*4* This source code is licensed under both the BSD-style license (found in the5* LICENSE file in the root directory of this source tree) and the GPLv2 (found6* in the COPYING file in the root directory of this source tree).7* You may select, at your option, one of the above-listed licenses.8*/910#ifndef ZSTD_LEGACY_H11#define ZSTD_LEGACY_H1213#if defined (__cplusplus)14extern "C" {15#endif1617/* *************************************18* Includes19***************************************/20#include "../common/mem.h" /* MEM_STATIC */21#include "../common/error_private.h" /* ERROR */22#include "../common/zstd_internal.h" /* ZSTD_inBuffer, ZSTD_outBuffer, ZSTD_frameSizeInfo */2324#if !defined (ZSTD_LEGACY_SUPPORT) || (ZSTD_LEGACY_SUPPORT == 0)25# undef ZSTD_LEGACY_SUPPORT26# define ZSTD_LEGACY_SUPPORT 827#endif2829#if (ZSTD_LEGACY_SUPPORT <= 1)30# include "zstd_v01.h"31#endif32#if (ZSTD_LEGACY_SUPPORT <= 2)33# include "zstd_v02.h"34#endif35#if (ZSTD_LEGACY_SUPPORT <= 3)36# include "zstd_v03.h"37#endif38#if (ZSTD_LEGACY_SUPPORT <= 4)39# include "zstd_v04.h"40#endif41#if (ZSTD_LEGACY_SUPPORT <= 5)42# include "zstd_v05.h"43#endif44#if (ZSTD_LEGACY_SUPPORT <= 6)45# include "zstd_v06.h"46#endif47#if (ZSTD_LEGACY_SUPPORT <= 7)48# include "zstd_v07.h"49#endif5051/** ZSTD_isLegacy() :52@return : > 0 if supported by legacy decoder. 0 otherwise.53return value is the version.54*/55MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize)56{57U32 magicNumberLE;58if (srcSize<4) return 0;59magicNumberLE = MEM_readLE32(src);60switch(magicNumberLE)61{62#if (ZSTD_LEGACY_SUPPORT <= 1)63case ZSTDv01_magicNumberLE:return 1;64#endif65#if (ZSTD_LEGACY_SUPPORT <= 2)66case ZSTDv02_magicNumber : return 2;67#endif68#if (ZSTD_LEGACY_SUPPORT <= 3)69case ZSTDv03_magicNumber : return 3;70#endif71#if (ZSTD_LEGACY_SUPPORT <= 4)72case ZSTDv04_magicNumber : return 4;73#endif74#if (ZSTD_LEGACY_SUPPORT <= 5)75case ZSTDv05_MAGICNUMBER : return 5;76#endif77#if (ZSTD_LEGACY_SUPPORT <= 6)78case ZSTDv06_MAGICNUMBER : return 6;79#endif80#if (ZSTD_LEGACY_SUPPORT <= 7)81case ZSTDv07_MAGICNUMBER : return 7;82#endif83default : return 0;84}85}868788MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize)89{90U32 const version = ZSTD_isLegacy(src, srcSize);91if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */92#if (ZSTD_LEGACY_SUPPORT <= 5)93if (version==5) {94ZSTDv05_parameters fParams;95size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize);96if (frResult != 0) return 0;97return fParams.srcSize;98}99#endif100#if (ZSTD_LEGACY_SUPPORT <= 6)101if (version==6) {102ZSTDv06_frameParams fParams;103size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize);104if (frResult != 0) return 0;105return fParams.frameContentSize;106}107#endif108#if (ZSTD_LEGACY_SUPPORT <= 7)109if (version==7) {110ZSTDv07_frameParams fParams;111size_t const frResult = ZSTDv07_getFrameParams(&fParams, src, srcSize);112if (frResult != 0) return 0;113return fParams.frameContentSize;114}115#endif116return 0; /* should not be possible */117}118119120MEM_STATIC size_t ZSTD_decompressLegacy(121void* dst, size_t dstCapacity,122const void* src, size_t compressedSize,123const void* dict,size_t dictSize)124{125U32 const version = ZSTD_isLegacy(src, compressedSize);126(void)dst; (void)dstCapacity; (void)dict; (void)dictSize; /* unused when ZSTD_LEGACY_SUPPORT >= 8 */127switch(version)128{129#if (ZSTD_LEGACY_SUPPORT <= 1)130case 1 :131return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize);132#endif133#if (ZSTD_LEGACY_SUPPORT <= 2)134case 2 :135return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize);136#endif137#if (ZSTD_LEGACY_SUPPORT <= 3)138case 3 :139return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize);140#endif141#if (ZSTD_LEGACY_SUPPORT <= 4)142case 4 :143return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize);144#endif145#if (ZSTD_LEGACY_SUPPORT <= 5)146case 5 :147{ size_t result;148ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx();149if (zd==NULL) return ERROR(memory_allocation);150result = ZSTDv05_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize);151ZSTDv05_freeDCtx(zd);152return result;153}154#endif155#if (ZSTD_LEGACY_SUPPORT <= 6)156case 6 :157{ size_t result;158ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx();159if (zd==NULL) return ERROR(memory_allocation);160result = ZSTDv06_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize);161ZSTDv06_freeDCtx(zd);162return result;163}164#endif165#if (ZSTD_LEGACY_SUPPORT <= 7)166case 7 :167{ size_t result;168ZSTDv07_DCtx* const zd = ZSTDv07_createDCtx();169if (zd==NULL) return ERROR(memory_allocation);170result = ZSTDv07_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize);171ZSTDv07_freeDCtx(zd);172return result;173}174#endif175default :176return ERROR(prefix_unknown);177}178}179180MEM_STATIC ZSTD_frameSizeInfo ZSTD_findFrameSizeInfoLegacy(const void *src, size_t srcSize)181{182ZSTD_frameSizeInfo frameSizeInfo;183U32 const version = ZSTD_isLegacy(src, srcSize);184switch(version)185{186#if (ZSTD_LEGACY_SUPPORT <= 1)187case 1 :188ZSTDv01_findFrameSizeInfoLegacy(src, srcSize,189&frameSizeInfo.compressedSize,190&frameSizeInfo.decompressedBound);191break;192#endif193#if (ZSTD_LEGACY_SUPPORT <= 2)194case 2 :195ZSTDv02_findFrameSizeInfoLegacy(src, srcSize,196&frameSizeInfo.compressedSize,197&frameSizeInfo.decompressedBound);198break;199#endif200#if (ZSTD_LEGACY_SUPPORT <= 3)201case 3 :202ZSTDv03_findFrameSizeInfoLegacy(src, srcSize,203&frameSizeInfo.compressedSize,204&frameSizeInfo.decompressedBound);205break;206#endif207#if (ZSTD_LEGACY_SUPPORT <= 4)208case 4 :209ZSTDv04_findFrameSizeInfoLegacy(src, srcSize,210&frameSizeInfo.compressedSize,211&frameSizeInfo.decompressedBound);212break;213#endif214#if (ZSTD_LEGACY_SUPPORT <= 5)215case 5 :216ZSTDv05_findFrameSizeInfoLegacy(src, srcSize,217&frameSizeInfo.compressedSize,218&frameSizeInfo.decompressedBound);219break;220#endif221#if (ZSTD_LEGACY_SUPPORT <= 6)222case 6 :223ZSTDv06_findFrameSizeInfoLegacy(src, srcSize,224&frameSizeInfo.compressedSize,225&frameSizeInfo.decompressedBound);226break;227#endif228#if (ZSTD_LEGACY_SUPPORT <= 7)229case 7 :230ZSTDv07_findFrameSizeInfoLegacy(src, srcSize,231&frameSizeInfo.compressedSize,232&frameSizeInfo.decompressedBound);233break;234#endif235default :236frameSizeInfo.compressedSize = ERROR(prefix_unknown);237frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR;238break;239}240if (!ZSTD_isError(frameSizeInfo.compressedSize) && frameSizeInfo.compressedSize > srcSize) {241frameSizeInfo.compressedSize = ERROR(srcSize_wrong);242frameSizeInfo.decompressedBound = ZSTD_CONTENTSIZE_ERROR;243}244return frameSizeInfo;245}246247MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src, size_t srcSize)248{249ZSTD_frameSizeInfo frameSizeInfo = ZSTD_findFrameSizeInfoLegacy(src, srcSize);250return frameSizeInfo.compressedSize;251}252253MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version)254{255switch(version)256{257default :258case 1 :259case 2 :260case 3 :261(void)legacyContext;262return ERROR(version_unsupported);263#if (ZSTD_LEGACY_SUPPORT <= 4)264case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext);265#endif266#if (ZSTD_LEGACY_SUPPORT <= 5)267case 5 : return ZBUFFv05_freeDCtx((ZBUFFv05_DCtx*)legacyContext);268#endif269#if (ZSTD_LEGACY_SUPPORT <= 6)270case 6 : return ZBUFFv06_freeDCtx((ZBUFFv06_DCtx*)legacyContext);271#endif272#if (ZSTD_LEGACY_SUPPORT <= 7)273case 7 : return ZBUFFv07_freeDCtx((ZBUFFv07_DCtx*)legacyContext);274#endif275}276}277278279MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U32 newVersion,280const void* dict, size_t dictSize)281{282DEBUGLOG(5, "ZSTD_initLegacyStream for v0.%u", newVersion);283if (prevVersion != newVersion) ZSTD_freeLegacyStreamContext(*legacyContext, prevVersion);284switch(newVersion)285{286default :287case 1 :288case 2 :289case 3 :290(void)dict; (void)dictSize;291return 0;292#if (ZSTD_LEGACY_SUPPORT <= 4)293case 4 :294{295ZBUFFv04_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv04_createDCtx() : (ZBUFFv04_DCtx*)*legacyContext;296if (dctx==NULL) return ERROR(memory_allocation);297ZBUFFv04_decompressInit(dctx);298ZBUFFv04_decompressWithDictionary(dctx, dict, dictSize);299*legacyContext = dctx;300return 0;301}302#endif303#if (ZSTD_LEGACY_SUPPORT <= 5)304case 5 :305{306ZBUFFv05_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv05_createDCtx() : (ZBUFFv05_DCtx*)*legacyContext;307if (dctx==NULL) return ERROR(memory_allocation);308ZBUFFv05_decompressInitDictionary(dctx, dict, dictSize);309*legacyContext = dctx;310return 0;311}312#endif313#if (ZSTD_LEGACY_SUPPORT <= 6)314case 6 :315{316ZBUFFv06_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv06_createDCtx() : (ZBUFFv06_DCtx*)*legacyContext;317if (dctx==NULL) return ERROR(memory_allocation);318ZBUFFv06_decompressInitDictionary(dctx, dict, dictSize);319*legacyContext = dctx;320return 0;321}322#endif323#if (ZSTD_LEGACY_SUPPORT <= 7)324case 7 :325{326ZBUFFv07_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv07_createDCtx() : (ZBUFFv07_DCtx*)*legacyContext;327if (dctx==NULL) return ERROR(memory_allocation);328ZBUFFv07_decompressInitDictionary(dctx, dict, dictSize);329*legacyContext = dctx;330return 0;331}332#endif333}334}335336337338MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,339ZSTD_outBuffer* output, ZSTD_inBuffer* input)340{341DEBUGLOG(5, "ZSTD_decompressLegacyStream for v0.%u", version);342switch(version)343{344default :345case 1 :346case 2 :347case 3 :348(void)legacyContext; (void)output; (void)input;349return ERROR(version_unsupported);350#if (ZSTD_LEGACY_SUPPORT <= 4)351case 4 :352{353ZBUFFv04_DCtx* dctx = (ZBUFFv04_DCtx*) legacyContext;354const void* src = (const char*)input->src + input->pos;355size_t readSize = input->size - input->pos;356void* dst = (char*)output->dst + output->pos;357size_t decodedSize = output->size - output->pos;358size_t const hintSize = ZBUFFv04_decompressContinue(dctx, dst, &decodedSize, src, &readSize);359output->pos += decodedSize;360input->pos += readSize;361return hintSize;362}363#endif364#if (ZSTD_LEGACY_SUPPORT <= 5)365case 5 :366{367ZBUFFv05_DCtx* dctx = (ZBUFFv05_DCtx*) legacyContext;368const void* src = (const char*)input->src + input->pos;369size_t readSize = input->size - input->pos;370void* dst = (char*)output->dst + output->pos;371size_t decodedSize = output->size - output->pos;372size_t const hintSize = ZBUFFv05_decompressContinue(dctx, dst, &decodedSize, src, &readSize);373output->pos += decodedSize;374input->pos += readSize;375return hintSize;376}377#endif378#if (ZSTD_LEGACY_SUPPORT <= 6)379case 6 :380{381ZBUFFv06_DCtx* dctx = (ZBUFFv06_DCtx*) legacyContext;382const void* src = (const char*)input->src + input->pos;383size_t readSize = input->size - input->pos;384void* dst = (char*)output->dst + output->pos;385size_t decodedSize = output->size - output->pos;386size_t const hintSize = ZBUFFv06_decompressContinue(dctx, dst, &decodedSize, src, &readSize);387output->pos += decodedSize;388input->pos += readSize;389return hintSize;390}391#endif392#if (ZSTD_LEGACY_SUPPORT <= 7)393case 7 :394{395ZBUFFv07_DCtx* dctx = (ZBUFFv07_DCtx*) legacyContext;396const void* src = (const char*)input->src + input->pos;397size_t readSize = input->size - input->pos;398void* dst = (char*)output->dst + output->pos;399size_t decodedSize = output->size - output->pos;400size_t const hintSize = ZBUFFv07_decompressContinue(dctx, dst, &decodedSize, src, &readSize);401output->pos += decodedSize;402input->pos += readSize;403return hintSize;404}405#endif406}407}408409410#if defined (__cplusplus)411}412#endif413414#endif /* ZSTD_LEGACY_H */415416417