extzstd 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/README.md +28 -14
 - data/contrib/zstd/CHANGELOG +114 -56
 - data/contrib/zstd/CONTRIBUTING.md +14 -0
 - data/contrib/zstd/Makefile +37 -31
 - data/contrib/zstd/README.md +6 -0
 - data/contrib/zstd/appveyor.yml +4 -1
 - data/contrib/zstd/lib/Makefile +231 -134
 - data/contrib/zstd/lib/README.md +28 -0
 - data/contrib/zstd/lib/common/bitstream.h +24 -15
 - data/contrib/zstd/lib/common/compiler.h +116 -3
 - data/contrib/zstd/lib/common/cpu.h +0 -2
 - data/contrib/zstd/lib/common/debug.h +11 -18
 - data/contrib/zstd/lib/common/entropy_common.c +188 -42
 - data/contrib/zstd/lib/common/error_private.c +1 -0
 - data/contrib/zstd/lib/common/error_private.h +1 -1
 - data/contrib/zstd/lib/common/fse.h +38 -11
 - data/contrib/zstd/lib/common/fse_decompress.c +123 -16
 - data/contrib/zstd/lib/common/huf.h +26 -5
 - data/contrib/zstd/lib/common/mem.h +66 -93
 - data/contrib/zstd/lib/common/pool.c +22 -16
 - data/contrib/zstd/lib/common/pool.h +1 -1
 - data/contrib/zstd/lib/common/threading.c +6 -5
 - data/contrib/zstd/lib/common/xxhash.c +18 -56
 - data/contrib/zstd/lib/common/xxhash.h +1 -1
 - data/contrib/zstd/lib/common/zstd_common.c +9 -9
 - data/contrib/zstd/lib/common/zstd_deps.h +111 -0
 - data/contrib/zstd/lib/common/zstd_errors.h +1 -0
 - data/contrib/zstd/lib/common/zstd_internal.h +89 -58
 - data/contrib/zstd/lib/compress/fse_compress.c +30 -23
 - data/contrib/zstd/lib/compress/hist.c +26 -28
 - data/contrib/zstd/lib/compress/hist.h +1 -1
 - data/contrib/zstd/lib/compress/huf_compress.c +210 -95
 - data/contrib/zstd/lib/compress/zstd_compress.c +1339 -409
 - data/contrib/zstd/lib/compress/zstd_compress_internal.h +119 -41
 - data/contrib/zstd/lib/compress/zstd_compress_literals.c +4 -4
 - data/contrib/zstd/lib/compress/zstd_compress_sequences.c +17 -3
 - data/contrib/zstd/lib/compress/zstd_compress_superblock.c +23 -19
 - data/contrib/zstd/lib/compress/zstd_cwksp.h +60 -24
 - data/contrib/zstd/lib/compress/zstd_double_fast.c +22 -22
 - data/contrib/zstd/lib/compress/zstd_fast.c +19 -19
 - data/contrib/zstd/lib/compress/zstd_lazy.c +351 -77
 - data/contrib/zstd/lib/compress/zstd_lazy.h +20 -0
 - data/contrib/zstd/lib/compress/zstd_ldm.c +59 -18
 - data/contrib/zstd/lib/compress/zstd_ldm.h +6 -0
 - data/contrib/zstd/lib/compress/zstd_opt.c +190 -45
 - data/contrib/zstd/lib/compress/zstdmt_compress.c +74 -406
 - data/contrib/zstd/lib/compress/zstdmt_compress.h +26 -108
 - data/contrib/zstd/lib/decompress/huf_decompress.c +302 -200
 - data/contrib/zstd/lib/decompress/zstd_ddict.c +8 -8
 - data/contrib/zstd/lib/decompress/zstd_ddict.h +1 -1
 - data/contrib/zstd/lib/decompress/zstd_decompress.c +125 -80
 - data/contrib/zstd/lib/decompress/zstd_decompress_block.c +145 -37
 - data/contrib/zstd/lib/decompress/zstd_decompress_block.h +5 -2
 - data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +11 -10
 - data/contrib/zstd/lib/dictBuilder/cover.c +29 -20
 - data/contrib/zstd/lib/dictBuilder/cover.h +1 -1
 - data/contrib/zstd/lib/dictBuilder/fastcover.c +20 -19
 - data/contrib/zstd/lib/dictBuilder/zdict.c +15 -16
 - data/contrib/zstd/lib/dictBuilder/zdict.h +1 -1
 - data/contrib/zstd/lib/legacy/zstd_v01.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v02.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v03.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v04.c +6 -2
 - data/contrib/zstd/lib/legacy/zstd_v05.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v06.c +5 -1
 - data/contrib/zstd/lib/legacy/zstd_v07.c +5 -1
 - data/contrib/zstd/lib/libzstd.pc.in +3 -3
 - data/contrib/zstd/lib/zstd.h +348 -47
 - data/ext/extzstd.c +6 -0
 - data/ext/extzstd.h +6 -0
 - data/gemstub.rb +3 -21
 - data/lib/extzstd.rb +0 -2
 - data/lib/extzstd/version.rb +6 -1
 - data/test/test_basic.rb +0 -5
 - metadata +5 -4
 
| 
         @@ -77,6 +77,7 @@ typedef enum { 
     | 
|
| 
       77 
77 
     | 
    
         
             
              ZSTD_error_frameIndex_tooLarge = 100,
         
     | 
| 
       78 
78 
     | 
    
         
             
              ZSTD_error_seekableIO          = 102,
         
     | 
| 
       79 
79 
     | 
    
         
             
              ZSTD_error_dstBuffer_wrong     = 104,
         
     | 
| 
      
 80 
     | 
    
         
            +
              ZSTD_error_srcBuffer_wrong     = 105,
         
     | 
| 
       80 
81 
     | 
    
         
             
              ZSTD_error_maxCode = 120  /* never EVER use this value directly, it can change in future versions! Use ZSTD_isError() instead */
         
     | 
| 
       81 
82 
     | 
    
         
             
            } ZSTD_ErrorCode;
         
     | 
| 
       82 
83 
     | 
    
         | 
| 
         @@ -19,7 +19,7 @@ 
     | 
|
| 
       19 
19 
     | 
    
         
             
            /*-*************************************
         
     | 
| 
       20 
20 
     | 
    
         
             
            *  Dependencies
         
     | 
| 
       21 
21 
     | 
    
         
             
            ***************************************/
         
     | 
| 
       22 
     | 
    
         
            -
            # 
     | 
