Permalink
Showing
with
14,028 additions
and 0 deletions.
- +775 −0 contrib/linux-kernel/include/zstd.h
- +417 −0 contrib/linux-kernel/lib/bitstream.h
- +221 −0 contrib/linux-kernel/lib/entropy_common.c
- +44 −0 contrib/linux-kernel/lib/error_private.c
- +76 −0 contrib/linux-kernel/lib/error_private.h
- +694 −0 contrib/linux-kernel/lib/fse.h
- +857 −0 contrib/linux-kernel/lib/fse_compress.c
- +328 −0 contrib/linux-kernel/lib/fse_decompress.c
- +260 −0 contrib/linux-kernel/lib/huf.h
- +684 −0 contrib/linux-kernel/lib/huf_compress.c
- +888 −0 contrib/linux-kernel/lib/huf_decompress.c
- +374 −0 contrib/linux-kernel/lib/mem.h
- +869 −0 contrib/linux-kernel/lib/xxhash.c
- +305 −0 contrib/linux-kernel/lib/xxhash.h
- +73 −0 contrib/linux-kernel/lib/zstd_common.c
- +3,400 −0 contrib/linux-kernel/lib/zstd_compress.c
- +2,484 −0 contrib/linux-kernel/lib/zstd_decompress.c
- +75 −0 contrib/linux-kernel/lib/zstd_errors.h
- +283 −0 contrib/linux-kernel/lib/zstd_internal.h
- +921 −0 contrib/linux-kernel/lib/zstd_opt.h
| @@ -0,0 +1,221 @@ | ||
| /* | ||
| Common functions of New Generation Entropy library | ||
| Copyright (C) 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 : | ||
| - FSE+HUF source repository : https://github.com/Cyan4973/FiniteStateEntropy | ||
| - Public forum : https://groups.google.com/forum/#!forum/lz4c | ||
| *************************************************************************** */ | ||
|
|
||
| /* ************************************* | ||
| * Dependencies | ||
| ***************************************/ | ||
| #include "mem.h" | ||
| #include "error_private.h" /* ERR_*, ERROR */ | ||
| #define FSE_STATIC_LINKING_ONLY /* FSE_MIN_TABLELOG */ | ||
| #include "fse.h" | ||
| #define HUF_STATIC_LINKING_ONLY /* HUF_TABLELOG_ABSOLUTEMAX */ | ||
| #include "huf.h" | ||
|
|
||
|
|
||
| /*=== Version ===*/ | ||
| unsigned FSE_versionNumber(void) { return FSE_VERSION_NUMBER; } | ||
|
|
||
|
|
||
| /*=== Error Management ===*/ | ||
| unsigned FSE_isError(size_t code) { return ERR_isError(code); } | ||
| const char* FSE_getErrorName(size_t code) { return ERR_getErrorName(code); } | ||
|
|
||
| unsigned HUF_isError(size_t code) { return ERR_isError(code); } | ||
| const char* HUF_getErrorName(size_t code) { return ERR_getErrorName(code); } | ||
|
|
||
|
|
||
| /*-************************************************************** | ||
| * FSE NCount encoding-decoding | ||
| ****************************************************************/ | ||
| size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr, | ||
| const void* headerBuffer, size_t hbSize) | ||
| { | ||
| const BYTE* const istart = (const BYTE*) headerBuffer; | ||
| const BYTE* const iend = istart + hbSize; | ||
| const BYTE* ip = istart; | ||
| int nbBits; | ||
| int remaining; | ||
| int threshold; | ||
| U32 bitStream; | ||
| int bitCount; | ||
| unsigned charnum = 0; | ||
| int previous0 = 0; | ||
|
|
||
| if (hbSize < 4) return ERROR(srcSize_wrong); | ||
| bitStream = MEM_readLE32(ip); | ||
| nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */ | ||
| if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge); | ||
| bitStream >>= 4; | ||
| bitCount = 4; | ||
| *tableLogPtr = nbBits; | ||
| remaining = (1<<nbBits)+1; | ||
| threshold = 1<<nbBits; | ||
| nbBits++; | ||
|
|
||
| while ((remaining>1) & (charnum<=*maxSVPtr)) { | ||
| if (previous0) { | ||
| unsigned n0 = charnum; | ||
| while ((bitStream & 0xFFFF) == 0xFFFF) { | ||
| n0 += 24; | ||
| if (ip < iend-5) { | ||
| ip += 2; | ||
| bitStream = MEM_readLE32(ip) >> bitCount; | ||
| } else { | ||
| bitStream >>= 16; | ||
| bitCount += 16; | ||
| } } | ||
| while ((bitStream & 3) == 3) { | ||
| n0 += 3; | ||
| bitStream >>= 2; | ||
| bitCount += 2; | ||
| } | ||
| n0 += bitStream & 3; | ||
| bitCount += 2; | ||
| if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall); | ||
| while (charnum < n0) normalizedCounter[charnum++] = 0; | ||
| if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { | ||
| ip += bitCount>>3; | ||
| bitCount &= 7; | ||
| bitStream = MEM_readLE32(ip) >> bitCount; | ||
| } else { | ||
| bitStream >>= 2; | ||
| } } | ||
| { int const max = (2*threshold-1) - remaining; | ||
| int count; | ||
|
|
||
| if ((bitStream & (threshold-1)) < (U32)max) { | ||
| count = bitStream & (threshold-1); | ||
| bitCount += nbBits-1; | ||
| } else { | ||
| count = bitStream & (2*threshold-1); | ||
| if (count >= threshold) count -= max; | ||
| bitCount += nbBits; | ||
| } | ||
|
|
||
| count--; /* extra accuracy */ | ||
| remaining -= count < 0 ? -count : count; /* -1 means +1 */ | ||
| normalizedCounter[charnum++] = (short)count; | ||
| previous0 = !count; | ||
| while (remaining < threshold) { | ||
| nbBits--; | ||
| threshold >>= 1; | ||
| } | ||
|
|
||
| if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4)) { | ||
| ip += bitCount>>3; | ||
| bitCount &= 7; | ||
| } else { | ||
| bitCount -= (int)(8 * (iend - 4 - ip)); | ||
| ip = iend - 4; | ||
| } | ||
| bitStream = MEM_readLE32(ip) >> (bitCount & 31); | ||
| } } /* while ((remaining>1) & (charnum<=*maxSVPtr)) */ | ||
| if (remaining != 1) return ERROR(corruption_detected); | ||
| if (bitCount > 32) return ERROR(corruption_detected); | ||
| *maxSVPtr = charnum-1; | ||
|
|
||
| ip += (bitCount+7)>>3; | ||
| return ip-istart; | ||
| } | ||
|
|
||
|
|
||
| /*! HUF_readStats() : | ||
| Read compact Huffman tree, saved by HUF_writeCTable(). | ||
| `huffWeight` is destination buffer. | ||
| `rankStats` is assumed to be a table of at least HUF_TABLELOG_MAX U32. | ||
| @return : size read from `src` , or an error Code . | ||
| Note : Needed by HUF_readCTable() and HUF_readDTableX?() . | ||
| */ | ||
| size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats, | ||
| U32* nbSymbolsPtr, U32* tableLogPtr, | ||
| const void* src, size_t srcSize) | ||
| { | ||
| U32 weightTotal; | ||
| const BYTE* ip = (const BYTE*) src; | ||
| size_t iSize; | ||
| size_t oSize; | ||
|
|
||
| if (!srcSize) return ERROR(srcSize_wrong); | ||
| iSize = ip[0]; | ||
| /* memset(huffWeight, 0, hwSize); *//* is not necessary, even though some analyzer complain ... */ | ||
|
|
||
| if (iSize >= 128) { /* special header */ | ||
| oSize = iSize - 127; | ||
| iSize = ((oSize+1)/2); | ||
| if (iSize+1 > srcSize) return ERROR(srcSize_wrong); | ||
| if (oSize >= hwSize) return ERROR(corruption_detected); | ||
| ip += 1; | ||
| { U32 n; | ||
| for (n=0; n<oSize; n+=2) { | ||
| huffWeight[n] = ip[n/2] >> 4; | ||
| huffWeight[n+1] = ip[n/2] & 15; | ||
| } } } | ||
| else { /* header compressed with FSE (normal case) */ | ||
| FSE_DTable fseWorkspace[FSE_DTABLE_SIZE_U32(6)]; /* 6 is max possible tableLog for HUF header (maybe even 5, to be tested) */ | ||
| if (iSize+1 > srcSize) return ERROR(srcSize_wrong); | ||
| oSize = FSE_decompress_wksp(huffWeight, hwSize-1, ip+1, iSize, fseWorkspace, 6); /* max (hwSize-1) values decoded, as last one is implied */ | ||
| if (FSE_isError(oSize)) return oSize; | ||
| } | ||
|
|
||
| /* collect weight stats */ | ||
| memset(rankStats, 0, (HUF_TABLELOG_MAX + 1) * sizeof(U32)); | ||
| weightTotal = 0; | ||
| { U32 n; for (n=0; n<oSize; n++) { | ||
| if (huffWeight[n] >= HUF_TABLELOG_MAX) return ERROR(corruption_detected); | ||
| rankStats[huffWeight[n]]++; | ||
| weightTotal += (1 << huffWeight[n]) >> 1; | ||
| } } | ||
| if (weightTotal == 0) return ERROR(corruption_detected); | ||
|
|
||
| /* get last non-null symbol weight (implied, total must be 2^n) */ | ||
| { U32 const tableLog = BIT_highbit32(weightTotal) + 1; | ||
| if (tableLog > HUF_TABLELOG_MAX) return ERROR(corruption_detected); | ||
| *tableLogPtr = tableLog; | ||
| /* determine last weight */ | ||
| { U32 const total = 1 << tableLog; | ||
| U32 const rest = total - weightTotal; | ||
| U32 const verif = 1 << BIT_highbit32(rest); | ||
| U32 const lastWeight = BIT_highbit32(rest) + 1; | ||
| if (verif != rest) return ERROR(corruption_detected); /* last value must be a clean power of 2 */ | ||
| huffWeight[oSize] = (BYTE)lastWeight; | ||
| rankStats[lastWeight]++; | ||
| } } | ||
|
|
||
| /* check tree construction validity */ | ||
| if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected); /* by construction : at least 2 elts of rank 1, must be even */ | ||
|
|
||
| /* results */ | ||
| *nbSymbolsPtr = (U32)(oSize+1); | ||
| return iSize+1; | ||
| } |
| @@ -0,0 +1,44 @@ | ||
| /** | ||
| * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. | ||
| * All rights reserved. | ||
| * | ||
| * This source code is licensed under the BSD-style license found in the | ||
| * LICENSE file in the root directory of this source tree. An additional grant | ||
| * of patent rights can be found in the PATENTS file in the same directory. | ||
| */ | ||
|
|
||
| /* The purpose of this file is to have a single list of error strings embedded in binary */ | ||
|
|
||
| #include "error_private.h" | ||
|
|
||
| const char* ERR_getErrorString(ERR_enum code) | ||
| { | ||
| static const char* const notErrorCode = "Unspecified error code"; | ||
| switch( code ) | ||
| { | ||
| case PREFIX(no_error): return "No error detected"; | ||
| case PREFIX(GENERIC): return "Error (generic)"; | ||
| case PREFIX(prefix_unknown): return "Unknown frame descriptor"; | ||
| case PREFIX(version_unsupported): return "Version not supported"; | ||
| case PREFIX(parameter_unknown): return "Unknown parameter type"; | ||
| case PREFIX(frameParameter_unsupported): return "Unsupported frame parameter"; | ||
| case PREFIX(frameParameter_unsupportedBy32bits): return "Frame parameter unsupported in 32-bits mode"; | ||
| case PREFIX(frameParameter_windowTooLarge): return "Frame requires too much memory for decoding"; | ||
| case PREFIX(compressionParameter_unsupported): return "Compression parameter is out of bound"; | ||
| case PREFIX(init_missing): return "Context should be init first"; | ||
| case PREFIX(memory_allocation): return "Allocation error : not enough memory"; | ||
| case PREFIX(stage_wrong): return "Operation not authorized at current processing stage"; | ||
| case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; | ||
| case PREFIX(srcSize_wrong): return "Src size incorrect"; | ||
| case PREFIX(corruption_detected): return "Corrupted block detected"; | ||
| case PREFIX(checksum_wrong): return "Restored data doesn't match checksum"; | ||
| case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; | ||
| case PREFIX(maxSymbolValue_tooLarge): return "Unsupported max Symbol Value : too large"; | ||
| case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small"; | ||
| case PREFIX(dictionary_corrupted): return "Dictionary is corrupted"; | ||
| case PREFIX(dictionary_wrong): return "Dictionary mismatch"; | ||
| case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples"; | ||
| case PREFIX(maxCode): | ||
| default: return notErrorCode; | ||
| } | ||
| } |
| @@ -0,0 +1,76 @@ | ||
| /** | ||
| * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. | ||
| * All rights reserved. | ||
| * | ||
| * This source code is licensed under the BSD-style license found in the | ||
| * LICENSE file in the root directory of this source tree. An additional grant | ||
| * of patent rights can be found in the PATENTS file in the same directory. | ||
| */ | ||
|
|
||
| /* Note : this module is expected to remain private, do not expose it */ | ||
|
|
||
| #ifndef ERROR_H_MODULE | ||
| #define ERROR_H_MODULE | ||
|
|
||
| #if defined (__cplusplus) | ||
| extern "C" { | ||
| #endif | ||
|
|
||
|
|
||
| /* **************************************** | ||
| * Dependencies | ||
| ******************************************/ | ||
| #include <stddef.h> /* size_t */ | ||
| #include "zstd_errors.h" /* enum list */ | ||
|
|
||
|
|
||
| /* **************************************** | ||
| * Compiler-specific | ||
| ******************************************/ | ||
| #if defined(__GNUC__) | ||
| # define ERR_STATIC static __attribute__((unused)) | ||
| #elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) | ||
| # define ERR_STATIC static inline | ||
| #elif defined(_MSC_VER) | ||
| # define ERR_STATIC static __inline | ||
| #else | ||
| # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ | ||
| #endif | ||
|
|
||
|
|
||
| /*-**************************************** | ||
| * Customization (error_public.h) | ||
| ******************************************/ | ||
| typedef ZSTD_ErrorCode ERR_enum; | ||
| #define PREFIX(name) ZSTD_error_##name | ||
|
|
||
|
|
||
| /*-**************************************** | ||
| * Error codes handling | ||
| ******************************************/ | ||
| #ifdef ERROR | ||
| # undef ERROR /* reported already defined on VS 2015 (Rich Geldreich) */ | ||
| #endif | ||
| #define ERROR(name) ((size_t)-PREFIX(name)) | ||
|
|
||
| ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } | ||
|
|
||
| ERR_STATIC ERR_enum ERR_getErrorCode(size_t code) { if (!ERR_isError(code)) return (ERR_enum)0; return (ERR_enum) (0-code); } | ||
|
|
||
|
|
||
| /*-**************************************** | ||
| * Error Strings | ||
| ******************************************/ | ||
|
|
||
| const char* ERR_getErrorString(ERR_enum code); /* error_private.c */ | ||
|
|
||
| ERR_STATIC const char* ERR_getErrorName(size_t code) | ||
| { | ||
| return ERR_getErrorString(ERR_getErrorCode(code)); | ||
| } | ||
|
|
||
| #if defined (__cplusplus) | ||
| } | ||
| #endif | ||
|
|
||
| #endif /* ERROR_H_MODULE */ |
Oops, something went wrong.