141 lines
5.0 KiB
C
141 lines
5.0 KiB
C
/*
|
|
zstd_legacy - decoder for legacy format
|
|
Header File
|
|
Copyright (C) 2015-2016, Yann Collet.
|
|
|
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions are
|
|
met:
|
|
* Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
* Redistributions in binary form must reproduce the above
|
|
copyright notice, this list of conditions and the following disclaimer
|
|
in the documentation and/or other materials provided with the
|
|
distribution.
|
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
You can contact the author at :
|
|
- zstd source repository : https://github.com/Cyan4973/zstd
|
|
- ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
*/
|
|
#ifndef ZSTD_LEGACY_H
|
|
#define ZSTD_LEGACY_H
|
|
|
|
#if defined (__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* *************************************
|
|
* Includes
|
|
***************************************/
|
|
#include "mem.h" /* MEM_STATIC */
|
|
#include "error_private.h" /* ERROR */
|
|
#include "zstd_v01.h"
|
|
#include "zstd_v02.h"
|
|
#include "zstd_v03.h"
|
|
#include "zstd_v04.h"
|
|
#include "zstd_v05.h"
|
|
#include "zstd_v06.h"
|
|
|
|
|
|
/** ZSTD_isLegacy() :
|
|
@return : > 0 if supported by legacy decoder. 0 otherwise.
|
|
return value is the version.
|
|
*/
|
|
MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize)
|
|
{
|
|
U32 magicNumberLE;
|
|
if (srcSize<4) return 0;
|
|
magicNumberLE = MEM_readLE32(src);
|
|
switch(magicNumberLE)
|
|
{
|
|
case ZSTDv01_magicNumberLE:return 1;
|
|
case ZSTDv02_magicNumber : return 2;
|
|
case ZSTDv03_magicNumber : return 3;
|
|
case ZSTDv04_magicNumber : return 4;
|
|
case ZSTDv05_MAGICNUMBER : return 5;
|
|
case ZSTDv06_MAGICNUMBER : return 6;
|
|
default : return 0;
|
|
}
|
|
}
|
|
|
|
|
|
MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, size_t srcSize)
|
|
{
|
|
if (srcSize < 4) return 0;
|
|
|
|
{ U32 const version = ZSTD_isLegacy(src, srcSize);
|
|
if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */
|
|
if (version==5) {
|
|
ZSTDv05_parameters fParams;
|
|
size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize);
|
|
if (frResult != 0) return 0;
|
|
return fParams.srcSize;
|
|
}
|
|
if (version==6) {
|
|
ZSTDv06_frameParams fParams;
|
|
size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize);
|
|
if (frResult != 0) return 0;
|
|
return fParams.frameContentSize;
|
|
}
|
|
return 0; /* should not be possible */
|
|
}
|
|
}
|
|
|
|
MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
void* dst, size_t dstCapacity,
|
|
const void* src, size_t compressedSize,
|
|
const void* dict,size_t dictSize)
|
|
{
|
|
U32 const version = ZSTD_isLegacy(src, compressedSize);
|
|
switch(version)
|
|
{
|
|
case 1 :
|
|
return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize);
|
|
case 2 :
|
|
return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize);
|
|
case 3 :
|
|
return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize);
|
|
case 4 :
|
|
return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize);
|
|
case 5 :
|
|
{ size_t result;
|
|
ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx();
|
|
if (zd==NULL) return ERROR(memory_allocation);
|
|
result = ZSTDv05_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize);
|
|
ZSTDv05_freeDCtx(zd);
|
|
return result;
|
|
}
|
|
case 6 :
|
|
{ size_t result;
|
|
ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx();
|
|
if (zd==NULL) return ERROR(memory_allocation);
|
|
result = ZSTDv06_decompress_usingDict(zd, dst, dstCapacity, src, compressedSize, dict, dictSize);
|
|
ZSTDv06_freeDCtx(zd);
|
|
return result;
|
|
}
|
|
default :
|
|
return ERROR(prefix_unknown);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
#if defined (__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif /* ZSTD_LEGACY_H */
|