| 
      
 22 
     | 
    
         
            +
            #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
         
     | 
| 
       23 
23 
     | 
    
         
             
            #include <arm_neon.h>
         
     | 
| 
       24 
24 
     | 
    
         
             
            #endif
         
     | 
| 
       25 
25 
     | 
    
         
             
            #include "compiler.h"
         
     | 
| 
         @@ -139,7 +139,7 @@ void _force_has_format_string(const char *format, ...) { 
     | 
|
| 
       139 
139 
     | 
    
         | 
| 
       140 
140 
     | 
    
         
             
            #define ZSTD_REP_NUM      3                 /* number of repcodes */
         
     | 
| 
       141 
141 
     | 
    
         
             
            #define ZSTD_REP_MOVE     (ZSTD_REP_NUM-1)
         
     | 
| 
       142 
     | 
    
         
            -
            static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
         
     | 
| 
      
 142 
     | 
    
         
            +
            static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
         
     | 
| 
       143 
143 
     | 
    
         | 
| 
       144 
144 
     | 
    
         
             
            #define KB *(1 <<10)
         
     | 
| 
       145 
145 
     | 
    
         
             
            #define MB *(1 <<20)
         
     | 
| 
         @@ -153,13 +153,13 @@ static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 }; 
     | 
|
| 
       153 
153 
     | 
    
         
             
            #define BIT0   1
         
     | 
| 
       154 
154 
     | 
    
         | 
| 
       155 
155 
     | 
    
         
             
            #define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
         
     | 
| 
       156 
     | 
    
         
            -
            static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
         
     | 
| 
       157 
     | 
    
         
            -
            static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
         
     | 
| 
      
 156 
     | 
    
         
            +
            static UNUSED_ATTR const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
         
     | 
| 
      
 157 
     | 
    
         
            +
            static UNUSED_ATTR const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
         
     | 
| 
       158 
158 
     | 
    
         | 
| 
       159 
159 
     | 
    
         
             
            #define ZSTD_FRAMEIDSIZE 4   /* magic number size */
         
     | 
| 
       160 
160 
     | 
    
         | 
| 
       161 
161 
     | 
    
         
             
            #define ZSTD_BLOCKHEADERSIZE 3   /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
         
     | 
| 
       162 
     | 
    
         
            -
            static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
         
     | 
| 
      
 162 
     | 
    
         
            +
            static UNUSED_ATTR const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
         
     | 
| 
       163 
163 
     | 
    
         
             
            typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
         
     | 
| 
       164 
164 
     | 
    
         | 
| 
       165 
165 
     | 
    
         
             
            #define ZSTD_FRAMECHECKSUMSIZE 4
         
     | 
| 
         @@ -186,61 +186,75 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy 
     | 
|
| 
       186 
186 
     | 
    
         
             
            #define OffFSELog   8
         
     | 
| 
       187 
187 
     | 
    
         
             
            #define MaxFSELog  MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
         
     | 
| 
       188 
188 
     | 
    
         | 
| 
       189 
     | 
    
         
            -
             
     | 
| 
       190 
     | 
    
         
            -
             
     | 
| 
       191 
     | 
    
         
            -
             
     | 
| 
       192 
     | 
    
         
            -
             
     | 
| 
       193 
     | 
    
         
            -
             
     | 
| 
       194 
     | 
    
         
            -
             
     | 
| 
       195 
     | 
    
         
            -
             
     | 
| 
       196 
     | 
    
         
            -
             
     | 
| 
       197 
     | 
    
         
            -
             
     | 
| 
       198 
     | 
    
         
            -
             
     | 
| 
      
 189 
     | 
    
         
            +
            #define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
         
     | 
| 
      
 190 
     | 
    
         
            +
            /* Each table cannot take more than #symbols * FSELog bits */
         
     | 
| 
      
 191 
     | 
    
         
            +
            #define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8)
         
     | 
| 
      
 192 
     | 
    
         
            +
             
     | 
| 
      
 193 
     | 
    
         
            +
            static UNUSED_ATTR const U32 LL_bits[MaxLL+1] = {
         
     | 
| 
      
 194 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 195 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 196 
     | 
    
         
            +
                 1, 1, 1, 1, 2, 2, 3, 3,
         
     | 
| 
      
 197 
     | 
    
         
            +
                 4, 6, 7, 8, 9,10,11,12,
         
     | 
| 
      
 198 
     | 
    
         
            +
                13,14,15,16
         
     | 
| 
      
 199 
     | 
    
         
            +
            };
         
     | 
| 
      
 200 
     | 
    
         
            +
            static UNUSED_ATTR const S16 LL_defaultNorm[MaxLL+1] = {
         
     | 
| 
      
 201 
     | 
    
         
            +
                 4, 3, 2, 2, 2, 2, 2, 2,
         
     | 
| 
      
 202 
     | 
    
         
            +
                 2, 2, 2, 2, 2, 1, 1, 1,
         
     | 
| 
      
 203 
     | 
    
         
            +
                 2, 2, 2, 2, 2, 2, 2, 2,
         
     | 
| 
      
 204 
     | 
    
         
            +
                 2, 3, 2, 1, 1, 1, 1, 1,
         
     | 
| 
      
 205 
     | 
    
         
            +
                -1,-1,-1,-1
         
     | 
| 
      
 206 
     | 
    
         
            +
            };
         
     | 
| 
       199 
207 
     | 
    
         
             
            #define LL_DEFAULTNORMLOG 6  /* for static allocation */
         
     | 
| 
       200 
     | 
    
         
            -
            static const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
         
     | 
| 
       201 
     | 
    
         
            -
             
     | 
| 
       202 
     | 
    
         
            -
            static const U32 ML_bits[MaxML+1] = { 
     | 
| 
       203 
     | 
    
         
            -
             
     | 
| 
       204 
     | 
    
         
            -
             
     | 
| 
       205 
     | 
    
         
            -
             
     | 
| 
       206 
     | 
    
         
            -
             
     | 
| 
       207 
     | 
    
         
            -
             
     | 
| 
       208 
     | 
    
         
            -
             
     | 
| 
       209 
     | 
    
         
            -
             
     | 
| 
       210 
     | 
    
         
            -
             
     | 
| 
       211 
     | 
    
         
            -
             
     | 
| 
       212 
     | 
    
         
            -
             
     | 
| 
       213 
     | 
    
         
            -
             
     | 
| 
       214 
     | 
    
         
            -
             
     | 
| 
       215 
     | 
    
         
            -
             
     | 
| 
      
 208 
     | 
    
         
            +
            static UNUSED_ATTR const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
         
     | 
| 
      
 209 
     | 
    
         
            +
             
     | 
| 
      
 210 
     | 
    
         
            +
            static UNUSED_ATTR const U32 ML_bits[MaxML+1] = {
         
     | 
| 
      
 211 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 212 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 213 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 214 
     | 
    
         
            +
                 0, 0, 0, 0, 0, 0, 0, 0,
         
     | 
| 
      
 215 
     | 
    
         
            +
                 1, 1, 1, 1, 2, 2, 3, 3,
         
     | 
| 
      
 216 
     | 
    
         
            +
                 4, 4, 5, 7, 8, 9,10,11,
         
     | 
| 
      
 217 
     | 
    
         
            +
                12,13,14,15,16
         
     | 
| 
      
 218 
     | 
    
         
            +
            };
         
     | 
| 
      
 219 
     | 
    
         
            +
            static UNUSED_ATTR const S16 ML_defaultNorm[MaxML+1] = {
         
     | 
| 
      
 220 
     | 
    
         
            +
                 1, 4, 3, 2, 2, 2, 2, 2,
         
     | 
| 
      
 221 
     | 
    
         
            +
                 2, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 222 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 223 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 224 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 225 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1,-1,-1,
         
     | 
| 
      
 226 
     | 
    
         
            +
                -1,-1,-1,-1,-1
         
     | 
| 
      
 227 
     | 
    
         
            +
            };
         
     | 
| 
       216 
228 
     | 
    
         
             
            #define ML_DEFAULTNORMLOG 6  /* for static allocation */
         
     | 
| 
       217 
     | 
    
         
            -
            static const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
         
     | 
| 
       218 
     | 
    
         
            -
             
     | 
| 
       219 
     | 
    
         
            -
            static const S16 OF_defaultNorm[DefaultMaxOff+1] = { 
     | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
       222 
     | 
    
         
            -
             
     | 
| 
      
 229 
     | 
    
         
            +
            static UNUSED_ATTR const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
         
     | 
| 
      
 230 
     | 
    
         
            +
             
     | 
| 
      
 231 
     | 
    
         
            +
            static UNUSED_ATTR const S16 OF_defaultNorm[DefaultMaxOff+1] = {
         
     | 
| 
      
 232 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1, 2, 2,
         
     | 
| 
      
 233 
     | 
    
         
            +
                 2, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 234 
     | 
    
         
            +
                 1, 1, 1, 1, 1, 1, 1, 1,
         
     | 
| 
      
 235 
     | 
    
         
            +
                -1,-1,-1,-1,-1
         
     | 
| 
      
 236 
     | 
    
         
            +
            };
         
     | 
| 
       223 
237 
     | 
    
         
             
            #define OF_DEFAULTNORMLOG 5  /* for static allocation */
         
     | 
| 
       224 
     | 
    
         
            -
            static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
         
     | 
| 
      
 238 
     | 
    
         
            +
            static UNUSED_ATTR const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
         
     | 
| 
       225 
239 
     | 
    
         | 
| 
       226 
240 
     | 
    
         | 
| 
       227 
241 
     | 
    
         
             
            /*-*******************************************
         
     | 
| 
       228 
242 
     | 
    
         
             
            *  Shared functions to include for inlining
         
     | 
| 
       229 
243 
     | 
    
         
             
            *********************************************/
         
     | 
| 
       230 
244 
     | 
    
         
             
            static void ZSTD_copy8(void* dst, const void* src) {
         
     | 
| 
       231 
     | 
    
         
            -
            # 
     | 
| 
      
 245 
     | 
    
         
            +
            #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
         
     | 
| 
       232 
246 
     | 
    
         
             
                vst1_u8((uint8_t*)dst, vld1_u8((const uint8_t*)src));
         
     | 
| 
       233 
247 
     | 
    
         
             
            #else
         
     | 
| 
       234 
     | 
    
         
            -
                 
     | 
| 
      
 248 
     | 
    
         
            +
                ZSTD_memcpy(dst, src, 8);
         
     | 
| 
       235 
249 
     | 
    
         
             
            #endif
         
     | 
| 
       236 
250 
     | 
    
         
             
            }
         
     | 
| 
       237 
251 
     | 
    
         | 
| 
       238 
252 
     | 
    
         
             
            #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
         
     | 
| 
       239 
253 
     | 
    
         
             
            static void ZSTD_copy16(void* dst, const void* src) {
         
     | 
| 
       240 
     | 
    
         
            -
            # 
     | 
| 
      
 254 
     | 
    
         
            +
            #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
         
     | 
| 
       241 
255 
     | 
    
         
             
                vst1q_u8((uint8_t*)dst, vld1q_u8((const uint8_t*)src));
         
     | 
| 
       242 
256 
     | 
    
         
             
            #else
         
     | 
| 
       243 
     | 
    
         
            -
                 
     | 
| 
      
 257 
     | 
    
         
            +
                ZSTD_memcpy(dst, src, 16);
         
     | 
| 
       244 
258 
     | 
    
         
             
            #endif
         
     | 
| 
       245 
259 
     | 
    
         
             
            }
         
     | 
| 
       246 
260 
     | 
    
         
             
            #define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
         
     | 
| 
         @@ -255,13 +269,13 @@ typedef enum { 
     | 
|
| 
       255 
269 
     | 
    
         
             
            } ZSTD_overlap_e;
         
     | 
| 
       256 
270 
     | 
    
         | 
| 
       257 
271 
     | 
    
         
             
            /*! ZSTD_wildcopy() :
         
     | 
| 
       258 
     | 
    
         
            -
             *  Custom version of  
     | 
| 
      
 272 
     | 
    
         
            +
             *  Custom version of ZSTD_memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0)
         
     | 
| 
       259 
273 
     | 
    
         
             
             *  @param ovtype controls the overlap detection
         
     | 
| 
       260 
274 
     | 
    
         
             
             *         - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart.
         
     | 
| 
       261 
275 
     | 
    
         
             
             *         - ZSTD_overlap_src_before_dst: The src and dst may overlap, but they MUST be at least 8 bytes apart.
         
     | 
| 
       262 
276 
     | 
    
         
             
             *           The src buffer must be before the dst buffer.
         
     | 
| 
       263 
277 
     | 
    
         
             
             */
         
     | 
| 
       264 
     | 
    
         
            -
            MEM_STATIC FORCE_INLINE_ATTR 
     | 
| 
      
 278 
     | 
    
         
            +
            MEM_STATIC FORCE_INLINE_ATTR
         
     | 
| 
       265 
279 
     | 
    
         
             
            void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e const ovtype)
         
     | 
| 
       266 
280 
     | 
    
         
             
            {
         
     | 
| 
       267 
281 
     | 
    
         
             
                ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
         
     | 
| 
         @@ -284,14 +298,16 @@ void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e 
     | 
|
| 
       284 
298 
     | 
    
         
             
                     * one COPY16() in the first call. Then, do two calls per loop since
         
     | 
| 
       285 
299 
     | 
    
         
             
                     * at that point it is more likely to have a high trip count.
         
     | 
| 
       286 
300 
     | 
    
         
             
                     */
         
     | 
| 
       287 
     | 
    
         
            -
            # 
     | 
| 
      
 301 
     | 
    
         
            +
            #ifdef __aarch64__
         
     | 
| 
       288 
302 
     | 
    
         
             
                    do {
         
     | 
| 
       289 
303 
     | 
    
         
             
                        COPY16(op, ip);
         
     | 
| 
       290 
304 
     | 
    
         
             
                    }
         
     | 
| 
       291 
305 
     | 
    
         
             
                    while (op < oend);
         
     | 
| 
       292 
306 
     | 
    
         
             
            #else
         
     | 
| 
       293 
     | 
    
         
            -
                     
     | 
| 
       294 
     | 
    
         
            -
                    if ( 
     | 
| 
      
 307 
     | 
    
         
            +
                    ZSTD_copy16(op, ip);
         
     | 
| 
      
 308 
     | 
    
         
            +
                    if (16 >= length) return;
         
     | 
| 
      
 309 
     | 
    
         
            +
                    op += 16;
         
     | 
| 
      
 310 
     | 
    
         
            +
                    ip += 16;
         
     | 
| 
       295 
311 
     | 
    
         
             
                    do {
         
     | 
| 
       296 
312 
     | 
    
         
             
                        COPY16(op, ip);
         
     | 
| 
       297 
313 
     | 
    
         
             
                        COPY16(op, ip);
         
     | 
| 
         @@ -305,7 +321,7 @@ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, 
     | 
|
| 
       305 
321 
     | 
    
         
             
            {
         
     | 
| 
       306 
322 
     | 
    
         
             
                size_t const length = MIN(dstCapacity, srcSize);
         
     | 
| 
       307 
323 
     | 
    
         
             
                if (length > 0) {
         
     | 
| 
       308 
     | 
    
         
            -
                     
     | 
| 
      
 324 
     | 
    
         
            +
                    ZSTD_memcpy(dst, src, length);
         
     | 
| 
       309 
325 
     | 
    
         
             
                }
         
     | 
| 
       310 
326 
     | 
    
         
             
                return length;
         
     | 
| 
       311 
327 
     | 
    
         
             
            }
         
     | 
| 
         @@ -320,28 +336,39 @@ MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, 
     | 
|
| 
       320 
336 
     | 
    
         
             
             * In which case, resize it down to free some memory */
         
     | 
| 
       321 
337 
     | 
    
         
             
            #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128
         
     | 
| 
       322 
338 
     | 
    
         | 
| 
      
 339 
     | 
    
         
            +
            /* Controls whether the input/output buffer is buffered or stable. */
         
     | 
| 
      
 340 
     | 
    
         
            +
            typedef enum {
         
     | 
| 
      
 341 
     | 
    
         
            +
                ZSTD_bm_buffered = 0,  /* Buffer the input/output */
         
     | 
| 
      
 342 
     | 
    
         
            +
                ZSTD_bm_stable = 1     /* ZSTD_inBuffer/ZSTD_outBuffer is stable */
         
     | 
| 
      
 343 
     | 
    
         
            +
            } ZSTD_bufferMode_e;
         
     | 
| 
      
 344 
     | 
    
         
            +
             
     | 
| 
       323 
345 
     | 
    
         | 
| 
       324 
346 
     | 
    
         
             
            /*-*******************************************
         
     | 
| 
       325 
347 
     | 
    
         
             
            *  Private declarations
         
     | 
| 
       326 
348 
     | 
    
         
             
            *********************************************/
         
     | 
| 
       327 
349 
     | 
    
         
             
            typedef struct seqDef_s {
         
     | 
| 
       328 
     | 
    
         
            -
                U32 offset;
         
     | 
| 
      
 350 
     | 
    
         
            +
                U32 offset;         /* Offset code of the sequence */
         
     | 
| 
       329 
351 
     | 
    
         
             
                U16 litLength;
         
     | 
| 
       330 
352 
     | 
    
         
             
                U16 matchLength;
         
     | 
| 
       331 
353 
     | 
    
         
             
            } seqDef;
         
     | 
| 
       332 
354 
     | 
    
         | 
| 
       333 
355 
     | 
    
         
             
            typedef struct {
         
     | 
| 
       334 
356 
     | 
    
         
             
                seqDef* sequencesStart;
         
     | 
| 
       335 
     | 
    
         
            -
                seqDef* sequences;
         
     | 
| 
      
 357 
     | 
    
         
            +
                seqDef* sequences;      /* ptr to end of sequences */
         
     | 
| 
       336 
358 
     | 
    
         
             
                BYTE* litStart;
         
     | 
| 
       337 
     | 
    
         
            -
                BYTE* lit;
         
     | 
| 
      
 359 
     | 
    
         
            +
                BYTE* lit;              /* ptr to end of literals */
         
     | 
| 
       338 
360 
     | 
    
         
             
                BYTE* llCode;
         
     | 
| 
       339 
361 
     | 
    
         
             
                BYTE* mlCode;
         
     | 
| 
       340 
362 
     | 
    
         
             
                BYTE* ofCode;
         
     | 
| 
       341 
363 
     | 
    
         
             
                size_t maxNbSeq;
         
     | 
| 
       342 
364 
     | 
    
         
             
                size_t maxNbLit;
         
     | 
| 
       343 
     | 
    
         
            -
             
     | 
| 
       344 
     | 
    
         
            -
                 
     | 
| 
      
 365 
     | 
    
         
            +
             
     | 
| 
      
 366 
     | 
    
         
            +
                /* longLengthPos and longLengthID to allow us to represent either a single litLength or matchLength
         
     | 
| 
      
 367 
     | 
    
         
            +
                 * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
         
     | 
| 
      
 368 
     | 
    
         
            +
                 * the existing value of the litLength or matchLength by 0x10000. 
         
     | 
| 
      
 369 
     | 
    
         
            +
                 */
         
     | 
| 
      
 370 
     | 
    
         
            +
                U32   longLengthID;   /* 0 == no longLength; 1 == Represent the long literal; 2 == Represent the long match; */
         
     | 
| 
      
 371 
     | 
    
         
            +
                U32   longLengthPos;  /* Index of the sequence to apply long length modification to */
         
     | 
| 
       345 
372 
     | 
    
         
             
            } seqStore_t;
         
     | 
| 
       346 
373 
     | 
    
         | 
| 
       347 
374 
     | 
    
         
             
            typedef struct {
         
     | 
| 
         @@ -384,9 +411,9 @@ const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx);   /* compress & dictBu 
     | 
|
| 
       384 
411 
     | 
    
         
             
            void ZSTD_seqToCodes(const seqStore_t* seqStorePtr);   /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
         
     | 
| 
       385 
412 
     | 
    
         | 
| 
       386 
413 
     | 
    
         
             
            /* custom memory allocation functions */
         
     | 
| 
       387 
     | 
    
         
            -
            void*  
     | 
| 
       388 
     | 
    
         
            -
            void*  
     | 
| 
       389 
     | 
    
         
            -
            void  
     | 
| 
      
 414 
     | 
    
         
            +
            void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem);
         
     | 
| 
      
 415 
     | 
    
         
            +
            void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem);
         
     | 
| 
      
 416 
     | 
    
         
            +
            void ZSTD_customFree(void* ptr, ZSTD_customMem customMem);
         
     | 
| 
       390 
417 
     | 
    
         | 
| 
       391 
418 
     | 
    
         | 
| 
       392 
419 
     | 
    
         
             
            MEM_STATIC U32 ZSTD_highbit32(U32 val)   /* compress, dictBuilder, decodeCorpus */
         
     | 
| 
         @@ -394,8 +421,12 @@ MEM_STATIC U32 ZSTD_highbit32(U32 val)   /* compress, dictBuilder, decodeCorpus 
     | 
|
| 
       394 
421 
     | 
    
         
             
                assert(val != 0);
         
     | 
| 
       395 
422 
     | 
    
         
             
                {
         
     | 
| 
       396 
423 
     | 
    
         
             
            #   if defined(_MSC_VER)   /* Visual */
         
     | 
| 
       397 
     | 
    
         
            -
             
     | 
| 
       398 
     | 
    
         
            -
             
     | 
| 
      
 424 
     | 
    
         
            +
            #       if STATIC_BMI2 == 1
         
     | 
| 
      
 425 
     | 
    
         
            +
                        return _lzcnt_u32(val)^31;
         
     | 
| 
      
 426 
     | 
    
         
            +
            #       else
         
     | 
| 
      
 427 
     | 
    
         
            +
                        unsigned long r=0;
         
     | 
| 
      
 428 
     | 
    
         
            +
                        return _BitScanReverse(&r, val) ? (unsigned)r : 0;
         
     | 
| 
      
 429 
     | 
    
         
            +
            #       endif
         
     | 
| 
       399 
430 
     | 
    
         
             
            #   elif defined(__GNUC__) && (__GNUC__ >= 3)   /* GCC Intrinsic */
         
     | 
| 
       400 
431 
     | 
    
         
             
                    return __builtin_clz (val) ^ 31;
         
     | 
| 
       401 
432 
     | 
    
         
             
            #   elif defined(__ICCARM__)    /* IAR Intrinsic */
         
     | 
| 
         @@ -15,8 +15,6 @@ 
     | 
|
| 
       15 
15 
     | 
    
         
             
            /* **************************************************************
         
     | 
| 
       16 
16 
     | 
    
         
             
            *  Includes
         
     | 
| 
       17 
17 
     | 
    
         
             
            ****************************************************************/
         
     | 
| 
       18 
     | 
    
         
            -
            #include <stdlib.h>     /* malloc, free, qsort */
         
     | 
| 
       19 
     | 
    
         
            -
            #include <string.h>     /* memcpy, memset */
         
     | 
| 
       20 
18 
     | 
    
         
             
            #include "../common/compiler.h"
         
     | 
| 
       21 
19 
     | 
    
         
             
            #include "../common/mem.h"        /* U32, U16, etc. */
         
     | 
| 
       22 
20 
     | 
    
         
             
            #include "../common/debug.h"      /* assert, DEBUGLOG */
         
     | 
| 
         @@ -25,6 +23,9 @@ 
     | 
|
| 
       25 
23 
     | 
    
         
             
            #define FSE_STATIC_LINKING_ONLY
         
     | 
| 
       26 
24 
     | 
    
         
             
            #include "../common/fse.h"
         
     | 
| 
       27 
25 
     | 
    
         
             
            #include "../common/error_private.h"
         
     | 
| 
      
 26 
     | 
    
         
            +
            #define ZSTD_DEPS_NEED_MALLOC
         
     | 
| 
      
 27 
     | 
    
         
            +
            #define ZSTD_DEPS_NEED_MATH64
         
     | 
| 
      
 28 
     | 
    
         
            +
            #include "../common/zstd_deps.h"  /* ZSTD_malloc, ZSTD_free, ZSTD_memcpy, ZSTD_memset */
         
     | 
| 
       28 
29 
     | 
    
         | 
| 
       29 
30 
     | 
    
         | 
| 
       30 
31 
     | 
    
         
             
            /* **************************************************************
         
     | 
| 
         @@ -74,13 +75,15 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, 
     | 
|
| 
       74 
75 
     | 
    
         
             
                void* const FSCT = ((U32*)ptr) + 1 /* header */ + (tableLog ? tableSize>>1 : 1) ;
         
     | 
| 
       75 
76 
     | 
    
         
             
                FSE_symbolCompressionTransform* const symbolTT = (FSE_symbolCompressionTransform*) (FSCT);
         
     | 
| 
       76 
77 
     | 
    
         
             
                U32 const step = FSE_TABLESTEP(tableSize);
         
     | 
| 
       77 
     | 
    
         
            -
                U32 cumul[FSE_MAX_SYMBOL_VALUE+2];
         
     | 
| 
       78 
78 
     | 
    
         | 
| 
       79 
     | 
    
         
            -
                 
     | 
| 
      
 79 
     | 
    
         
            +
                U32* cumul = (U32*)workSpace;
         
     | 
| 
      
 80 
     | 
    
         
            +
                FSE_FUNCTION_TYPE* tableSymbol = (FSE_FUNCTION_TYPE*)(cumul + (maxSymbolValue + 2));
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
       80 
82 
     | 
    
         
             
                U32 highThreshold = tableSize-1;
         
     | 
| 
       81 
83 
     | 
    
         | 
| 
      
 84 
     | 
    
         
            +
                if ((size_t)workSpace & 3) return ERROR(GENERIC); /* Must be 4 byte aligned */
         
     | 
| 
      
 85 
     | 
    
         
            +
                if (FSE_BUILD_CTABLE_WORKSPACE_SIZE(maxSymbolValue, tableLog) > wkspSize) return ERROR(tableLog_tooLarge);
         
     | 
| 
       82 
86 
     | 
    
         
             
                /* CTable header */
         
     | 
| 
       83 
     | 
    
         
            -
                if (((size_t)1 << tableLog) * sizeof(FSE_FUNCTION_TYPE) > wkspSize) return ERROR(tableLog_tooLarge);
         
     | 
| 
       84 
87 
     | 
    
         
             
                tableU16[-2] = (U16) tableLog;
         
     | 
| 
       85 
88 
     | 
    
         
             
                tableU16[-1] = (U16) maxSymbolValue;
         
     | 
| 
       86 
89 
     | 
    
         
             
                assert(tableLog < 16);   /* required for threshold strategy to work */
         
     | 
| 
         @@ -89,7 +92,7 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, 
     | 
|
| 
       89 
92 
     | 
    
         
             
                 * http://fastcompression.blogspot.fr/2014/02/fse-distributing-symbol-values.html */
         
     | 
| 
       90 
93 
     | 
    
         | 
| 
       91 
94 
     | 
    
         
             
                 #ifdef __clang_analyzer__
         
     | 
| 
       92 
     | 
    
         
            -
                  
     | 
| 
      
 95 
     | 
    
         
            +
                 ZSTD_memset(tableSymbol, 0, sizeof(*tableSymbol) * tableSize);   /* useless initialization, just to keep scan-build happy */
         
     | 
| 
       93 
96 
     | 
    
         
             
                 #endif
         
     | 
| 
       94 
97 
     | 
    
         | 
| 
       95 
98 
     | 
    
         
             
                /* symbol start positions */
         
     | 
| 
         @@ -168,12 +171,13 @@ size_t FSE_buildCTable_wksp(FSE_CTable* ct, 
     | 
|
| 
       168 
171 
     | 
    
         
             
                return 0;
         
     | 
| 
       169 
172 
     | 
    
         
             
            }
         
     | 
| 
       170 
173 
     | 
    
         | 
| 
       171 
     | 
    
         
            -
             
     | 
| 
      
 174 
     | 
    
         
            +
            #ifndef ZSTD_NO_UNUSED_FUNCTIONS
         
     | 
| 
       172 
175 
     | 
    
         
             
            size_t FSE_buildCTable(FSE_CTable* ct, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
         
     | 
| 
       173 
176 
     | 
    
         
             
            {
         
     | 
| 
       174 
177 
     | 
    
         
             
                FSE_FUNCTION_TYPE tableSymbol[FSE_MAX_TABLESIZE];   /* memset() is not necessary, even if static analyzer complain about it */
         
     | 
| 
       175 
178 
     | 
    
         
             
                return FSE_buildCTable_wksp(ct, normalizedCounter, maxSymbolValue, tableLog, tableSymbol, sizeof(tableSymbol));
         
     | 
| 
       176 
179 
     | 
    
         
             
            }
         
     | 
| 
      
 180 
     | 
    
         
            +
            #endif
         
     | 
| 
       177 
181 
     | 
    
         | 
| 
       178 
182 
     | 
    
         | 
| 
       179 
183 
     | 
    
         | 
| 
         @@ -307,10 +311,10 @@ FSE_CTable* FSE_createCTable (unsigned maxSymbolValue, unsigned tableLog) 
     | 
|
| 
       307 
311 
     | 
    
         
             
                size_t size;
         
     | 
| 
       308 
312 
     | 
    
         
             
                if (tableLog > FSE_TABLELOG_ABSOLUTE_MAX) tableLog = FSE_TABLELOG_ABSOLUTE_MAX;
         
     | 
| 
       309 
313 
     | 
    
         
             
                size = FSE_CTABLE_SIZE_U32 (tableLog, maxSymbolValue) * sizeof(U32);
         
     | 
| 
       310 
     | 
    
         
            -
                return (FSE_CTable*) 
     | 
| 
      
 314 
     | 
    
         
            +
                return (FSE_CTable*)ZSTD_malloc(size);
         
     | 
| 
       311 
315 
     | 
    
         
             
            }
         
     | 
| 
       312 
316 
     | 
    
         | 
| 
       313 
     | 
    
         
            -
            void FSE_freeCTable (FSE_CTable* ct) {  
     | 
| 
      
 317 
     | 
    
         
            +
            void FSE_freeCTable (FSE_CTable* ct) { ZSTD_free(ct); }
         
     | 
| 
       314 
318 
     | 
    
         | 
| 
       315 
319 
     | 
    
         
             
            /* provides the minimum logSize to safely represent a distribution */
         
     | 
| 
       316 
320 
     | 
    
         
             
            static unsigned FSE_minTableLog(size_t srcSize, unsigned maxSymbolValue)
         
     | 
| 
         @@ -341,11 +345,10 @@ unsigned FSE_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxS 
     | 
|
| 
       341 
345 
     | 
    
         
             
                return FSE_optimalTableLog_internal(maxTableLog, srcSize, maxSymbolValue, 2);
         
     | 
| 
       342 
346 
     | 
    
         
             
            }
         
     | 
| 
       343 
347 
     | 
    
         | 
| 
       344 
     | 
    
         
            -
             
     | 
| 
       345 
348 
     | 
    
         
             
            /* Secondary normalization method.
         
     | 
| 
       346 
349 
     | 
    
         
             
               To be used when primary method fails. */
         
     | 
| 
       347 
350 
     | 
    
         | 
| 
       348 
     | 
    
         
            -
            static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, size_t total, U32 maxSymbolValue)
         
     | 
| 
      
 351 
     | 
    
         
            +
            static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, size_t total, U32 maxSymbolValue, short lowProbCount)
         
     | 
| 
       349 
352 
     | 
    
         
             
            {
         
     | 
| 
       350 
353 
     | 
    
         
             
                short const NOT_YET_ASSIGNED = -2;
         
     | 
| 
       351 
354 
     | 
    
         
             
                U32 s;
         
     | 
| 
         @@ -362,7 +365,7 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, 
     | 
|
| 
       362 
365 
     | 
    
         
             
                        continue;
         
     | 
| 
       363 
366 
     | 
    
         
             
                    }
         
     | 
| 
       364 
367 
     | 
    
         
             
                    if (count[s] <= lowThreshold) {
         
     | 
| 
       365 
     | 
    
         
            -
                        norm[s] =  
     | 
| 
      
 368 
     | 
    
         
            +
                        norm[s] = lowProbCount;
         
     | 
| 
       366 
369 
     | 
    
         
             
                        distributed++;
         
     | 
| 
       367 
370 
     | 
    
         
             
                        total -= count[s];
         
     | 
| 
       368 
371 
     | 
    
         
             
                        continue;
         
     | 
| 
         @@ -414,7 +417,7 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, 
     | 
|
| 
       414 
417 
     | 
    
         | 
| 
       415 
418 
     | 
    
         
             
                {   U64 const vStepLog = 62 - tableLog;
         
     | 
| 
       416 
419 
     | 
    
         
             
                    U64 const mid = (1ULL << (vStepLog-1)) - 1;
         
     | 
| 
       417 
     | 
    
         
            -
                    U64 const rStep = ((((U64)1<<vStepLog) * ToDistribute) + mid) 
     | 
| 
      
 420 
     | 
    
         
            +
                    U64 const rStep = ZSTD_div64((((U64)1<<vStepLog) * ToDistribute) + mid, (U32)total);   /* scale on remaining */
         
     | 
| 
       418 
421 
     | 
    
         
             
                    U64 tmpTotal = mid;
         
     | 
| 
       419 
422 
     | 
    
         
             
                    for (s=0; s<=maxSymbolValue; s++) {
         
     | 
| 
       420 
423 
     | 
    
         
             
                        if (norm[s]==NOT_YET_ASSIGNED) {
         
     | 
| 
         @@ -431,10 +434,9 @@ static size_t FSE_normalizeM2(short* norm, U32 tableLog, const unsigned* count, 
     | 
|
| 
       431 
434 
     | 
    
         
             
                return 0;
         
     | 
| 
       432 
435 
     | 
    
         
             
            }
         
     | 
| 
       433 
436 
     | 
    
         | 
| 
       434 
     | 
    
         
            -
             
     | 
| 
       435 
437 
     | 
    
         
             
            size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog,
         
     | 
| 
       436 
438 
     | 
    
         
             
                                       const unsigned* count, size_t total,
         
     | 
| 
       437 
     | 
    
         
            -
                                       unsigned maxSymbolValue)
         
     | 
| 
      
 439 
     | 
    
         
            +
                                       unsigned maxSymbolValue, unsigned useLowProbCount)
         
     | 
| 
       438 
440 
     | 
    
         
             
            {
         
     | 
| 
       439 
441 
     | 
    
         
             
                /* Sanity checks */
         
     | 
| 
       440 
442 
     | 
    
         
             
                if (tableLog==0) tableLog = FSE_DEFAULT_TABLELOG;
         
     | 
| 
         @@ -443,8 +445,9 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog, 
     | 
|
| 
       443 
445 
     | 
    
         
             
                if (tableLog < FSE_minTableLog(total, maxSymbolValue)) return ERROR(GENERIC);   /* Too small tableLog, compression potentially impossible */
         
     | 
| 
       444 
446 
     | 
    
         | 
| 
       445 
447 
     | 
    
         
             
                {   static U32 const rtbTable[] = {     0, 473195, 504333, 520860, 550000, 700000, 750000, 830000 };
         
     | 
| 
      
 448 
     | 
    
         
            +
                    short const lowProbCount = useLowProbCount ? -1 : 1;
         
     | 
| 
       446 
449 
     | 
    
         
             
                    U64 const scale = 62 - tableLog;
         
     | 
| 
       447 
     | 
    
         
            -
                    U64 const step = ((U64)1<<62) 
     | 
| 
      
 450 
     | 
    
         
            +
                    U64 const step = ZSTD_div64((U64)1<<62, (U32)total);   /* <== here, one division ! */
         
     | 
| 
       448 
451 
     | 
    
         
             
                    U64 const vStep = 1ULL<<(scale-20);
         
     | 
| 
       449 
452 
     | 
    
         
             
                    int stillToDistribute = 1<<tableLog;
         
     | 
| 
       450 
453 
     | 
    
         
             
                    unsigned s;
         
     | 
| 
         @@ -456,7 +459,7 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog, 
     | 
|
| 
       456 
459 
     | 
    
         
             
                        if (count[s] == total) return 0;   /* rle special case */
         
     | 
| 
       457 
460 
     | 
    
         
             
                        if (count[s] == 0) { normalizedCounter[s]=0; continue; }
         
     | 
| 
       458 
461 
     | 
    
         
             
                        if (count[s] <= lowThreshold) {
         
     | 
| 
       459 
     | 
    
         
            -
                            normalizedCounter[s] =  
     | 
| 
      
 462 
     | 
    
         
            +
                            normalizedCounter[s] = lowProbCount;
         
     | 
| 
       460 
463 
     | 
    
         
             
                            stillToDistribute--;
         
     | 
| 
       461 
464 
     | 
    
         
             
                        } else {
         
     | 
| 
       462 
465 
     | 
    
         
             
                            short proba = (short)((count[s]*step) >> scale);
         
     | 
| 
         @@ -470,7 +473,7 @@ size_t FSE_normalizeCount (short* normalizedCounter, unsigned tableLog, 
     | 
|
| 
       470 
473 
     | 
    
         
             
                    }   }
         
     | 
| 
       471 
474 
     | 
    
         
             
                    if (-stillToDistribute >= (normalizedCounter[largest] >> 1)) {
         
     | 
| 
       472 
475 
     | 
    
         
             
                        /* corner case, need another normalization method */
         
     | 
| 
       473 
     | 
    
         
            -
                        size_t const errorCode = FSE_normalizeM2(normalizedCounter, tableLog, count, total, maxSymbolValue);
         
     | 
| 
      
 476 
     | 
    
         
            +
                        size_t const errorCode = FSE_normalizeM2(normalizedCounter, tableLog, count, total, maxSymbolValue, lowProbCount);
         
     | 
| 
       474 
477 
     | 
    
         
             
                        if (FSE_isError(errorCode)) return errorCode;
         
     | 
| 
       475 
478 
     | 
    
         
             
                    }
         
     | 
| 
       476 
479 
     | 
    
         
             
                    else normalizedCounter[largest] += (short)stillToDistribute;
         
     | 
| 
         @@ -625,6 +628,7 @@ size_t FSE_compress_usingCTable (void* dst, size_t dstSize, 
     | 
|
| 
       625 
628 
     | 
    
         | 
| 
       626 
629 
     | 
    
         
             
            size_t FSE_compressBound(size_t size) { return FSE_COMPRESSBOUND(size); }
         
     | 
| 
       627 
630 
     | 
    
         | 
| 
      
 631 
     | 
    
         
            +
            #ifndef ZSTD_NO_UNUSED_FUNCTIONS
         
     | 
| 
       628 
632 
     | 
    
         
             
            /* FSE_compress_wksp() :
         
     | 
| 
       629 
633 
     | 
    
         
             
             * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
         
     | 
| 
       630 
634 
     | 
    
         
             
             * `wkspSize` size must be `(1<<tableLog)`.
         
     | 
| 
         @@ -643,7 +647,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src 
     | 
|
| 
       643 
647 
     | 
    
         
             
                size_t const scratchBufferSize = wkspSize - (CTableSize * sizeof(FSE_CTable));
         
     | 
| 
       644 
648 
     | 
    
         | 
| 
       645 
649 
     | 
    
         
             
                /* init conditions */
         
     | 
| 
       646 
     | 
    
         
            -
                if (wkspSize <  
     | 
| 
      
 650 
     | 
    
         
            +
                if (wkspSize < FSE_COMPRESS_WKSP_SIZE_U32(tableLog, maxSymbolValue)) return ERROR(tableLog_tooLarge);
         
     | 
| 
       647 
651 
     | 
    
         
             
                if (srcSize <= 1) return 0;  /* Not compressible */
         
     | 
| 
       648 
652 
     | 
    
         
             
                if (!maxSymbolValue) maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
         
     | 
| 
       649 
653 
     | 
    
         
             
                if (!tableLog) tableLog = FSE_DEFAULT_TABLELOG;
         
     | 
| 
         @@ -656,7 +660,7 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src 
     | 
|
| 
       656 
660 
     | 
    
         
             
                }
         
     | 
| 
       657 
661 
     | 
    
         | 
| 
       658 
662 
     | 
    
         
             
                tableLog = FSE_optimalTableLog(tableLog, srcSize, maxSymbolValue);
         
     | 
| 
       659 
     | 
    
         
            -
                CHECK_F( FSE_normalizeCount(norm, tableLog, count, srcSize, maxSymbolValue) );
         
     | 
| 
      
 663 
     | 
    
         
            +
                CHECK_F( FSE_normalizeCount(norm, tableLog, count, srcSize, maxSymbolValue, /* useLowProbCount */ srcSize >= 2048) );
         
     | 
| 
       660 
664 
     | 
    
         | 
| 
       661 
665 
     | 
    
         
             
                /* Write table description header */
         
     | 
| 
       662 
666 
     | 
    
         
             
                {   CHECK_V_F(nc_err, FSE_writeNCount(op, oend-op, norm, maxSymbolValue, tableLog) );
         
     | 
| 
         @@ -678,13 +682,16 @@ size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t src 
     | 
|
| 
       678 
682 
     | 
    
         | 
| 
       679 
683 
     | 
    
         
             
            typedef struct {
         
     | 
| 
       680 
684 
     | 
    
         
             
                FSE_CTable CTable_max[FSE_CTABLE_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE)];
         
     | 
| 
       681 
     | 
    
         
            -
                 
     | 
| 
      
 685 
     | 
    
         
            +
                union {
         
     | 
| 
      
 686 
     | 
    
         
            +
                  U32 hist_wksp[HIST_WKSP_SIZE_U32];
         
     | 
| 
      
 687 
     | 
    
         
            +
                  BYTE scratchBuffer[1 << FSE_MAX_TABLELOG];
         
     | 
| 
      
 688 
     | 
    
         
            +
                } workspace;
         
     | 
| 
       682 
689 
     | 
    
         
             
            } fseWkspMax_t;
         
     | 
| 
       683 
690 
     | 
    
         | 
| 
       684 
691 
     | 
    
         
             
            size_t FSE_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog)
         
     | 
| 
       685 
692 
     | 
    
         
             
            {
         
     | 
| 
       686 
693 
     | 
    
         
             
                fseWkspMax_t scratchBuffer;
         
     | 
| 
       687 
     | 
    
         
            -
                DEBUG_STATIC_ASSERT(sizeof(scratchBuffer) >=  
     | 
| 
      
 694 
     | 
    
         
            +
                DEBUG_STATIC_ASSERT(sizeof(scratchBuffer) >= FSE_COMPRESS_WKSP_SIZE_U32(FSE_MAX_TABLELOG, FSE_MAX_SYMBOL_VALUE));   /* compilation failures here means scratchBuffer is not large enough */
         
     | 
| 
       688 
695 
     | 
    
         
             
                if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
         
     | 
| 
       689 
696 
     | 
    
         
             
                return FSE_compress_wksp(dst, dstCapacity, src, srcSize, maxSymbolValue, tableLog, &scratchBuffer, sizeof(scratchBuffer));
         
     | 
| 
       690 
697 
     | 
    
         
             
            }
         
     | 
| 
         @@ -693,6 +700,6 @@ size_t FSE_compress (void* dst, size_t dstCapacity, const void* src, size_t srcS 
     | 
|
| 
       693 
700 
     | 
    
         
             
            {
         
     | 
| 
       694 
701 
     | 
    
         
             
                return FSE_compress2(dst, dstCapacity, src, srcSize, FSE_MAX_SYMBOL_VALUE, FSE_DEFAULT_TABLELOG);
         
     | 
| 
       695 
702 
     | 
    
         
             
            }
         
     | 
| 
       696 
     | 
    
         
            -
             
     | 
| 
      
 703 
     | 
    
         
            +
            #endif
         
     | 
| 
       697 
704 
     | 
    
         | 
| 
       698 
705 
     | 
    
         
             
            #endif   /* FSE_COMMONDEFS_ONLY */
         
     |