Coverage Report

Created: 2025-12-11 06:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zstd/lib/legacy/zstd_v04.c
Line
Count
Source
1
/*
2
 * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.
3
 * All rights reserved.
4
 *
5
 * This source code is licensed under both the BSD-style license (found in the
6
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
 * in the COPYING file in the root directory of this source tree).
8
 * You may select, at your option, one of the above-listed licenses.
9
 */
10
11
12
 /******************************************
13
 *  Includes
14
 ******************************************/
15
#include <stddef.h>    /* size_t, ptrdiff_t */
16
#include <string.h>    /* memcpy */
17
18
#include "zstd_v04.h"
19
#include "../common/compiler.h"
20
#include "../common/error_private.h"
21
22
23
/* ******************************************************************
24
 *   mem.h
25
 *******************************************************************/
26
#ifndef MEM_H_MODULE
27
#define MEM_H_MODULE
28
29
#if defined (__cplusplus)
30
extern "C" {
31
#endif
32
33
34
/******************************************
35
*  Compiler-specific
36
******************************************/
37
#if defined(_MSC_VER)   /* Visual Studio */
38
#   include <stdlib.h>  /* _byteswap_ulong */
39
#   include <intrin.h>  /* _byteswap_* */
40
#endif
41
42
43
/****************************************************************
44
*  Basic Types
45
*****************************************************************/
46
#if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
47
# if defined(_AIX)
48
#  include <inttypes.h>
49
# else
50
#  include <stdint.h> /* intptr_t */
51
# endif
52
  typedef  uint8_t BYTE;
53
  typedef uint16_t U16;
54
  typedef  int16_t S16;
55
  typedef uint32_t U32;
56
  typedef  int32_t S32;
57
  typedef uint64_t U64;
58
  typedef  int64_t S64;
59
#else
60
  typedef unsigned char       BYTE;
61
  typedef unsigned short      U16;
62
  typedef   signed short      S16;
63
  typedef unsigned int        U32;
64
  typedef   signed int        S32;
65
  typedef unsigned long long  U64;
66
  typedef   signed long long  S64;
67
#endif
68
69
70
/*-*************************************
71
*  Debug
72
***************************************/
73
#include "../common/debug.h"
74
#ifndef assert
75
#  define assert(condition) ((void)0)
76
#endif
77
78
79
/****************************************************************
80
*  Memory I/O
81
*****************************************************************/
82
83
7.97M
MEM_STATIC unsigned MEM_32bits(void) { return sizeof(void*)==4; }
84
2.89M
MEM_STATIC unsigned MEM_64bits(void) { return sizeof(void*)==8; }
85
86
MEM_STATIC unsigned MEM_isLittleEndian(void)
87
1.45M
{
88
1.45M
    const union { U32 u; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
89
1.45M
    return one.c[0];
90
1.45M
}
91
92
MEM_STATIC U16 MEM_read16(const void* memPtr)
93
21.8k
{
94
21.8k
    U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
95
21.8k
}
96
97
MEM_STATIC U32 MEM_read32(const void* memPtr)
98
223k
{
99
223k
    U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
100
223k
}
101
102
MEM_STATIC U64 MEM_read64(const void* memPtr)
103
1.08M
{
104
1.08M
    U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
105
1.08M
}
106
107
MEM_STATIC void MEM_write16(void* memPtr, U16 value)
108
119k
{
109
119k
    memcpy(memPtr, &value, sizeof(value));
110
119k
}
111
112
MEM_STATIC U16 MEM_readLE16(const void* memPtr)
113
21.8k
{
114
21.8k
    if (MEM_isLittleEndian())
115
21.8k
        return MEM_read16(memPtr);
116
0
    else
117
0
    {
118
0
        const BYTE* p = (const BYTE*)memPtr;
119
0
        return (U16)(p[0] + (p[1]<<8));
120
0
    }
121
21.8k
}
122
123
MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
124
119k
{
125
119k
    if (MEM_isLittleEndian())
126
119k
    {
127
119k
        MEM_write16(memPtr, val);
128
119k
    }
129
0
    else
130
0
    {
131
0
        BYTE* p = (BYTE*)memPtr;
132
0
        p[0] = (BYTE)val;
133
0
        p[1] = (BYTE)(val>>8);
134
0
    }
135
119k
}
136
137
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
138
505
{
139
505
    return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
140
505
}
141
142
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
143
223k
{
144
223k
    if (MEM_isLittleEndian())
145
223k
        return MEM_read32(memPtr);
146
0
    else
147
0
    {
148
0
        const BYTE* p = (const BYTE*)memPtr;
149
0
        return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
150
0
    }
151
223k
}
152
153
154
MEM_STATIC U64 MEM_readLE64(const void* memPtr)
155
1.08M
{
156
1.08M
    if (MEM_isLittleEndian())
157
1.08M
        return MEM_read64(memPtr);
158
0
    else
159
0
    {
160
0
        const BYTE* p = (const BYTE*)memPtr;
161
0
        return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
162
0
                     + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
163
0
    }
164
1.08M
}
165
166
167
MEM_STATIC size_t MEM_readLEST(const void* memPtr)
168
1.08M
{
169
1.08M
    if (MEM_32bits())
170
0
        return (size_t)MEM_readLE32(memPtr);
171
1.08M
    else
172
1.08M
        return (size_t)MEM_readLE64(memPtr);
173
1.08M
}
174
175
176
#if defined (__cplusplus)
177
}
178
#endif
179
180
#endif /* MEM_H_MODULE */
181
182
/*
183
    zstd - standard compression library
184
    Header File for static linking only
185
*/
186
#ifndef ZSTD_STATIC_H
187
#define ZSTD_STATIC_H
188
189
190
/* *************************************
191
*  Types
192
***************************************/
193
11.0k
#define ZSTD_WINDOWLOG_ABSOLUTEMIN 11
194
195
/** from faster to stronger */
196
typedef enum { ZSTD_fast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2 } ZSTD_strategy;
197
198
typedef struct
199
{
200
    U64 srcSize;       /* optional : tells how much bytes are present in the frame. Use 0 if not known. */
201
    U32 windowLog;     /* largest match distance : larger == more compression, more memory needed during decompression */
202
    U32 contentLog;    /* full search segment : larger == more compression, slower, more memory (useless for fast) */
203
    U32 hashLog;       /* dispatch table : larger == more memory, faster */
204
    U32 searchLog;     /* nb of searches : larger == more compression, slower */
205
    U32 searchLength;  /* size of matches : larger == faster decompression, sometimes less compression */
206
    ZSTD_strategy strategy;
207
} ZSTD_parameters;
208
209
typedef ZSTDv04_Dctx ZSTD_DCtx;
210
211
/* *************************************
212
*  Advanced functions
213
***************************************/
214
/** ZSTD_decompress_usingDict
215
*   Same as ZSTD_decompressDCtx, using a Dictionary content as prefix
216
*   Note : dict can be NULL, in which case, it's equivalent to ZSTD_decompressDCtx() */
217
static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
218
                                             void* dst, size_t maxDstSize,
219
                                       const void* src, size_t srcSize,
220
                                       const void* dict,size_t dictSize);
221
222
223
/* **************************************
224
*  Streaming functions (direct mode)
225
****************************************/
226
static size_t ZSTD_resetDCtx(ZSTD_DCtx* dctx);
227
static size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcSize);
228
static void   ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* src, size_t srcSize);
229
230
static size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx);
231
static size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize);
232
233
/**
234
  Streaming decompression, bufferless mode
235
236
  A ZSTD_DCtx object is required to track streaming operations.
237
  Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
238
  A ZSTD_DCtx object can be re-used multiple times. Use ZSTD_resetDCtx() to return to fresh status.
239
240
  First operation is to retrieve frame parameters, using ZSTD_getFrameParams().
241
  This function doesn't consume its input. It needs enough input data to properly decode the frame header.
242
  Objective is to retrieve *params.windowlog, to know minimum amount of memory required during decoding.
243
  Result : 0 when successful, it means the ZSTD_parameters structure has been filled.
244
           >0 : means there is not enough data into src. Provides the expected size to successfully decode header.
245
           errorCode, which can be tested using ZSTD_isError() (For example, if it's not a ZSTD header)
246
247
  Then, you can optionally insert a dictionary.
248
  This operation must mimic the compressor behavior, otherwise decompression will fail or be corrupted.
249
250
  Then it's possible to start decompression.
251
  Use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
252
  ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
253
  ZSTD_decompressContinue() requires this exact amount of bytes, or it will fail.
254
  ZSTD_decompressContinue() needs previous data blocks during decompression, up to (1 << windowlog).
255
  They should preferably be located contiguously, prior to current block. Alternatively, a round buffer is also possible.
256
257
  @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst'.
258
  It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
259
260
  A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
261
  Context can then be reset to start a new decompression.
262
*/
263
264
265
266
267
#endif  /* ZSTD_STATIC_H */
268
269
270
/*
271
    zstd_internal - common functions to include
272
    Header File for include
273
*/
274
#ifndef ZSTD_CCOMMON_H_MODULE
275
#define ZSTD_CCOMMON_H_MODULE
276
277
/* *************************************
278
*  Common macros
279
***************************************/
280
7.87k
#define MIN(a,b) ((a)<(b) ? (a) : (b))
281
#define MAX(a,b) ((a)>(b) ? (a) : (b))
282
283
284
/* *************************************
285
*  Common constants
286
***************************************/
287
25.1k
#define ZSTD_MAGICNUMBER 0xFD2FB524   /* v0.4 */
288
289
41.6k
#define KB *(1 <<10)
290
#define MB *(1 <<20)
291
#define GB *(1U<<30)
292
293
41.6k
#define BLOCKSIZE (128 KB)                 /* define, for static allocation */
294
295
static const size_t ZSTD_blockHeaderSize = 3;
296
static const size_t ZSTD_frameHeaderSize_min = 5;
297
301
#define ZSTD_frameHeaderSize_max 5         /* define, for static allocation */
298
299
#define BIT7 128
300
#define BIT6  64
301
#define BIT5  32
302
#define BIT4  16
303
6.45k
#define BIT1   2
304
8.89k
#define BIT0   1
305
306
8.89k
#define IS_RAW BIT0
307
6.45k
#define IS_RLE BIT1
308
309
6.87M
#define MINMATCH 4
310
#define REPCODE_STARTVALUE 4
311
312
3.46M
#define MLbits   7
313
3.46M
#define LLbits   6
314
22.4k
#define Offbits  5
315
3.44M
#define MaxML  ((1<<MLbits) - 1)
316
3.44M
#define MaxLL  ((1<<LLbits) - 1)
317
10.1k
#define MaxOff ((1<<Offbits)- 1)
318
4.41k
#define MLFSELog   10
319
2.98k
#define LLFSELog   10
320
3.96k
#define OffFSELog   9
321
#define MaxSeq MAX(MaxLL, MaxML)
322
323
18.8k
#define MIN_SEQUENCES_SIZE (2 /*seqNb*/ + 2 /*dumps*/ + 3 /*seqTables*/ + 1 /*bitStream*/)
324
18.8k
#define MIN_CBLOCK_SIZE (3 /*litCSize*/ + MIN_SEQUENCES_SIZE)
325
326
396
#define ZSTD_CONTENTSIZE_ERROR   (0ULL - 2)
327
328
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
329
330
331
/* ******************************************
332
*  Shared functions to include for inlining
333
********************************************/
334
102M
static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
335
336
102M
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
337
338
/*! ZSTD_wildcopy : custom version of memcpy(), can copy up to 7-8 bytes too many */
339
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
340
6.87M
{
341
6.87M
    const BYTE* ip = (const BYTE*)src;
342
6.87M
    BYTE* op = (BYTE*)dst;
343
6.87M
    BYTE* const oend = op + length;
344
6.87M
    do
345
102M
        COPY8(op, ip)
346
102M
    while (op < oend);
347
6.87M
}
348
349
350
351
/* ******************************************************************
352
   FSE : Finite State Entropy coder
353
   header file
354
****************************************************************** */
355
#ifndef FSE_H
356
#define FSE_H
357
358
#if defined (__cplusplus)
359
extern "C" {
360
#endif
361
362
363
/* *****************************************
364
*  Includes
365
******************************************/
366
#include <stddef.h>    /* size_t, ptrdiff_t */
367
368
369
/* *****************************************
370
*  FSE simple functions
371
******************************************/
372
static size_t FSE_decompress(void* dst,  size_t maxDstSize,
373
                const void* cSrc, size_t cSrcSize);
374
/*!
375
FSE_decompress():
376
    Decompress FSE data from buffer 'cSrc', of size 'cSrcSize',
377
    into already allocated destination buffer 'dst', of size 'maxDstSize'.
378
    return : size of regenerated data (<= maxDstSize)
379
             or an error code, which can be tested using FSE_isError()
380
381
    ** Important ** : FSE_decompress() doesn't decompress non-compressible nor RLE data !!!
382
    Why ? : making this distinction requires a header.
383
    Header management is intentionally delegated to the user layer, which can better manage special cases.
384
*/
385
386
387
/* *****************************************
388
*  Tool functions
389
******************************************/
390
/* Error Management */
391
static unsigned    FSE_isError(size_t code);        /* tells if a return value is an error code */
392
393
394
395
/* *****************************************
396
*  FSE detailed API
397
******************************************/
398
/*!
399
FSE_compress() does the following:
400
1. count symbol occurrence from source[] into table count[]
401
2. normalize counters so that sum(count[]) == Power_of_2 (2^tableLog)
402
3. save normalized counters to memory buffer using writeNCount()
403
4. build encoding table 'CTable' from normalized counters
404
5. encode the data stream using encoding table 'CTable'
405
406
FSE_decompress() does the following:
407
1. read normalized counters with readNCount()
408
2. build decoding table 'DTable' from normalized counters
409
3. decode the data stream using decoding table 'DTable'
410
411
The following API allows targeting specific sub-functions for advanced tasks.
412
For example, it's possible to compress several blocks using the same 'CTable',
413
or to save and provide normalized distribution using external method.
414
*/
415
416
417
/* *** DECOMPRESSION *** */
418
419
/*!
420
FSE_readNCount():
421
   Read compactly saved 'normalizedCounter' from 'rBuffer'.
422
   return : size read from 'rBuffer'
423
            or an errorCode, which can be tested using FSE_isError()
424
            maxSymbolValuePtr[0] and tableLogPtr[0] will also be updated with their respective values */
425
static  size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSymbolValuePtr, unsigned* tableLogPtr, const void* rBuffer, size_t rBuffSize);
426
427
/*!
428
Constructor and Destructor of type FSE_DTable
429
    Note that its size depends on 'tableLog' */
430
typedef unsigned FSE_DTable;   /* don't allocate that. It's just a way to be more restrictive than void* */
431
432
/*!
433
FSE_buildDTable():
434
   Builds 'dt', which must be already allocated, using FSE_createDTable()
435
   return : 0,
436
            or an errorCode, which can be tested using FSE_isError() */
437
static size_t FSE_buildDTable ( FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog);
438
439
/*!
440
FSE_decompress_usingDTable():
441
   Decompress compressed source 'cSrc' of size 'cSrcSize' using 'dt'
442
   into 'dst' which must be already allocated.
443
   return : size of regenerated data (necessarily <= maxDstSize)
444
            or an errorCode, which can be tested using FSE_isError() */
445
static  size_t FSE_decompress_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const FSE_DTable* dt);
446
447
/*!
448
Tutorial :
449
----------
450
(Note : these functions only decompress FSE-compressed blocks.
451
 If block is uncompressed, use memcpy() instead
452
 If block is a single repeated byte, use memset() instead )
453
454
The first step is to obtain the normalized frequencies of symbols.
455
This can be performed by FSE_readNCount() if it was saved using FSE_writeNCount().
456
'normalizedCounter' must be already allocated, and have at least 'maxSymbolValuePtr[0]+1' cells of signed short.
457
In practice, that means it's necessary to know 'maxSymbolValue' beforehand,
458
or size the table to handle worst case situations (typically 256).
459
FSE_readNCount() will provide 'tableLog' and 'maxSymbolValue'.
460
The result of FSE_readNCount() is the number of bytes read from 'rBuffer'.
461
Note that 'rBufferSize' must be at least 4 bytes, even if useful information is less than that.
462
If there is an error, the function will return an error code, which can be tested using FSE_isError().
463
464
The next step is to build the decompression tables 'FSE_DTable' from 'normalizedCounter'.
465
This is performed by the function FSE_buildDTable().
466
The space required by 'FSE_DTable' must be already allocated using FSE_createDTable().
467
If there is an error, the function will return an error code, which can be tested using FSE_isError().
468
469
'FSE_DTable' can then be used to decompress 'cSrc', with FSE_decompress_usingDTable().
470
'cSrcSize' must be strictly correct, otherwise decompression will fail.
471
FSE_decompress_usingDTable() result will tell how many bytes were regenerated (<=maxDstSize).
472
If there is an error, the function will return an error code, which can be tested using FSE_isError(). (ex: dst buffer too small)
473
*/
474
475
476
#if defined (__cplusplus)
477
}
478
#endif
479
480
#endif  /* FSE_H */
481
482
483
/* ******************************************************************
484
   bitstream
485
   Part of NewGen Entropy library
486
   header file (to include)
487
   Copyright (C) 2013-2015, Yann Collet.
488
489
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
490
491
   Redistribution and use in source and binary forms, with or without
492
   modification, are permitted provided that the following conditions are
493
   met:
494
495
       * Redistributions of source code must retain the above copyright
496
   notice, this list of conditions and the following disclaimer.
497
       * Redistributions in binary form must reproduce the above
498
   copyright notice, this list of conditions and the following disclaimer
499
   in the documentation and/or other materials provided with the
500
   distribution.
501
502
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
503
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
504
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
505
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
506
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
507
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
508
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
509
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
510
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
511
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
512
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
513
514
   You can contact the author at :
515
   - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
516
   - Public forum : https://groups.google.com/forum/#!forum/lz4c
517
****************************************************************** */
518
#ifndef BITSTREAM_H_MODULE
519
#define BITSTREAM_H_MODULE
520
521
#if defined (__cplusplus)
522
extern "C" {
523
#endif
524
525
526
/*
527
*  This API consists of small unitary functions, which highly benefit from being inlined.
528
*  Since link-time-optimization is not available for all compilers,
529
*  these functions are defined into a .h to be included.
530
*/
531
532
/**********************************************
533
*  bitStream decompression API (read backward)
534
**********************************************/
535
typedef struct
536
{
537
    size_t   bitContainer;
538
    unsigned bitsConsumed;
539
    const char* ptr;
540
    const char* start;
541
} BIT_DStream_t;
542
543
typedef enum { BIT_DStream_unfinished = 0,
544
               BIT_DStream_endOfBuffer = 1,
545
               BIT_DStream_completed = 2,
546
               BIT_DStream_overflow = 3 } BIT_DStream_status;  /* result of BIT_reloadDStream() */
547
               /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... :( */
548
549
MEM_STATIC size_t   BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize);
550
MEM_STATIC size_t   BIT_readBits(BIT_DStream_t* bitD, unsigned nbBits);
551
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
552
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
553
554
555
556
557
/******************************************
558
*  unsafe API
559
******************************************/
560
MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
561
/* faster, but works only if nbBits >= 1 */
562
563
564
565
/****************************************************************
566
*  Helper functions
567
****************************************************************/
568
MEM_STATIC unsigned BIT_highbit32 (U32 val)
569
2.54M
{
570
#   if defined(_MSC_VER)   /* Visual */
571
    unsigned long r;
572
    return _BitScanReverse(&r, val) ? (unsigned)r : 0;
573
#   elif defined(__GNUC__) && (__GNUC__ >= 3)   /* Use GCC Intrinsic */
574
    return __builtin_clz (val) ^ 31;
575
#   else   /* Software version */
576
    static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
577
    U32 v = val;
578
    unsigned r;
579
    v |= v >> 1;
580
    v |= v >> 2;
581
    v |= v >> 4;
582
    v |= v >> 8;
583
    v |= v >> 16;
584
    r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
585
    return r;
586
#   endif
587
2.54M
}
588
589
590
/**********************************************************
591
* bitStream decoding
592
**********************************************************/
593
594
/*!BIT_initDStream
595
*  Initialize a BIT_DStream_t.
596
*  @bitD : a pointer to an already allocated BIT_DStream_t structure
597
*  @srcBuffer must point at the beginning of a bitStream
598
*  @srcSize must be the exact size of the bitStream
599
*  @result : size of stream (== srcSize) or an errorCode if a problem is detected
600
*/
601
MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
602
22.3k
{
603
22.3k
    if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
604
605
22.2k
    if (srcSize >=  sizeof(size_t))   /* normal case */
606
4.44k
    {
607
4.44k
        U32 contain32;
608
4.44k
        bitD->start = (const char*)srcBuffer;
609
4.44k
        bitD->ptr   = (const char*)srcBuffer + srcSize - sizeof(size_t);
610
4.44k
        bitD->bitContainer = MEM_readLEST(bitD->ptr);
611
4.44k
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
612
4.44k
        if (contain32 == 0) return ERROR(GENERIC);   /* endMark not present */
613
4.35k
        bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
614
4.35k
    }
615
17.8k
    else
616
17.8k
    {
617
17.8k
        U32 contain32;
618
17.8k
        bitD->start = (const char*)srcBuffer;
619
17.8k
        bitD->ptr   = bitD->start;
620
17.8k
        bitD->bitContainer = *(const BYTE*)(bitD->start);
621
17.8k
        switch(srcSize)
622
17.8k
        {
623
146
            case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);/* fall-through */
624
547
            case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);/* fall-through */
625
1.42k
            case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);/* fall-through */
626
2.57k
            case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24; /* fall-through */
627
8.78k
            case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16; /* fall-through */
628
12.3k
            case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) <<  8; /* fall-through */
629
17.8k
            default: break;
630
17.8k
        }
631
17.8k
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
632
17.8k
        if (contain32 == 0) return ERROR(GENERIC);   /* endMark not present */
633
17.7k
        bitD->bitsConsumed = 8 - BIT_highbit32(contain32);
634
17.7k
        bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
635
17.7k
    }
636
637
22.0k
    return srcSize;
638
22.2k
}
639
640
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
641
13.8M
{
642
13.8M
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
643
13.8M
    return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
644
13.8M
}
645
646
/*! BIT_lookBitsFast :
647
*   unsafe version; only works if nbBits >= 1 */
648
MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
649
16.9M
{
650
16.9M
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
651
16.9M
    return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
652
16.9M
}
653
654
MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
655
30.8M
{
656
30.8M
    bitD->bitsConsumed += nbBits;
657
30.8M
}
658
659
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
660
13.8M
{
661
13.8M
    size_t value = BIT_lookBits(bitD, nbBits);
662
13.8M
    BIT_skipBits(bitD, nbBits);
663
13.8M
    return value;
664
13.8M
}
665
666
/*!BIT_readBitsFast :
667
*  unsafe version; only works if nbBits >= 1 */
668
MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
669
11.9k
{
670
11.9k
    size_t value = BIT_lookBitsFast(bitD, nbBits);
671
11.9k
    BIT_skipBits(bitD, nbBits);
672
11.9k
    return value;
673
11.9k
}
674
675
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
676
4.51M
{
677
4.51M
    if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* should never happen */
678
458
        return BIT_DStream_overflow;
679
680
4.51M
    if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
681
998k
    {
682
998k
        bitD->ptr -= bitD->bitsConsumed >> 3;
683
998k
        bitD->bitsConsumed &= 7;
684
998k
        bitD->bitContainer = MEM_readLEST(bitD->ptr);
685
998k
        return BIT_DStream_unfinished;
686
998k
    }
687
3.51M
    if (bitD->ptr == bitD->start)
688
3.43M
    {
689
3.43M
        if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
690
3.23M
        return BIT_DStream_completed;
691
3.43M
    }
692
86.0k
    {
693
86.0k
        U32 nbBytes = bitD->bitsConsumed >> 3;
694
86.0k
        BIT_DStream_status result = BIT_DStream_unfinished;
695
86.0k
        if (bitD->ptr - nbBytes < bitD->start)
696
1.84k
        {
697
1.84k
            nbBytes = (U32)(bitD->ptr - bitD->start);  /* ptr > start */
698
1.84k
            result = BIT_DStream_endOfBuffer;
699
1.84k
        }
700
86.0k
        bitD->ptr -= nbBytes;
701
86.0k
        bitD->bitsConsumed -= nbBytes*8;
702
86.0k
        bitD->bitContainer = MEM_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD) */
703
86.0k
        return result;
704
3.51M
    }
705
3.51M
}
706
707
/*! BIT_endOfDStream
708
*   @return Tells if DStream has reached its exact end
709
*/
710
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
711
46.4k
{
712
46.4k
    return ((DStream->ptr == DStream->start) && (DStream->bitsConsumed == sizeof(DStream->bitContainer)*8));
713
46.4k
}
714
715
#if defined (__cplusplus)
716
}
717
#endif
718
719
#endif /* BITSTREAM_H_MODULE */
720
721
722
723
/* ******************************************************************
724
   FSE : Finite State Entropy coder
725
   header file for static linking (only)
726
   Copyright (C) 2013-2015, Yann Collet
727
728
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
729
730
   Redistribution and use in source and binary forms, with or without
731
   modification, are permitted provided that the following conditions are
732
   met:
733
734
       * Redistributions of source code must retain the above copyright
735
   notice, this list of conditions and the following disclaimer.
736
       * Redistributions in binary form must reproduce the above
737
   copyright notice, this list of conditions and the following disclaimer
738
   in the documentation and/or other materials provided with the
739
   distribution.
740
741
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
742
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
743
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
744
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
745
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
746
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
747
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
748
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
749
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
750
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
751
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
752
753
   You can contact the author at :
754
   - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
755
   - Public forum : https://groups.google.com/forum/#!forum/lz4c
756
****************************************************************** */
757
#ifndef FSE_STATIC_H
758
#define FSE_STATIC_H
759
760
#if defined (__cplusplus)
761
extern "C" {
762
#endif
763
764
765
/* *****************************************
766
*  Static allocation
767
*******************************************/
768
/* FSE buffer bounds */
769
#define FSE_NCOUNTBOUND 512
770
#define FSE_BLOCKBOUND(size) (size + (size>>7))
771
#define FSE_COMPRESSBOUND(size) (FSE_NCOUNTBOUND + FSE_BLOCKBOUND(size))   /* Macro version, useful for static allocation */
772
773
/* It is possible to statically allocate FSE CTable/DTable as a table of unsigned using below macros */
774
#define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue)   (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
775
#define FSE_DTABLE_SIZE_U32(maxTableLog)                   (1 + (1<<maxTableLog))
776
777
778
/* *****************************************
779
*  FSE advanced API
780
*******************************************/
781
static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits);
782
/* build a fake FSE_DTable, designed to read an uncompressed bitstream where each symbol uses nbBits */
783
784
static size_t FSE_buildDTable_rle (FSE_DTable* dt, unsigned char symbolValue);
785
/* build a fake FSE_DTable, designed to always generate the same symbolValue */
786
787
788
789
/* *****************************************
790
*  FSE symbol decompression API
791
*******************************************/
792
typedef struct
793
{
794
    size_t      state;
795
    const void* table;   /* precise table may vary, depending on U16 */
796
} FSE_DState_t;
797
798
799
static void     FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt);
800
801
static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
802
803
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
804
805
806
/* *****************************************
807
*  FSE unsafe API
808
*******************************************/
809
static unsigned char FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD);
810
/* faster, but works only if nbBits is always >= 1 (otherwise, result will be corrupted) */
811
812
813
/* *****************************************
814
*  Implementation of inlined functions
815
*******************************************/
816
/* decompression */
817
818
typedef struct {
819
    U16 tableLog;
820
    U16 fastMode;
821
} FSE_DTableHeader;   /* sizeof U32 */
822
823
typedef struct
824
{
825
    unsigned short newState;
826
    unsigned char  symbol;
827
    unsigned char  nbBits;
828
} FSE_decode_t;   /* size == U32 */
829
830
MEM_STATIC void FSE_initDState(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD, const FSE_DTable* dt)
831
48.9k
{
832
48.9k
    FSE_DTableHeader DTableH;
833
48.9k
    memcpy(&DTableH, dt, sizeof(DTableH));
834
48.9k
    DStatePtr->state = BIT_readBits(bitD, DTableH.tableLog);
835
48.9k
    BIT_reloadDStream(bitD);
836
48.9k
    DStatePtr->table = dt + 1;
837
48.9k
}
838
839
MEM_STATIC BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
840
10.3M
{
841
10.3M
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
842
10.3M
    const U32  nbBits = DInfo.nbBits;
843
10.3M
    BYTE symbol = DInfo.symbol;
844
10.3M
    size_t lowBits = BIT_readBits(bitD, nbBits);
845
846
10.3M
    DStatePtr->state = DInfo.newState + lowBits;
847
10.3M
    return symbol;
848
10.3M
}
849
850
MEM_STATIC BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, BIT_DStream_t* bitD)
851
11.9k
{
852
11.9k
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
853
11.9k
    const U32 nbBits = DInfo.nbBits;
854
11.9k
    BYTE symbol = DInfo.symbol;
855
11.9k
    size_t lowBits = BIT_readBitsFast(bitD, nbBits);
856
857
11.9k
    DStatePtr->state = DInfo.newState + lowBits;
858
11.9k
    return symbol;
859
11.9k
}
860
861
MEM_STATIC unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
862
4.18k
{
863
4.18k
    return DStatePtr->state == 0;
864
4.18k
}
865
866
867
#if defined (__cplusplus)
868
}
869
#endif
870
871
#endif  /* FSE_STATIC_H */
872
873
/* ******************************************************************
874
   FSE : Finite State Entropy coder
875
   Copyright (C) 2013-2015, Yann Collet.
876
877
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
878
879
   Redistribution and use in source and binary forms, with or without
880
   modification, are permitted provided that the following conditions are
881
   met:
882
883
       * Redistributions of source code must retain the above copyright
884
   notice, this list of conditions and the following disclaimer.
885
       * Redistributions in binary form must reproduce the above
886
   copyright notice, this list of conditions and the following disclaimer
887
   in the documentation and/or other materials provided with the
888
   distribution.
889
890
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
891
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
892
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
893
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
894
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
895
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
896
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
897
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
898
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
899
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
900
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
901
902
    You can contact the author at :
903
    - FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
904
    - Public forum : https://groups.google.com/forum/#!forum/lz4c
905
****************************************************************** */
906
907
#ifndef FSE_COMMONDEFS_ONLY
908
909
/* **************************************************************
910
*  Tuning parameters
911
****************************************************************/
912
/*!MEMORY_USAGE :
913
*  Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
914
*  Increasing memory usage improves compression ratio
915
*  Reduced memory usage can improve speed, due to cache effect
916
*  Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
917
31.8k
#define FSE_MAX_MEMORY_USAGE 14
918
#define FSE_DEFAULT_MEMORY_USAGE 13
919
920
/*!FSE_MAX_SYMBOL_VALUE :
921
*  Maximum symbol value authorized.
922
*  Required for proper stack allocation */
923
12.3k
#define FSE_MAX_SYMBOL_VALUE 255
924
925
926
/* **************************************************************
927
*  template functions type & suffix
928
****************************************************************/
929
2.51M
#define FSE_FUNCTION_TYPE BYTE
930
#define FSE_FUNCTION_EXTENSION
931
11.7k
#define FSE_DECODE_TYPE FSE_decode_t
932
933
934
#endif   /* !FSE_COMMONDEFS_ONLY */
935
936
/* **************************************************************
937
*  Compiler specifics
938
****************************************************************/
939
#ifdef _MSC_VER    /* Visual Studio */
940
#  define FORCE_INLINE static __forceinline
941
#  include <intrin.h>                    /* For Visual 2005 */
942
#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
943
#  pragma warning(disable : 4214)        /* disable: C4214: non-int bitfields */
944
#else
945
#  if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
946
#    ifdef __GNUC__
947
#      define FORCE_INLINE static inline __attribute__((always_inline))
948
#    else
949
#      define FORCE_INLINE static inline
950
#    endif
951
#  else
952
#    define FORCE_INLINE static
953
#  endif /* __STDC_VERSION__ */
954
#endif
955
956
957
/* **************************************************************
958
*  Dependencies
959
****************************************************************/
960
#include <stdlib.h>     /* malloc, free, qsort */
961
#include <string.h>     /* memcpy, memset */
962
#include <stdio.h>      /* printf (debug) */
963
964
965
/* ***************************************************************
966
*  Constants
967
*****************************************************************/
968
31.8k
#define FSE_MAX_TABLELOG  (FSE_MAX_MEMORY_USAGE-2)
969
#define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
970
#define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
971
#define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
972
12.0k
#define FSE_MIN_TABLELOG 5
973
974
12.0k
#define FSE_TABLELOG_ABSOLUTE_MAX 15
975
#if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
976
#error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
977
#endif
978
979
980
/* **************************************************************
981
*  Error Management
982
****************************************************************/
983
#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
984
985
986
/* **************************************************************
987
*  Complex types
988
****************************************************************/
989
typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
990
991
992
/*-**************************************************************
993
*  Templates
994
****************************************************************/
995
/*
996
  designed to be included
997
  for type-specific functions (template emulation in C)
998
  Objective is to write these functions only once, for improved maintenance
999
*/
1000
1001
/* safety checks */
1002
#ifndef FSE_FUNCTION_EXTENSION
1003
#  error "FSE_FUNCTION_EXTENSION must be defined"
1004
#endif
1005
#ifndef FSE_FUNCTION_TYPE
1006
#  error "FSE_FUNCTION_TYPE must be defined"
1007
#endif
1008
1009
/* Function names */
1010
#define FSE_CAT(X,Y) X##Y
1011
#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
1012
#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
1013
1014
11.7k
static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
1015
1016
1017
static size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
1018
11.7k
{
1019
11.7k
    FSE_DTableHeader DTableH;
1020
11.7k
    void* const tdPtr = dt+1;   /* because dt is unsigned, 32-bits aligned on 32-bits */
1021
11.7k
    FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*) (tdPtr);
1022
11.7k
    const U32 tableSize = 1 << tableLog;
1023
11.7k
    const U32 tableMask = tableSize-1;
1024
11.7k
    const U32 step = FSE_tableStep(tableSize);
1025
11.7k
    U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
1026
11.7k
    U32 position = 0;
1027
11.7k
    U32 highThreshold = tableSize-1;
1028
11.7k
    const S16 largeLimit= (S16)(1 << (tableLog-1));
1029
11.7k
    U32 noLarge = 1;
1030
11.7k
    U32 s;
1031
1032
    /* Sanity Checks */
1033
11.7k
    if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return ERROR(maxSymbolValue_tooLarge);
1034
11.7k
    if (tableLog > FSE_MAX_TABLELOG) return ERROR(tableLog_tooLarge);
1035
1036
    /* Init, lay down lowprob symbols */
1037
11.7k
    memset(tableDecode, 0, sizeof(FSE_DECODE_TYPE) * (maxSymbolValue+1) );   /* useless init, but keep static analyzer happy, and we don't need to performance optimize legacy decoders */
1038
11.7k
    DTableH.tableLog = (U16)tableLog;
1039
118k
    for (s=0; s<=maxSymbolValue; s++)
1040
106k
    {
1041
106k
        if (normalizedCounter[s]==-1)
1042
40.6k
        {
1043
40.6k
            tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
1044
40.6k
            symbolNext[s] = 1;
1045
40.6k
        }
1046
66.3k
        else
1047
66.3k
        {
1048
66.3k
            if (normalizedCounter[s] >= largeLimit) noLarge=0;
1049
66.3k
            symbolNext[s] = normalizedCounter[s];
1050
66.3k
        }
1051
106k
    }
1052
1053
    /* Spread symbols */
1054
118k
    for (s=0; s<=maxSymbolValue; s++)
1055
106k
    {
1056
106k
        int i;
1057
2.58M
        for (i=0; i<normalizedCounter[s]; i++)
1058
2.47M
        {
1059
2.47M
            tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
1060
2.47M
            position = (position + step) & tableMask;
1061
2.51M
            while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
1062
2.47M
        }
1063
106k
    }
1064
1065
11.7k
    if (position!=0) return ERROR(GENERIC);   /* position must reach all cells once, otherwise normalizedCounter is incorrect */
1066
1067
    /* Build Decoding table */
1068
11.7k
    {
1069
11.7k
        U32 i;
1070
2.53M
        for (i=0; i<tableSize; i++)
1071
2.51M
        {
1072
2.51M
            FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
1073
2.51M
            U16 nextState = symbolNext[symbol]++;
1074
2.51M
            tableDecode[i].nbBits = (BYTE) (tableLog - BIT_highbit32 ((U32)nextState) );
1075
2.51M
            tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
1076
2.51M
        }
1077
11.7k
    }
1078
1079
11.7k
    DTableH.fastMode = (U16)noLarge;
1080
11.7k
    memcpy(dt, &DTableH, sizeof(DTableH));
1081
11.7k
    return 0;
1082
11.7k
}
1083
1084
1085
#ifndef FSE_COMMONDEFS_ONLY
1086
/******************************************
1087
*  FSE helper functions
1088
******************************************/
1089
13.5k
static unsigned FSE_isError(size_t code) { return ERR_isError(code); }
1090
1091
1092
/****************************************************************
1093
*  FSE NCount encoding-decoding
1094
****************************************************************/
1095
static short FSE_abs(short a)
1096
90.2k
{
1097
90.2k
    return a<0 ? (short)-a : a;
1098
90.2k
}
1099
1100
static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
1101
                 const void* headerBuffer, size_t hbSize)
1102
12.1k
{
1103
12.1k
    const BYTE* const istart = (const BYTE*) headerBuffer;
1104
12.1k
    const BYTE* const iend = istart + hbSize;
1105
12.1k
    const BYTE* ip = istart;
1106
12.1k
    int nbBits;
1107
12.1k
    int remaining;
1108
12.1k
    int threshold;
1109
12.1k
    U32 bitStream;
1110
12.1k
    int bitCount;
1111
12.1k
    unsigned charnum = 0;
1112
12.1k
    int previous0 = 0;
1113
1114
12.1k
    if (hbSize < 4) return ERROR(srcSize_wrong);
1115
12.0k
    bitStream = MEM_readLE32(ip);
1116
12.0k
    nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG;   /* extract tableLog */
1117
12.0k
    if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return ERROR(tableLog_tooLarge);
1118
11.9k
    bitStream >>= 4;
1119
11.9k
    bitCount = 4;
1120
11.9k
    *tableLogPtr = nbBits;
1121
11.9k
    remaining = (1<<nbBits)+1;
1122
11.9k
    threshold = 1<<nbBits;
1123
11.9k
    nbBits++;
1124
1125
102k
    while ((remaining>1) && (charnum<=*maxSVPtr))
1126
90.3k
    {
1127
90.3k
        if (previous0)
1128
9.40k
        {
1129
9.40k
            unsigned n0 = charnum;
1130
78.1k
            while ((bitStream & 0xFFFF) == 0xFFFF)
1131
68.7k
            {
1132
68.7k
                n0+=24;
1133
68.7k
                if (ip < iend-5)
1134
68.5k
                {
1135
68.5k
                    ip+=2;
1136
68.5k
                    bitStream = MEM_readLE32(ip) >> bitCount;
1137
68.5k
                }
1138
131
                else
1139
131
                {
1140
131
                    bitStream >>= 16;
1141
131
                    bitCount+=16;
1142
131
                }
1143
68.7k
            }
1144
12.0k
            while ((bitStream & 3) == 3)
1145
2.64k
            {
1146
2.64k
                n0+=3;
1147
2.64k
                bitStream>>=2;
1148
2.64k
                bitCount+=2;
1149
2.64k
            }
1150
9.40k
            n0 += bitStream & 3;
1151
9.40k
            bitCount += 2;
1152
9.40k
            if (n0 > *maxSVPtr) return ERROR(maxSymbolValue_tooSmall);
1153
40.4k
            while (charnum < n0) normalizedCounter[charnum++] = 0;
1154
9.34k
            if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1155
6.10k
            {
1156
6.10k
                ip += bitCount>>3;
1157
6.10k
                bitCount &= 7;
1158
6.10k
                bitStream = MEM_readLE32(ip) >> bitCount;
1159
6.10k
            }
1160
3.23k
            else
1161
3.23k
                bitStream >>= 2;
1162
9.34k
        }
1163
90.2k
        {
1164
90.2k
            const short max = (short)((2*threshold-1)-remaining);
1165
90.2k
            short count;
1166
1167
90.2k
            if ((bitStream & (threshold-1)) < (U32)max)
1168
60.7k
            {
1169
60.7k
                count = (short)(bitStream & (threshold-1));
1170
60.7k
                bitCount   += nbBits-1;
1171
60.7k
            }
1172
29.5k
            else
1173
29.5k
            {
1174
29.5k
                count = (short)(bitStream & (2*threshold-1));
1175
29.5k
                if (count >= threshold) count -= max;
1176
29.5k
                bitCount   += nbBits;
1177
29.5k
            }
1178
1179
90.2k
            count--;   /* extra accuracy */
1180
90.2k
            remaining -= FSE_abs(count);
1181
90.2k
            normalizedCounter[charnum++] = count;
1182
90.2k
            previous0 = !count;
1183
164k
            while (remaining < threshold)
1184
73.8k
            {
1185
73.8k
                nbBits--;
1186
73.8k
                threshold >>= 1;
1187
73.8k
            }
1188
1189
90.2k
            {
1190
90.2k
                if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
1191
78.2k
                {
1192
78.2k
                    ip += bitCount>>3;
1193
78.2k
                    bitCount &= 7;
1194
78.2k
                }
1195
12.0k
                else
1196
12.0k
                {
1197
12.0k
                    bitCount -= (int)(8 * (iend - 4 - ip));
1198
12.0k
                    ip = iend - 4;
1199
12.0k
                }
1200
90.2k
                bitStream = MEM_readLE32(ip) >> (bitCount & 31);
1201
90.2k
            }
1202
90.2k
        }
1203
90.2k
    }
1204
11.9k
    if (remaining != 1) return ERROR(GENERIC);
1205
11.8k
    *maxSVPtr = charnum-1;
1206
1207
11.8k
    ip += (bitCount+7)>>3;
1208
11.8k
    if ((size_t)(ip-istart) > hbSize) return ERROR(srcSize_wrong);
1209
11.8k
    return ip-istart;
1210
11.8k
}
1211
1212
1213
/*********************************************************
1214
*  Decompression (Byte symbols)
1215
*********************************************************/
1216
static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
1217
10.1k
{
1218
10.1k
    void* ptr = dt;
1219
10.1k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1220
10.1k
    void* dPtr = dt + 1;
1221
10.1k
    FSE_decode_t* const cell = (FSE_decode_t*)dPtr;
1222
1223
10.1k
    DTableH->tableLog = 0;
1224
10.1k
    DTableH->fastMode = 0;
1225
1226
10.1k
    cell->newState = 0;
1227
10.1k
    cell->symbol = symbolValue;
1228
10.1k
    cell->nbBits = 0;
1229
1230
10.1k
    return 0;
1231
10.1k
}
1232
1233
1234
static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
1235
27.1k
{
1236
27.1k
    void* ptr = dt;
1237
27.1k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
1238
27.1k
    void* dPtr = dt + 1;
1239
27.1k
    FSE_decode_t* const dinfo = (FSE_decode_t*)dPtr;
1240
27.1k
    const unsigned tableSize = 1 << nbBits;
1241
27.1k
    const unsigned tableMask = tableSize - 1;
1242
27.1k
    const unsigned maxSymbolValue = tableMask;
1243
27.1k
    unsigned s;
1244
1245
    /* Sanity checks */
1246
27.1k
    if (nbBits < 1) return ERROR(GENERIC);         /* min size */
1247
1248
    /* Build Decoding Table */
1249
27.1k
    DTableH->tableLog = (U16)nbBits;
1250
27.1k
    DTableH->fastMode = 1;
1251
2.17M
    for (s=0; s<=maxSymbolValue; s++)
1252
2.14M
    {
1253
2.14M
        dinfo[s].newState = 0;
1254
2.14M
        dinfo[s].symbol = (BYTE)s;
1255
2.14M
        dinfo[s].nbBits = (BYTE)nbBits;
1256
2.14M
    }
1257
1258
27.1k
    return 0;
1259
27.1k
}
1260
1261
FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
1262
          void* dst, size_t maxDstSize,
1263
    const void* cSrc, size_t cSrcSize,
1264
    const FSE_DTable* dt, const unsigned fast)
1265
450
{
1266
450
    BYTE* const ostart = (BYTE*) dst;
1267
450
    BYTE* op = ostart;
1268
450
    BYTE* const omax = op + maxDstSize;
1269
450
    BYTE* const olimit = omax-3;
1270
1271
450
    BIT_DStream_t bitD;
1272
450
    FSE_DState_t state1;
1273
450
    FSE_DState_t state2;
1274
450
    size_t errorCode;
1275
1276
    /* Init */
1277
450
    errorCode = BIT_initDStream(&bitD, cSrc, cSrcSize);   /* replaced last arg by maxCompressed Size */
1278
450
    if (FSE_isError(errorCode)) return errorCode;
1279
1280
430
    FSE_initDState(&state1, &bitD, dt);
1281
430
    FSE_initDState(&state2, &bitD, dt);
1282
1283
51.7k
#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
1284
1285
    /* 4 symbols per loop */
1286
7.10k
    for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished) && (op<olimit) ; op+=4)
1287
6.67k
    {
1288
6.67k
        op[0] = FSE_GETSYMBOL(&state1);
1289
1290
6.67k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1291
0
            BIT_reloadDStream(&bitD);
1292
1293
6.67k
        op[1] = FSE_GETSYMBOL(&state2);
1294
1295
6.67k
        if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1296
0
            { if (BIT_reloadDStream(&bitD) > BIT_DStream_unfinished) { op+=2; break; } }
1297
1298
6.67k
        op[2] = FSE_GETSYMBOL(&state1);
1299
1300
6.67k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
1301
0
            BIT_reloadDStream(&bitD);
1302
1303
6.67k
        op[3] = FSE_GETSYMBOL(&state2);
1304
6.67k
    }
1305
1306
    /* tail */
1307
    /* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
1308
12.8k
    while (1)
1309
12.8k
    {
1310
12.8k
        if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
1311
191
            break;
1312
1313
12.6k
        *op++ = FSE_GETSYMBOL(&state1);
1314
1315
12.6k
        if ( (BIT_reloadDStream(&bitD)>BIT_DStream_completed) || (op==omax) || (BIT_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
1316
239
            break;
1317
1318
12.4k
        *op++ = FSE_GETSYMBOL(&state2);
1319
12.4k
    }
1320
1321
    /* end ? */
1322
430
    if (BIT_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
1323
112
        return op-ostart;
1324
1325
318
    if (op==omax) return ERROR(dstSize_tooSmall);   /* dst buffer is full, but cSrc unfinished */
1326
1327
223
    return ERROR(corruption_detected);
1328
318
}
1329
1330
1331
static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
1332
                            const void* cSrc, size_t cSrcSize,
1333
                            const FSE_DTable* dt)
1334
450
{
1335
450
    FSE_DTableHeader DTableH;
1336
450
    U32 fastMode;
1337
1338
450
    memcpy(&DTableH, dt, sizeof(DTableH));
1339
450
    fastMode = DTableH.fastMode;
1340
1341
    /* select fast mode (static) */
1342
450
    if (fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
1343
278
    return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
1344
450
}
1345
1346
1347
static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1348
564
{
1349
564
    const BYTE* const istart = (const BYTE*)cSrc;
1350
564
    const BYTE* ip = istart;
1351
564
    short counting[FSE_MAX_SYMBOL_VALUE+1];
1352
564
    DTable_max_t dt;   /* Static analyzer seems unable to understand this table will be properly initialized later */
1353
564
    unsigned tableLog;
1354
564
    unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
1355
564
    size_t errorCode;
1356
1357
564
    if (cSrcSize<2) return ERROR(srcSize_wrong);   /* too small input size */
1358
1359
    /* normal FSE decoding mode */
1360
541
    errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
1361
541
    if (FSE_isError(errorCode)) return errorCode;
1362
466
    if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);   /* too small input size */
1363
454
    ip += errorCode;
1364
454
    cSrcSize -= errorCode;
1365
1366
454
    errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
1367
454
    if (FSE_isError(errorCode)) return errorCode;
1368
1369
    /* always return, even if it is an error code */
1370
450
    return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
1371
454
}
1372
1373
1374
1375
#endif   /* FSE_COMMONDEFS_ONLY */
1376
1377
1378
/* ******************************************************************
1379
   Huff0 : Huffman coder, part of New Generation Entropy library
1380
   header file
1381
   Copyright (C) 2013-2015, Yann Collet.
1382
1383
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
1384
1385
   Redistribution and use in source and binary forms, with or without
1386
   modification, are permitted provided that the following conditions are
1387
   met:
1388
1389
       * Redistributions of source code must retain the above copyright
1390
   notice, this list of conditions and the following disclaimer.
1391
       * Redistributions in binary form must reproduce the above
1392
   copyright notice, this list of conditions and the following disclaimer
1393
   in the documentation and/or other materials provided with the
1394
   distribution.
1395
1396
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1397
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1398
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1399
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1400
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1401
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1402
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1403
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1404
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1405
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1406
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1407
1408
   You can contact the author at :
1409
   - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
1410
   - Public forum : https://groups.google.com/forum/#!forum/lz4c
1411
****************************************************************** */
1412
#ifndef HUFF0_H
1413
#define HUFF0_H
1414
1415
#if defined (__cplusplus)
1416
extern "C" {
1417
#endif
1418
1419
1420
/* ****************************************
1421
*  Dependency
1422
******************************************/
1423
#include <stddef.h>    /* size_t */
1424
1425
1426
/* ****************************************
1427
*  Huff0 simple functions
1428
******************************************/
1429
static size_t HUF_decompress(void* dst,  size_t dstSize,
1430
                const void* cSrc, size_t cSrcSize);
1431
/*!
1432
HUF_decompress():
1433
    Decompress Huff0 data from buffer 'cSrc', of size 'cSrcSize',
1434
    into already allocated destination buffer 'dst', of size 'dstSize'.
1435
    'dstSize' must be the exact size of original (uncompressed) data.
1436
    Note : in contrast with FSE, HUF_decompress can regenerate RLE (cSrcSize==1) and uncompressed (cSrcSize==dstSize) data, because it knows size to regenerate.
1437
    @return : size of regenerated data (== dstSize)
1438
              or an error code, which can be tested using HUF_isError()
1439
*/
1440
1441
1442
/* ****************************************
1443
*  Tool functions
1444
******************************************/
1445
/* Error Management */
1446
static unsigned    HUF_isError(size_t code);        /* tells if a return value is an error code */
1447
1448
1449
#if defined (__cplusplus)
1450
}
1451
#endif
1452
1453
#endif   /* HUFF0_H */
1454
1455
1456
/* ******************************************************************
1457
   Huff0 : Huffman coder, part of New Generation Entropy library
1458
   header file for static linking (only)
1459
   Copyright (C) 2013-2015, Yann Collet
1460
1461
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
1462
1463
   Redistribution and use in source and binary forms, with or without
1464
   modification, are permitted provided that the following conditions are
1465
   met:
1466
1467
       * Redistributions of source code must retain the above copyright
1468
   notice, this list of conditions and the following disclaimer.
1469
       * Redistributions in binary form must reproduce the above
1470
   copyright notice, this list of conditions and the following disclaimer
1471
   in the documentation and/or other materials provided with the
1472
   distribution.
1473
1474
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1475
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1476
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1477
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1478
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1479
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1480
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1481
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1482
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1483
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1484
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1485
1486
   You can contact the author at :
1487
   - Source repository : https://github.com/Cyan4973/FiniteStateEntropy
1488
   - Public forum : https://groups.google.com/forum/#!forum/lz4c
1489
****************************************************************** */
1490
#ifndef HUFF0_STATIC_H
1491
#define HUFF0_STATIC_H
1492
1493
#if defined (__cplusplus)
1494
extern "C" {
1495
#endif
1496
1497
1498
1499
/* ****************************************
1500
*  Static allocation macros
1501
******************************************/
1502
/* static allocation of Huff0's DTable */
1503
#define HUF_DTABLE_SIZE(maxTableLog)   (1 + (1<<maxTableLog))  /* nb Cells; use unsigned short for X2, unsigned int for X4 */
1504
#define HUF_CREATE_STATIC_DTABLEX2(DTable, maxTableLog) \
1505
1.95k
        unsigned short DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
1506
#define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
1507
342
        unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog)] = { maxTableLog }
1508
#define HUF_CREATE_STATIC_DTABLEX6(DTable, maxTableLog) \
1509
        unsigned int DTable[HUF_DTABLE_SIZE(maxTableLog) * 3 / 2] = { maxTableLog }
1510
1511
1512
/* ****************************************
1513
*  Advanced decompression functions
1514
******************************************/
1515
static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* single-symbol decoder */
1516
static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);   /* double-symbols decoder */
1517
1518
1519
/* ****************************************
1520
*  Huff0 detailed API
1521
******************************************/
1522
/*!
1523
HUF_decompress() does the following:
1524
1. select the decompression algorithm (X2, X4, X6) based on pre-computed heuristics
1525
2. build Huffman table from save, using HUF_readDTableXn()
1526
3. decode 1 or 4 segments in parallel using HUF_decompressSXn_usingDTable
1527
1528
*/
1529
static size_t HUF_readDTableX2 (unsigned short* DTable, const void* src, size_t srcSize);
1530
static size_t HUF_readDTableX4 (unsigned* DTable, const void* src, size_t srcSize);
1531
1532
static size_t HUF_decompress4X2_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned short* DTable);
1533
static size_t HUF_decompress4X4_usingDTable(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize, const unsigned* DTable);
1534
1535
1536
#if defined (__cplusplus)
1537
}
1538
#endif
1539
1540
#endif /* HUFF0_STATIC_H */
1541
1542
1543
1544
/* ******************************************************************
1545
   Huff0 : Huffman coder, part of New Generation Entropy library
1546
   Copyright (C) 2013-2015, Yann Collet.
1547
1548
   BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
1549
1550
   Redistribution and use in source and binary forms, with or without
1551
   modification, are permitted provided that the following conditions are
1552
   met:
1553
1554
       * Redistributions of source code must retain the above copyright
1555
   notice, this list of conditions and the following disclaimer.
1556
       * Redistributions in binary form must reproduce the above
1557
   copyright notice, this list of conditions and the following disclaimer
1558
   in the documentation and/or other materials provided with the
1559
   distribution.
1560
1561
   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1562
   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1563
   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1564
   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1565
   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1566
   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1567
   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1568
   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1569
   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1570
   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1571
   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1572
1573
    You can contact the author at :
1574
    - FSE+Huff0 source repository : https://github.com/Cyan4973/FiniteStateEntropy
1575
****************************************************************** */
1576
1577
/* **************************************************************
1578
*  Compiler specifics
1579
****************************************************************/
1580
#if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
1581
/* inline is defined */
1582
#elif defined(_MSC_VER)
1583
#  define inline __inline
1584
#else
1585
#  define inline /* disable inline */
1586
#endif
1587
1588
1589
#ifdef _MSC_VER    /* Visual Studio */
1590
#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
1591
#endif
1592
1593
1594
/* **************************************************************
1595
*  Includes
1596
****************************************************************/
1597
#include <stdlib.h>     /* malloc, free, qsort */
1598
#include <string.h>     /* memcpy, memset */
1599
#include <stdio.h>      /* printf (debug) */
1600
1601
1602
/* **************************************************************
1603
*  Constants
1604
****************************************************************/
1605
159k
#define HUF_ABSOLUTEMAX_TABLELOG  16   /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
1606
0
#define HUF_MAX_TABLELOG  12           /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
1607
#define HUF_DEFAULT_TABLELOG  HUF_MAX_TABLELOG   /* tableLog by default, when not specified */
1608
2.29k
#define HUF_MAX_SYMBOL_VALUE 255
1609
#if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG)
1610
#  error "HUF_MAX_TABLELOG is too large !"
1611
#endif
1612
1613
1614
/* **************************************************************
1615
*  Error Management
1616
****************************************************************/
1617
13.1k
static unsigned HUF_isError(size_t code) { return ERR_isError(code); }
1618
2.29k
#define HUF_STATIC_ASSERT(c) { enum { HUF_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
1619
1620
1621
1622
/*-*******************************************************
1623
*  Huff0 : Huffman block decompression
1624
*********************************************************/
1625
typedef struct { BYTE byte; BYTE nbBits; } HUF_DEltX2;   /* single-symbol decoding */
1626
1627
typedef struct { U16 sequence; BYTE nbBits; BYTE length; } HUF_DEltX4;  /* double-symbols decoding */
1628
1629
typedef struct { BYTE symbol; BYTE weight; } sortedSymbol_t;
1630
1631
/*! HUF_readStats
1632
    Read compact Huffman tree, saved by HUF_writeCTable
1633
    @huffWeight : destination buffer
1634
    @return : size read from `src`
1635
*/
1636
static size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
1637
                            U32* nbSymbolsPtr, U32* tableLogPtr,
1638
                            const void* src, size_t srcSize)
1639
2.29k
{
1640
2.29k
    U32 weightTotal;
1641
2.29k
    U32 tableLog;
1642
2.29k
    const BYTE* ip = (const BYTE*) src;
1643
2.29k
    size_t iSize;
1644
2.29k
    size_t oSize;
1645
2.29k
    U32 n;
1646
1647
2.29k
    if (!srcSize) return ERROR(srcSize_wrong);
1648
2.29k
    iSize = ip[0];
1649
    //memset(huffWeight, 0, hwSize);   /* is not necessary, even though some analyzer complain ... */
1650
1651
2.29k
    if (iSize >= 128)  /* special header */
1652
1.71k
    {
1653
1.71k
        if (iSize >= (242))   /* RLE */
1654
1.45k
        {
1655
1.45k
            static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
1656
1.45k
            oSize = l[iSize-242];
1657
1.45k
            memset(huffWeight, 1, hwSize);
1658
1.45k
            iSize = 0;
1659
1.45k
        }
1660
262
        else   /* Incompressible */
1661
262
        {
1662
262
            oSize = iSize - 127;
1663
262
            iSize = ((oSize+1)/2);
1664
262
            if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1665
239
            if (oSize >= hwSize) return ERROR(corruption_detected);
1666
239
            ip += 1;
1667
5.96k
            for (n=0; n<oSize; n+=2)
1668
5.72k
            {
1669
5.72k
                huffWeight[n]   = ip[n/2] >> 4;
1670
5.72k
                huffWeight[n+1] = ip[n/2] & 15;
1671
5.72k
            }
1672
239
        }
1673
1.71k
    }
1674
576
    else  /* header compressed with FSE (normal case) */
1675
576
    {
1676
576
        if (iSize+1 > srcSize) return ERROR(srcSize_wrong);
1677
564
        oSize = FSE_decompress(huffWeight, hwSize-1, ip+1, iSize);   /* max (hwSize-1) values decoded, as last one is implied */
1678
564
        if (FSE_isError(oSize)) return oSize;
1679
564
    }
1680
1681
    /* collect weight stats */
1682
1.80k
    memset(rankStats, 0, (HUF_ABSOLUTEMAX_TABLELOG + 1) * sizeof(U32));
1683
1.80k
    weightTotal = 0;
1684
157k
    for (n=0; n<oSize; n++)
1685
155k
    {
1686
155k
        if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1687
155k
        rankStats[huffWeight[n]]++;
1688
155k
        weightTotal += (1 << huffWeight[n]) >> 1;
1689
155k
    }
1690
1.80k
    if (weightTotal == 0) return ERROR(corruption_detected);
1691
1692
    /* get last non-null symbol weight (implied, total must be 2^n) */
1693
1.79k
    tableLog = BIT_highbit32(weightTotal) + 1;
1694
1.79k
    if (tableLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(corruption_detected);
1695
1.76k
    {
1696
1.76k
        U32 total = 1 << tableLog;
1697
1.76k
        U32 rest = total - weightTotal;
1698
1.76k
        U32 verif = 1 << BIT_highbit32(rest);
1699
1.76k
        U32 lastWeight = BIT_highbit32(rest) + 1;
1700
1.76k
        if (verif != rest) return ERROR(corruption_detected);    /* last value must be a clean power of 2 */
1701
1.73k
        huffWeight[oSize] = (BYTE)lastWeight;
1702
1.73k
        rankStats[lastWeight]++;
1703
1.73k
    }
1704
1705
    /* check tree construction validity */
1706
1.73k
    if ((rankStats[1] < 2) || (rankStats[1] & 1)) return ERROR(corruption_detected);   /* by construction : at least 2 elts of rank 1, must be even */
1707
1708
    /* results */
1709
1.72k
    *nbSymbolsPtr = (U32)(oSize+1);
1710
1.72k
    *tableLogPtr = tableLog;
1711
1.72k
    return iSize+1;
1712
1.73k
}
1713
1714
1715
/**************************/
1716
/* single-symbol decoding */
1717
/**************************/
1718
1719
static size_t HUF_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
1720
1.95k
{
1721
1.95k
    BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
1722
1.95k
    U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];   /* large enough for values from 0 to 16 */
1723
1.95k
    U32 tableLog = 0;
1724
1.95k
    size_t iSize;
1725
1.95k
    U32 nbSymbols = 0;
1726
1.95k
    U32 n;
1727
1.95k
    U32 nextRankStart;
1728
1.95k
    void* const dtPtr = DTable + 1;
1729
1.95k
    HUF_DEltX2* const dt = (HUF_DEltX2*)dtPtr;
1730
1731
1.95k
    HUF_STATIC_ASSERT(sizeof(HUF_DEltX2) == sizeof(U16));   /* if compilation fails here, assertion is false */
1732
    //memset(huffWeight, 0, sizeof(huffWeight));   /* is not necessary, even though some analyzer complain ... */
1733
1734
1.95k
    iSize = HUF_readStats(huffWeight, HUF_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
1735
1.95k
    if (HUF_isError(iSize)) return iSize;
1736
1737
    /* check result */
1738
1.40k
    if (tableLog > DTable[0]) return ERROR(tableLog_tooLarge);   /* DTable is too small */
1739
1.39k
    DTable[0] = (U16)tableLog;   /* maybe should separate sizeof DTable, as allocated, from used size of DTable, in case of DTable re-use */
1740
1741
    /* Prepare ranks */
1742
1.39k
    nextRankStart = 0;
1743
10.9k
    for (n=1; n<=tableLog; n++)
1744
9.52k
    {
1745
9.52k
        U32 current = nextRankStart;
1746
9.52k
        nextRankStart += (rankVal[n] << (n-1));
1747
9.52k
        rankVal[n] = current;
1748
9.52k
    }
1749
1750
    /* fill DTable */
1751
124k
    for (n=0; n<nbSymbols; n++)
1752
123k
    {
1753
123k
        const U32 w = huffWeight[n];
1754
123k
        const U32 length = (1 << w) >> 1;
1755
123k
        U32 i;
1756
123k
        HUF_DEltX2 D;
1757
123k
        D.byte = (BYTE)n; D.nbBits = (BYTE)(tableLog + 1 - w);
1758
440k
        for (i = rankVal[w]; i < rankVal[w] + length; i++)
1759
317k
            dt[i] = D;
1760
123k
        rankVal[w] += length;
1761
123k
    }
1762
1763
1.39k
    return iSize;
1764
1.40k
}
1765
1766
static BYTE HUF_decodeSymbolX2(BIT_DStream_t* Dstream, const HUF_DEltX2* dt, const U32 dtLog)
1767
14.6M
{
1768
14.6M
        const size_t val = BIT_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1769
14.6M
        const BYTE c = dt[val].byte;
1770
14.6M
        BIT_skipBits(Dstream, dt[val].nbBits);
1771
14.6M
        return c;
1772
14.6M
}
1773
1774
#define HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr) \
1775
14.6M
    *ptr++ = HUF_decodeSymbolX2(DStreamPtr, dt, dtLog)
1776
1777
#define HUF_DECODE_SYMBOLX2_1(ptr, DStreamPtr) \
1778
636k
    if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
1779
636k
        HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1780
1781
#define HUF_DECODE_SYMBOLX2_2(ptr, DStreamPtr) \
1782
1.27M
    if (MEM_64bits()) \
1783
1.27M
        HUF_DECODE_SYMBOLX2_0(ptr, DStreamPtr)
1784
1785
static inline size_t HUF_decodeStreamX2(BYTE* p, BIT_DStream_t* const bitDPtr, BYTE* const pEnd, const HUF_DEltX2* const dt, const U32 dtLog)
1786
4.63k
{
1787
4.63k
    BYTE* const pStart = p;
1788
1789
    /* up to 4 symbols at a time */
1790
493k
    while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-4))
1791
488k
    {
1792
488k
        HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1793
488k
        HUF_DECODE_SYMBOLX2_1(p, bitDPtr);
1794
488k
        HUF_DECODE_SYMBOLX2_2(p, bitDPtr);
1795
488k
        HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1796
488k
    }
1797
1798
    /* closer to the end */
1799
4.93k
    while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd))
1800
301
        HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1801
1802
    /* no more data to retrieve from bitstream, hence no need to reload */
1803
12.1M
    while (p < pEnd)
1804
12.1M
        HUF_DECODE_SYMBOLX2_0(p, bitDPtr);
1805
1806
4.63k
    return pEnd-pStart;
1807
4.63k
}
1808
1809
1810
static size_t HUF_decompress4X2_usingDTable(
1811
          void* dst,  size_t dstSize,
1812
    const void* cSrc, size_t cSrcSize,
1813
    const U16* DTable)
1814
1.36k
{
1815
1.36k
    if (cSrcSize < 10) return ERROR(corruption_detected);   /* strict minimum : jump table + 1 byte per stream */
1816
1817
1.32k
    {
1818
1.32k
        const BYTE* const istart = (const BYTE*) cSrc;
1819
1.32k
        BYTE* const ostart = (BYTE*) dst;
1820
1.32k
        BYTE* const oend = ostart + dstSize;
1821
1.32k
        const void* const dtPtr = DTable;
1822
1.32k
        const HUF_DEltX2* const dt = ((const HUF_DEltX2*)dtPtr) +1;
1823
1.32k
        const U32 dtLog = DTable[0];
1824
1.32k
        size_t errorCode;
1825
1826
        /* Init */
1827
1.32k
        BIT_DStream_t bitD1;
1828
1.32k
        BIT_DStream_t bitD2;
1829
1.32k
        BIT_DStream_t bitD3;
1830
1.32k
        BIT_DStream_t bitD4;
1831
1.32k
        const size_t length1 = MEM_readLE16(istart);
1832
1.32k
        const size_t length2 = MEM_readLE16(istart+2);
1833
1.32k
        const size_t length3 = MEM_readLE16(istart+4);
1834
1.32k
        size_t length4;
1835
1.32k
        const BYTE* const istart1 = istart + 6;  /* jumpTable */
1836
1.32k
        const BYTE* const istart2 = istart1 + length1;
1837
1.32k
        const BYTE* const istart3 = istart2 + length2;
1838
1.32k
        const BYTE* const istart4 = istart3 + length3;
1839
1.32k
        const size_t segmentSize = (dstSize+3) / 4;
1840
1.32k
        BYTE* const opStart2 = ostart + segmentSize;
1841
1.32k
        BYTE* const opStart3 = opStart2 + segmentSize;
1842
1.32k
        BYTE* const opStart4 = opStart3 + segmentSize;
1843
1.32k
        BYTE* op1 = ostart;
1844
1.32k
        BYTE* op2 = opStart2;
1845
1.32k
        BYTE* op3 = opStart3;
1846
1.32k
        BYTE* op4 = opStart4;
1847
1.32k
        U32 endSignal;
1848
1849
1.32k
        length4 = cSrcSize - (length1 + length2 + length3 + 6);
1850
1.32k
        if (length4 > cSrcSize) return ERROR(corruption_detected);   /* overflow */
1851
1.25k
        errorCode = BIT_initDStream(&bitD1, istart1, length1);
1852
1.25k
        if (HUF_isError(errorCode)) return errorCode;
1853
1.24k
        errorCode = BIT_initDStream(&bitD2, istart2, length2);
1854
1.24k
        if (HUF_isError(errorCode)) return errorCode;
1855
1.21k
        errorCode = BIT_initDStream(&bitD3, istart3, length3);
1856
1.21k
        if (HUF_isError(errorCode)) return errorCode;
1857
1.18k
        errorCode = BIT_initDStream(&bitD4, istart4, length4);
1858
1.18k
        if (HUF_isError(errorCode)) return errorCode;
1859
1860
        /* 16-32 symbols per loop (4-8 symbols per stream) */
1861
1.15k
        endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1862
38.0k
        for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
1863
36.9k
        {
1864
36.9k
            HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1865
36.9k
            HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1866
36.9k
            HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1867
36.9k
            HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1868
36.9k
            HUF_DECODE_SYMBOLX2_1(op1, &bitD1);
1869
36.9k
            HUF_DECODE_SYMBOLX2_1(op2, &bitD2);
1870
36.9k
            HUF_DECODE_SYMBOLX2_1(op3, &bitD3);
1871
36.9k
            HUF_DECODE_SYMBOLX2_1(op4, &bitD4);
1872
36.9k
            HUF_DECODE_SYMBOLX2_2(op1, &bitD1);
1873
36.9k
            HUF_DECODE_SYMBOLX2_2(op2, &bitD2);
1874
36.9k
            HUF_DECODE_SYMBOLX2_2(op3, &bitD3);
1875
36.9k
            HUF_DECODE_SYMBOLX2_2(op4, &bitD4);
1876
36.9k
            HUF_DECODE_SYMBOLX2_0(op1, &bitD1);
1877
36.9k
            HUF_DECODE_SYMBOLX2_0(op2, &bitD2);
1878
36.9k
            HUF_DECODE_SYMBOLX2_0(op3, &bitD3);
1879
36.9k
            HUF_DECODE_SYMBOLX2_0(op4, &bitD4);
1880
1881
36.9k
            endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
1882
36.9k
        }
1883
1884
        /* check corruption */
1885
1.15k
        if (op1 > opStart2) return ERROR(corruption_detected);
1886
1.15k
        if (op2 > opStart3) return ERROR(corruption_detected);
1887
1.15k
        if (op3 > opStart4) return ERROR(corruption_detected);
1888
        /* note : op4 supposed already verified within main loop */
1889
1890
        /* finish bitStreams one by one */
1891
1.15k
        HUF_decodeStreamX2(op1, &bitD1, opStart2, dt, dtLog);
1892
1.15k
        HUF_decodeStreamX2(op2, &bitD2, opStart3, dt, dtLog);
1893
1.15k
        HUF_decodeStreamX2(op3, &bitD3, opStart4, dt, dtLog);
1894
1.15k
        HUF_decodeStreamX2(op4, &bitD4, oend,     dt, dtLog);
1895
1896
        /* check */
1897
1.15k
        endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
1898
1.15k
        if (!endSignal) return ERROR(corruption_detected);
1899
1900
        /* decoded size */
1901
803
        return dstSize;
1902
1.15k
    }
1903
1.15k
}
1904
1905
1906
static size_t HUF_decompress4X2 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
1907
1.95k
{
1908
1.95k
    HUF_CREATE_STATIC_DTABLEX2(DTable, HUF_MAX_TABLELOG);
1909
1.95k
    const BYTE* ip = (const BYTE*) cSrc;
1910
1.95k
    size_t errorCode;
1911
1912
1.95k
    errorCode = HUF_readDTableX2 (DTable, cSrc, cSrcSize);
1913
1.95k
    if (HUF_isError(errorCode)) return errorCode;
1914
1.39k
    if (errorCode >= cSrcSize) return ERROR(srcSize_wrong);
1915
1.36k
    ip += errorCode;
1916
1.36k
    cSrcSize -= errorCode;
1917
1918
1.36k
    return HUF_decompress4X2_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
1919
1.39k
}
1920
1921
1922
/***************************/
1923
/* double-symbols decoding */
1924
/***************************/
1925
1926
static void HUF_fillDTableX4Level2(HUF_DEltX4* DTable, U32 sizeLog, const U32 consumed,
1927
                           const U32* rankValOrigin, const int minWeight,
1928
                           const sortedSymbol_t* sortedSymbols, const U32 sortedListSize,
1929
                           U32 nbBitsBaseline, U16 baseSeq)
1930
20.3k
{
1931
20.3k
    HUF_DEltX4 DElt;
1932
20.3k
    U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1933
20.3k
    U32 s;
1934
1935
    /* get pre-calculated rankVal */
1936
20.3k
    memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1937
1938
    /* fill skipped values */
1939
20.3k
    if (minWeight>1)
1940
19.0k
    {
1941
19.0k
        U32 i, skipSize = rankVal[minWeight];
1942
19.0k
        MEM_writeLE16(&(DElt.sequence), baseSeq);
1943
19.0k
        DElt.nbBits   = (BYTE)(consumed);
1944
19.0k
        DElt.length   = 1;
1945
176k
        for (i = 0; i < skipSize; i++)
1946
157k
            DTable[i] = DElt;
1947
19.0k
    }
1948
1949
    /* fill DTable */
1950
114k
    for (s=0; s<sortedListSize; s++)   /* note : sortedSymbols already skipped */
1951
94.5k
    {
1952
94.5k
        const U32 symbol = sortedSymbols[s].symbol;
1953
94.5k
        const U32 weight = sortedSymbols[s].weight;
1954
94.5k
        const U32 nbBits = nbBitsBaseline - weight;
1955
94.5k
        const U32 length = 1 << (sizeLog-nbBits);
1956
94.5k
        const U32 start = rankVal[weight];
1957
94.5k
        U32 i = start;
1958
94.5k
        const U32 end = start + length;
1959
1960
94.5k
        MEM_writeLE16(&(DElt.sequence), (U16)(baseSeq + (symbol << 8)));
1961
94.5k
        DElt.nbBits = (BYTE)(nbBits + consumed);
1962
94.5k
        DElt.length = 2;
1963
1.05M
        do { DTable[i++] = DElt; } while (i<end);   /* since length >= 1 */
1964
1965
94.5k
        rankVal[weight] += length;
1966
94.5k
    }
1967
20.3k
}
1968
1969
typedef U32 rankVal_t[HUF_ABSOLUTEMAX_TABLELOG][HUF_ABSOLUTEMAX_TABLELOG + 1];
1970
1971
static void HUF_fillDTableX4(HUF_DEltX4* DTable, const U32 targetLog,
1972
                           const sortedSymbol_t* sortedList, const U32 sortedListSize,
1973
                           const U32* rankStart, rankVal_t rankValOrigin, const U32 maxWeight,
1974
                           const U32 nbBitsBaseline)
1975
321
{
1976
321
    U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];
1977
321
    const int scaleLog = nbBitsBaseline - targetLog;   /* note : targetLog >= srcLog, hence scaleLog <= 1 */
1978
321
    const U32 minBits  = nbBitsBaseline - maxWeight;
1979
321
    U32 s;
1980
1981
321
    memcpy(rankVal, rankValOrigin, sizeof(rankVal));
1982
1983
    /* fill DTable */
1984
26.2k
    for (s=0; s<sortedListSize; s++)
1985
25.8k
    {
1986
25.8k
        const U16 symbol = sortedList[s].symbol;
1987
25.8k
        const U32 weight = sortedList[s].weight;
1988
25.8k
        const U32 nbBits = nbBitsBaseline - weight;
1989
25.8k
        const U32 start = rankVal[weight];
1990
25.8k
        const U32 length = 1 << (targetLog-nbBits);
1991
1992
25.8k
        if (targetLog-nbBits >= minBits)   /* enough room for a second symbol */
1993
20.3k
        {
1994
20.3k
            U32 sortedRank;
1995
20.3k
            int minWeight = nbBits + scaleLog;
1996
20.3k
            if (minWeight < 1) minWeight = 1;
1997
20.3k
            sortedRank = rankStart[minWeight];
1998
20.3k
            HUF_fillDTableX4Level2(DTable+start, targetLog-nbBits, nbBits,
1999
20.3k
                           rankValOrigin[nbBits], minWeight,
2000
20.3k
                           sortedList+sortedRank, sortedListSize-sortedRank,
2001
20.3k
                           nbBitsBaseline, symbol);
2002
20.3k
        }
2003
5.54k
        else
2004
5.54k
        {
2005
5.54k
            U32 i;
2006
5.54k
            const U32 end = start + length;
2007
5.54k
            HUF_DEltX4 DElt;
2008
2009
5.54k
            MEM_writeLE16(&(DElt.sequence), symbol);
2010
5.54k
            DElt.nbBits   = (BYTE)(nbBits);
2011
5.54k
            DElt.length   = 1;
2012
107k
            for (i = start; i < end; i++)
2013
101k
                DTable[i] = DElt;
2014
5.54k
        }
2015
25.8k
        rankVal[weight] += length;
2016
25.8k
    }
2017
321
}
2018
2019
static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
2020
342
{
2021
342
    BYTE weightList[HUF_MAX_SYMBOL_VALUE + 1];
2022
342
    sortedSymbol_t sortedSymbol[HUF_MAX_SYMBOL_VALUE + 1];
2023
342
    U32 rankStats[HUF_ABSOLUTEMAX_TABLELOG + 1] = { 0 };
2024
342
    U32 rankStart0[HUF_ABSOLUTEMAX_TABLELOG + 2] = { 0 };
2025
342
    U32* const rankStart = rankStart0+1;
2026
342
    rankVal_t rankVal;
2027
342
    U32 tableLog, maxW, sizeOfSort, nbSymbols;
2028
342
    const U32 memLog = DTable[0];
2029
342
    size_t iSize;
2030
342
    void* dtPtr = DTable;
2031
342
    HUF_DEltX4* const dt = ((HUF_DEltX4*)dtPtr) + 1;
2032
2033
342
    HUF_STATIC_ASSERT(sizeof(HUF_DEltX4) == sizeof(U32));   /* if compilation fails here, assertion is false */
2034
342
    if (memLog > HUF_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
2035
    //memset(weightList, 0, sizeof(weightList));   /* is not necessary, even though some analyzer complain ... */
2036
2037
342
    iSize = HUF_readStats(weightList, HUF_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
2038
342
    if (HUF_isError(iSize)) return iSize;
2039
2040
    /* check result */
2041
325
    if (tableLog > memLog) return ERROR(tableLog_tooLarge);   /* DTable can't fit code depth */
2042
2043
    /* find maxWeight */
2044
574
    for (maxW = tableLog; rankStats[maxW]==0; maxW--)
2045
253
        { if (!maxW) return ERROR(GENERIC); }  /* necessarily finds a solution before maxW==0 */
2046
2047
    /* Get start index of each weight */
2048
321
    {
2049
321
        U32 w, nextRankStart = 0;
2050
2.55k
        for (w=1; w<=maxW; w++)
2051
2.23k
        {
2052
2.23k
            U32 current = nextRankStart;
2053
2.23k
            nextRankStart += rankStats[w];
2054
2.23k
            rankStart[w] = current;
2055
2.23k
        }
2056
321
        rankStart[0] = nextRankStart;   /* put all 0w symbols at the end of sorted list*/
2057
321
        sizeOfSort = nextRankStart;
2058
321
    }
2059
2060
    /* sort symbols by weight */
2061
321
    {
2062
321
        U32 s;
2063
31.8k
        for (s=0; s<nbSymbols; s++)
2064
31.5k
        {
2065
31.5k
            U32 w = weightList[s];
2066
31.5k
            U32 r = rankStart[w]++;
2067
31.5k
            sortedSymbol[r].symbol = (BYTE)s;
2068
31.5k
            sortedSymbol[r].weight = (BYTE)w;
2069
31.5k
        }
2070
321
        rankStart[0] = 0;   /* forget 0w symbols; this is beginning of weight(1) */
2071
321
    }
2072
2073
    /* Build rankVal */
2074
321
    {
2075
321
        const U32 minBits = tableLog+1 - maxW;
2076
321
        U32 nextRankVal = 0;
2077
321
        U32 w, consumed;
2078
321
        const int rescale = (memLog-tableLog) - 1;   /* tableLog <= memLog */
2079
321
        U32* rankVal0 = rankVal[0];
2080
2.55k
        for (w=1; w<=maxW; w++)
2081
2.23k
        {
2082
2.23k
            U32 current = nextRankVal;
2083
2.23k
            nextRankVal += rankStats[w] << (w+rescale);
2084
2.23k
            rankVal0[w] = current;
2085
2.23k
        }
2086
3.35k
        for (consumed = minBits; consumed <= memLog - minBits; consumed++)
2087
3.03k
        {
2088
3.03k
            U32* rankValPtr = rankVal[consumed];
2089
25.6k
            for (w = 1; w <= maxW; w++)
2090
22.6k
            {
2091
22.6k
                rankValPtr[w] = rankVal0[w] >> consumed;
2092
22.6k
            }
2093
3.03k
        }
2094
321
    }
2095
2096
321
    HUF_fillDTableX4(dt, memLog,
2097
321
                   sortedSymbol, sizeOfSort,
2098
321
                   rankStart0, rankVal, maxW,
2099
321
                   tableLog+1);
2100
2101
321
    return iSize;
2102
321
}
2103
2104
2105
static U32 HUF_decodeSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2106
2.31M
{
2107
2.31M
    const size_t val = BIT_lookBitsFast(DStream, dtLog);   /* note : dtLog >= 1 */
2108
2.31M
    memcpy(op, dt+val, 2);
2109
2.31M
    BIT_skipBits(DStream, dt[val].nbBits);
2110
2.31M
    return dt[val].length;
2111
2.31M
}
2112
2113
static U32 HUF_decodeLastSymbolX4(void* op, BIT_DStream_t* DStream, const HUF_DEltX4* dt, const U32 dtLog)
2114
452
{
2115
452
    const size_t val = BIT_lookBitsFast(DStream, dtLog);   /* note : dtLog >= 1 */
2116
452
    memcpy(op, dt+val, 1);
2117
452
    if (dt[val].length==1) BIT_skipBits(DStream, dt[val].nbBits);
2118
295
    else
2119
295
    {
2120
295
        if (DStream->bitsConsumed < (sizeof(DStream->bitContainer)*8))
2121
148
        {
2122
148
            BIT_skipBits(DStream, dt[val].nbBits);
2123
148
            if (DStream->bitsConsumed > (sizeof(DStream->bitContainer)*8))
2124
28
                DStream->bitsConsumed = (sizeof(DStream->bitContainer)*8);   /* ugly hack; works only because it's the last symbol. Note : can't easily extract nbBits from just this symbol */
2125
148
        }
2126
295
    }
2127
452
    return 1;
2128
452
}
2129
2130
2131
#define HUF_DECODE_SYMBOLX4_0(ptr, DStreamPtr) \
2132
1.32M
    ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2133
2134
#define HUF_DECODE_SYMBOLX4_1(ptr, DStreamPtr) \
2135
328k
    if (MEM_64bits() || (HUF_MAX_TABLELOG<=12)) \
2136
328k
        ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2137
2138
#define HUF_DECODE_SYMBOLX4_2(ptr, DStreamPtr) \
2139
657k
    if (MEM_64bits()) \
2140
657k
        ptr += HUF_decodeSymbolX4(ptr, DStreamPtr, dt, dtLog)
2141
2142
static inline size_t HUF_decodeStreamX4(BYTE* p, BIT_DStream_t* bitDPtr, BYTE* const pEnd, const HUF_DEltX4* const dt, const U32 dtLog)
2143
736
{
2144
736
    BYTE* const pStart = p;
2145
2146
    /* up to 8 symbols at a time */
2147
242k
    while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p < pEnd-7))
2148
241k
    {
2149
241k
        HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2150
241k
        HUF_DECODE_SYMBOLX4_1(p, bitDPtr);
2151
241k
        HUF_DECODE_SYMBOLX4_2(p, bitDPtr);
2152
241k
        HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2153
241k
    }
2154
2155
    /* closer to the end */
2156
1.16k
    while ((BIT_reloadDStream(bitDPtr) == BIT_DStream_unfinished) && (p <= pEnd-2))
2157
427
        HUF_DECODE_SYMBOLX4_0(p, bitDPtr);
2158
2159
995k
    while (p <= pEnd-2)
2160
994k
        HUF_DECODE_SYMBOLX4_0(p, bitDPtr);   /* no need to reload : reached the end of DStream */
2161
2162
736
    if (p < pEnd)
2163
452
        p += HUF_decodeLastSymbolX4(p, bitDPtr, dt, dtLog);
2164
2165
736
    return p-pStart;
2166
736
}
2167
2168
static size_t HUF_decompress4X4_usingDTable(
2169
          void* dst,  size_t dstSize,
2170
    const void* cSrc, size_t cSrcSize,
2171
    const U32* DTable)
2172
321
{
2173
321
    if (cSrcSize < 10) return ERROR(corruption_detected);   /* strict minimum : jump table + 1 byte per stream */
2174
2175
321
    {
2176
321
        const BYTE* const istart = (const BYTE*) cSrc;
2177
321
        BYTE* const ostart = (BYTE*) dst;
2178
321
        BYTE* const oend = ostart + dstSize;
2179
321
        const void* const dtPtr = DTable;
2180
321
        const HUF_DEltX4* const dt = ((const HUF_DEltX4*)dtPtr) +1;
2181
321
        const U32 dtLog = DTable[0];
2182
321
        size_t errorCode;
2183
2184
        /* Init */
2185
321
        BIT_DStream_t bitD1;
2186
321
        BIT_DStream_t bitD2;
2187
321
        BIT_DStream_t bitD3;
2188
321
        BIT_DStream_t bitD4;
2189
321
        const size_t length1 = MEM_readLE16(istart);
2190
321
        const size_t length2 = MEM_readLE16(istart+2);
2191
321
        const size_t length3 = MEM_readLE16(istart+4);
2192
321
        size_t length4;
2193
321
        const BYTE* const istart1 = istart + 6;  /* jumpTable */
2194
321
        const BYTE* const istart2 = istart1 + length1;
2195
321
        const BYTE* const istart3 = istart2 + length2;
2196
321
        const BYTE* const istart4 = istart3 + length3;
2197
321
        const size_t segmentSize = (dstSize+3) / 4;
2198
321
        BYTE* const opStart2 = ostart + segmentSize;
2199
321
        BYTE* const opStart3 = opStart2 + segmentSize;
2200
321
        BYTE* const opStart4 = opStart3 + segmentSize;
2201
321
        BYTE* op1 = ostart;
2202
321
        BYTE* op2 = opStart2;
2203
321
        BYTE* op3 = opStart3;
2204
321
        BYTE* op4 = opStart4;
2205
321
        U32 endSignal;
2206
2207
321
        length4 = cSrcSize - (length1 + length2 + length3 + 6);
2208
321
        if (length4 > cSrcSize) return ERROR(corruption_detected);   /* overflow */
2209
244
        errorCode = BIT_initDStream(&bitD1, istart1, length1);
2210
244
        if (HUF_isError(errorCode)) return errorCode;
2211
223
        errorCode = BIT_initDStream(&bitD2, istart2, length2);
2212
223
        if (HUF_isError(errorCode)) return errorCode;
2213
212
        errorCode = BIT_initDStream(&bitD3, istart3, length3);
2214
212
        if (HUF_isError(errorCode)) return errorCode;
2215
197
        errorCode = BIT_initDStream(&bitD4, istart4, length4);
2216
197
        if (HUF_isError(errorCode)) return errorCode;
2217
2218
        /* 16-32 symbols per loop (4-8 symbols per stream) */
2219
191
        endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2220
22.1k
        for ( ; (endSignal==BIT_DStream_unfinished) && (op4<(oend-7)) ; )
2221
21.9k
        {
2222
21.9k
            HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2223
21.9k
            HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2224
21.9k
            HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2225
21.9k
            HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2226
21.9k
            HUF_DECODE_SYMBOLX4_1(op1, &bitD1);
2227
21.9k
            HUF_DECODE_SYMBOLX4_1(op2, &bitD2);
2228
21.9k
            HUF_DECODE_SYMBOLX4_1(op3, &bitD3);
2229
21.9k
            HUF_DECODE_SYMBOLX4_1(op4, &bitD4);
2230
21.9k
            HUF_DECODE_SYMBOLX4_2(op1, &bitD1);
2231
21.9k
            HUF_DECODE_SYMBOLX4_2(op2, &bitD2);
2232
21.9k
            HUF_DECODE_SYMBOLX4_2(op3, &bitD3);
2233
21.9k
            HUF_DECODE_SYMBOLX4_2(op4, &bitD4);
2234
21.9k
            HUF_DECODE_SYMBOLX4_0(op1, &bitD1);
2235
21.9k
            HUF_DECODE_SYMBOLX4_0(op2, &bitD2);
2236
21.9k
            HUF_DECODE_SYMBOLX4_0(op3, &bitD3);
2237
21.9k
            HUF_DECODE_SYMBOLX4_0(op4, &bitD4);
2238
2239
21.9k
            endSignal = BIT_reloadDStream(&bitD1) | BIT_reloadDStream(&bitD2) | BIT_reloadDStream(&bitD3) | BIT_reloadDStream(&bitD4);
2240
21.9k
        }
2241
2242
        /* check corruption */
2243
191
        if (op1 > opStart2) return ERROR(corruption_detected);
2244
189
        if (op2 > opStart3) return ERROR(corruption_detected);
2245
187
        if (op3 > opStart4) return ERROR(corruption_detected);
2246
        /* note : op4 supposed already verified within main loop */
2247
2248
        /* finish bitStreams one by one */
2249
184
        HUF_decodeStreamX4(op1, &bitD1, opStart2, dt, dtLog);
2250
184
        HUF_decodeStreamX4(op2, &bitD2, opStart3, dt, dtLog);
2251
184
        HUF_decodeStreamX4(op3, &bitD3, opStart4, dt, dtLog);
2252
184
        HUF_decodeStreamX4(op4, &bitD4, oend,     dt, dtLog);
2253
2254
        /* check */
2255
184
        endSignal = BIT_endOfDStream(&bitD1) & BIT_endOfDStream(&bitD2) & BIT_endOfDStream(&bitD3) & BIT_endOfDStream(&bitD4);
2256
184
        if (!endSignal) return ERROR(corruption_detected);
2257
2258
        /* decoded size */
2259
3
        return dstSize;
2260
184
    }
2261
184
}
2262
2263
2264
static size_t HUF_decompress4X4 (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2265
342
{
2266
342
    HUF_CREATE_STATIC_DTABLEX4(DTable, HUF_MAX_TABLELOG);
2267
342
    const BYTE* ip = (const BYTE*) cSrc;
2268
2269
342
    size_t hSize = HUF_readDTableX4 (DTable, cSrc, cSrcSize);
2270
342
    if (HUF_isError(hSize)) return hSize;
2271
321
    if (hSize >= cSrcSize) return ERROR(srcSize_wrong);
2272
321
    ip += hSize;
2273
321
    cSrcSize -= hSize;
2274
2275
321
    return HUF_decompress4X4_usingDTable (dst, dstSize, ip, cSrcSize, DTable);
2276
321
}
2277
2278
2279
/**********************************/
2280
/* Generic decompression selector */
2281
/**********************************/
2282
2283
typedef struct { U32 tableTime; U32 decode256Time; } algo_time_t;
2284
static const algo_time_t algoTime[16 /* Quantization */][3 /* single, double, quad */] =
2285
{
2286
    /* single, double, quad */
2287
    {{0,0}, {1,1}, {2,2}},  /* Q==0 : impossible */
2288
    {{0,0}, {1,1}, {2,2}},  /* Q==1 : impossible */
2289
    {{  38,130}, {1313, 74}, {2151, 38}},   /* Q == 2 : 12-18% */
2290
    {{ 448,128}, {1353, 74}, {2238, 41}},   /* Q == 3 : 18-25% */
2291
    {{ 556,128}, {1353, 74}, {2238, 47}},   /* Q == 4 : 25-32% */
2292
    {{ 714,128}, {1418, 74}, {2436, 53}},   /* Q == 5 : 32-38% */
2293
    {{ 883,128}, {1437, 74}, {2464, 61}},   /* Q == 6 : 38-44% */
2294
    {{ 897,128}, {1515, 75}, {2622, 68}},   /* Q == 7 : 44-50% */
2295
    {{ 926,128}, {1613, 75}, {2730, 75}},   /* Q == 8 : 50-56% */
2296
    {{ 947,128}, {1729, 77}, {3359, 77}},   /* Q == 9 : 56-62% */
2297
    {{1107,128}, {2083, 81}, {4006, 84}},   /* Q ==10 : 62-69% */
2298
    {{1177,128}, {2379, 87}, {4785, 88}},   /* Q ==11 : 69-75% */
2299
    {{1242,128}, {2415, 93}, {5155, 84}},   /* Q ==12 : 75-81% */
2300
    {{1349,128}, {2644,106}, {5260,106}},   /* Q ==13 : 81-87% */
2301
    {{1455,128}, {2422,124}, {4174,124}},   /* Q ==14 : 87-93% */
2302
    {{ 722,128}, {1891,145}, {1936,146}},   /* Q ==15 : 93-99% */
2303
};
2304
2305
typedef size_t (*decompressionAlgo)(void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize);
2306
2307
static size_t HUF_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
2308
2.75k
{
2309
2.75k
    static const decompressionAlgo decompress[3] = { HUF_decompress4X2, HUF_decompress4X4, NULL };
2310
    /* estimate decompression time */
2311
2.75k
    U32 Q;
2312
2.75k
    const U32 D256 = (U32)(dstSize >> 8);
2313
2.75k
    U32 Dtime[3];
2314
2.75k
    U32 algoNb = 0;
2315
2.75k
    int n;
2316
2317
    /* validation checks */
2318
2.75k
    if (dstSize == 0) return ERROR(dstSize_tooSmall);
2319
2.75k
    if (cSrcSize > dstSize) return ERROR(corruption_detected);   /* invalid */
2320
2.73k
    if (cSrcSize == dstSize) { memcpy(dst, cSrc, dstSize); return dstSize; }   /* not compressed */
2321
2.50k
    if (cSrcSize == 1) { memset(dst, *(const BYTE*)cSrc, dstSize); return dstSize; }   /* RLE */
2322
2323
    /* decoder timing evaluation */
2324
2.29k
    Q = (U32)(cSrcSize * 16 / dstSize);   /* Q < 16 since dstSize > cSrcSize */
2325
9.19k
    for (n=0; n<3; n++)
2326
6.89k
        Dtime[n] = algoTime[Q][n].tableTime + (algoTime[Q][n].decode256Time * D256);
2327
2328
2.29k
    Dtime[1] += Dtime[1] >> 4; Dtime[2] += Dtime[2] >> 3; /* advantage to algorithms using less memory, for cache eviction */
2329
2330
2.29k
    if (Dtime[1] < Dtime[0]) algoNb = 1;
2331
2332
2.29k
    return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
2333
2334
    //return HUF_decompress4X2(dst, dstSize, cSrc, cSrcSize);   /* multi-streams single-symbol decoding */
2335
    //return HUF_decompress4X4(dst, dstSize, cSrc, cSrcSize);   /* multi-streams double-symbols decoding */
2336
    //return HUF_decompress4X6(dst, dstSize, cSrc, cSrcSize);   /* multi-streams quad-symbols decoding */
2337
2.50k
}
2338
2339
2340
2341
#endif   /* ZSTD_CCOMMON_H_MODULE */
2342
2343
2344
/*
2345
    zstd - decompression module fo v0.4 legacy format
2346
    Copyright (C) 2015-2016, Yann Collet.
2347
2348
    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
2349
2350
    Redistribution and use in source and binary forms, with or without
2351
    modification, are permitted provided that the following conditions are
2352
    met:
2353
    * Redistributions of source code must retain the above copyright
2354
    notice, this list of conditions and the following disclaimer.
2355
    * Redistributions in binary form must reproduce the above
2356
    copyright notice, this list of conditions and the following disclaimer
2357
    in the documentation and/or other materials provided with the
2358
    distribution.
2359
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2360
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2361
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2362
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2363
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2364
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2365
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2366
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2367
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2368
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2369
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2370
2371
    You can contact the author at :
2372
    - zstd source repository : https://github.com/Cyan4973/zstd
2373
    - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
2374
*/
2375
2376
/* ***************************************************************
2377
*  Tuning parameters
2378
*****************************************************************/
2379
/*!
2380
 * HEAPMODE :
2381
 * Select how default decompression function ZSTD_decompress() will allocate memory,
2382
 * in memory stack (0), or in memory heap (1, requires malloc())
2383
 */
2384
#ifndef ZSTD_HEAPMODE
2385
#  define ZSTD_HEAPMODE 1
2386
#endif
2387
2388
2389
/* *******************************************************
2390
*  Includes
2391
*********************************************************/
2392
#include <stdlib.h>      /* calloc */
2393
#include <string.h>      /* memcpy, memmove */
2394
#include <stdio.h>       /* debug : printf */
2395
2396
2397
/* *******************************************************
2398
*  Compiler specifics
2399
*********************************************************/
2400
#ifdef _MSC_VER    /* Visual Studio */
2401
#  include <intrin.h>                    /* For Visual 2005 */
2402
#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
2403
#  pragma warning(disable : 4324)        /* disable: C4324: padded structure */
2404
#endif
2405
2406
2407
/* *************************************
2408
*  Local types
2409
***************************************/
2410
typedef struct
2411
{
2412
    blockType_t blockType;
2413
    U32 origSize;
2414
} blockProperties_t;
2415
2416
2417
/* *******************************************************
2418
*  Memory operations
2419
**********************************************************/
2420
3.41M
static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
2421
2422
2423
/* *************************************
2424
*  Error Management
2425
***************************************/
2426
2427
/*! ZSTD_isError
2428
*   tells if a return value is an error code */
2429
3.58M
static unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
2430
2431
2432
/* *************************************************************
2433
*   Context management
2434
***************************************************************/
2435
typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
2436
               ZSTDds_decodeBlockHeader, ZSTDds_decompressBlock } ZSTD_dStage;
2437
2438
struct ZSTDv04_Dctx_s
2439
{
2440
    U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
2441
    U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
2442
    U32 MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
2443
    const void* previousDstEnd;
2444
    const void* base;
2445
    const void* vBase;
2446
    const void* dictEnd;
2447
    size_t expected;
2448
    size_t headerSize;
2449
    ZSTD_parameters params;
2450
    blockType_t bType;
2451
    ZSTD_dStage stage;
2452
    const BYTE* litPtr;
2453
    size_t litSize;
2454
    BYTE litBuffer[BLOCKSIZE + 8 /* margin for wildcopy */];
2455
    BYTE headerBuffer[ZSTD_frameHeaderSize_max];
2456
};  /* typedef'd to ZSTD_DCtx within "zstd_static.h" */
2457
2458
static size_t ZSTD_resetDCtx(ZSTD_DCtx* dctx)
2459
15.3k
{
2460
15.3k
    dctx->expected = ZSTD_frameHeaderSize_min;
2461
15.3k
    dctx->stage = ZSTDds_getFrameHeaderSize;
2462
15.3k
    dctx->previousDstEnd = NULL;
2463
15.3k
    dctx->base = NULL;
2464
15.3k
    dctx->vBase = NULL;
2465
15.3k
    dctx->dictEnd = NULL;
2466
15.3k
    return 0;
2467
15.3k
}
2468
2469
static ZSTD_DCtx* ZSTD_createDCtx(void)
2470
7.29k
{
2471
7.29k
    ZSTD_DCtx* dctx = (ZSTD_DCtx*)malloc(sizeof(ZSTD_DCtx));
2472
7.29k
    if (dctx==NULL) return NULL;
2473
7.29k
    ZSTD_resetDCtx(dctx);
2474
7.29k
    return dctx;
2475
7.29k
}
2476
2477
static size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx)
2478
7.29k
{
2479
7.29k
    free(dctx);
2480
7.29k
    return 0;
2481
7.29k
}
2482
2483
2484
/* *************************************************************
2485
*   Decompression section
2486
***************************************************************/
2487
/** ZSTD_decodeFrameHeader_Part1
2488
*   decode the 1st part of the Frame Header, which tells Frame Header size.
2489
*   srcSize must be == ZSTD_frameHeaderSize_min
2490
*   @return : the full size of the Frame Header */
2491
static size_t ZSTD_decodeFrameHeader_Part1(ZSTD_DCtx* zc, const void* src, size_t srcSize)
2492
8.04k
{
2493
8.04k
    U32 magicNumber;
2494
8.04k
    if (srcSize != ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);
2495
8.04k
    magicNumber = MEM_readLE32(src);
2496
8.04k
    if (magicNumber != ZSTD_MAGICNUMBER) return ERROR(prefix_unknown);
2497
8.04k
    zc->headerSize = ZSTD_frameHeaderSize_min;
2498
8.04k
    return zc->headerSize;
2499
8.04k
}
2500
2501
2502
static size_t ZSTD_getFrameParams(ZSTD_parameters* params, const void* src, size_t srcSize)
2503
11.3k
{
2504
11.3k
    U32 magicNumber;
2505
11.3k
    if (srcSize < ZSTD_frameHeaderSize_min) return ZSTD_frameHeaderSize_max;
2506
11.0k
    magicNumber = MEM_readLE32(src);
2507
11.0k
    if (magicNumber != ZSTD_MAGICNUMBER) return ERROR(prefix_unknown);
2508
11.0k
    memset(params, 0, sizeof(*params));
2509
11.0k
    params->windowLog = (((const BYTE*)src)[4] & 15) + ZSTD_WINDOWLOG_ABSOLUTEMIN;
2510
11.0k
    if ((((const BYTE*)src)[4] >> 4) != 0) return ERROR(frameParameter_unsupported);   /* reserved bits */
2511
11.0k
    return 0;
2512
11.0k
}
2513
2514
/** ZSTD_decodeFrameHeader_Part2
2515
*   decode the full Frame Header
2516
*   srcSize must be the size provided by ZSTD_decodeFrameHeader_Part1
2517
*   @return : 0, or an error code, which can be tested using ZSTD_isError() */
2518
static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_t srcSize)
2519
8.04k
{
2520
8.04k
    size_t result;
2521
8.04k
    if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
2522
8.04k
    result = ZSTD_getFrameParams(&(zc->params), src, srcSize);
2523
8.04k
    if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupported);
2524
8.04k
    return result;
2525
8.04k
}
2526
2527
2528
static size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
2529
50.9k
{
2530
50.9k
    const BYTE* const in = (const BYTE* const)src;
2531
50.9k
    BYTE headerFlags;
2532
50.9k
    U32 cSize;
2533
2534
50.9k
    if (srcSize < 3) return ERROR(srcSize_wrong);
2535
2536
50.8k
    headerFlags = *in;
2537
50.8k
    cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
2538
2539
50.8k
    bpPtr->blockType = (blockType_t)(headerFlags >> 6);
2540
50.8k
    bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
2541
2542
50.8k
    if (bpPtr->blockType == bt_end) return 0;
2543
44.0k
    if (bpPtr->blockType == bt_rle) return 1;
2544
41.9k
    return cSize;
2545
44.0k
}
2546
2547
static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2548
4.98k
{
2549
4.98k
    if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
2550
4.93k
    if (srcSize > 0) {
2551
4.44k
        memcpy(dst, src, srcSize);
2552
4.44k
    }
2553
4.93k
    return srcSize;
2554
4.98k
}
2555
2556
2557
/** ZSTD_decompressLiterals
2558
    @return : nb of bytes read from src, or an error code*/
2559
static size_t ZSTD_decompressLiterals(void* dst, size_t* maxDstSizePtr,
2560
                                const void* src, size_t srcSize)
2561
2.86k
{
2562
2.86k
    const BYTE* ip = (const BYTE*)src;
2563
2564
2.86k
    const size_t litSize = (MEM_readLE32(src) & 0x1FFFFF) >> 2;   /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2565
2.86k
    const size_t litCSize = (MEM_readLE32(ip+2) & 0xFFFFFF) >> 5;   /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2566
2567
2.86k
    if (litSize > *maxDstSizePtr) return ERROR(corruption_detected);
2568
2.84k
    if (litCSize + 5 > srcSize) return ERROR(corruption_detected);
2569
2570
2.75k
    if (HUF_isError(HUF_decompress(dst, litSize, ip+5, litCSize))) return ERROR(corruption_detected);
2571
2572
1.24k
    *maxDstSizePtr = litSize;
2573
1.24k
    return litCSize + 5;
2574
2.75k
}
2575
2576
2577
/** ZSTD_decodeLiteralsBlock
2578
    @return : nb of bytes read from src (< srcSize ) */
2579
static size_t ZSTD_decodeLiteralsBlock(ZSTD_DCtx* dctx,
2580
                          const void* src, size_t srcSize)   /* note : srcSize < BLOCKSIZE */
2581
18.8k
{
2582
18.8k
    const BYTE* const istart = (const BYTE*) src;
2583
2584
    /* any compressed block with literals segment must be at least this size */
2585
18.8k
    if (srcSize < MIN_CBLOCK_SIZE) return ERROR(corruption_detected);
2586
2587
18.2k
    switch(*istart & 3)
2588
18.2k
    {
2589
    /* compressed */
2590
2.86k
    case 0:
2591
2.86k
        {
2592
2.86k
            size_t litSize = BLOCKSIZE;
2593
2.86k
            const size_t readSize = ZSTD_decompressLiterals(dctx->litBuffer, &litSize, src, srcSize);
2594
2.86k
            dctx->litPtr = dctx->litBuffer;
2595
2.86k
            dctx->litSize = litSize;
2596
2.86k
            memset(dctx->litBuffer + dctx->litSize, 0, 8);
2597
2.86k
            return readSize;   /* works if it's an error too */
2598
0
        }
2599
8.89k
    case IS_RAW:
2600
8.89k
        {
2601
8.89k
            const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2;   /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2602
8.89k
            if (litSize > srcSize-11)   /* risk of reading too far with wildcopy */
2603
196
            {
2604
196
                if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2605
171
                if (litSize > srcSize-3) return ERROR(corruption_detected);
2606
121
                memcpy(dctx->litBuffer, istart, litSize);
2607
121
                dctx->litPtr = dctx->litBuffer;
2608
121
                dctx->litSize = litSize;
2609
121
                memset(dctx->litBuffer + dctx->litSize, 0, 8);
2610
121
                return litSize+3;
2611
171
            }
2612
            /* direct reference into compressed stream */
2613
8.69k
            dctx->litPtr = istart+3;
2614
8.69k
            dctx->litSize = litSize;
2615
8.69k
            return litSize+3;        }
2616
6.45k
    case IS_RLE:
2617
6.45k
        {
2618
6.45k
            const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2;   /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
2619
6.45k
            if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
2620
6.42k
            memset(dctx->litBuffer, istart[3], litSize + 8);
2621
6.42k
            dctx->litPtr = dctx->litBuffer;
2622
6.42k
            dctx->litSize = litSize;
2623
6.42k
            return 4;
2624
6.45k
        }
2625
25
    default:
2626
25
        return ERROR(corruption_detected);   /* forbidden nominal case */
2627
18.2k
    }
2628
18.2k
}
2629
2630
2631
static size_t ZSTD_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
2632
                         FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
2633
                         const void* src, size_t srcSize)
2634
16.4k
{
2635
16.4k
    const BYTE* const istart = (const BYTE* const)src;
2636
16.4k
    const BYTE* ip = istart;
2637
16.4k
    const BYTE* const iend = istart + srcSize;
2638
16.4k
    U32 LLtype, Offtype, MLtype;
2639
16.4k
    U32 LLlog, Offlog, MLlog;
2640
16.4k
    size_t dumpsLength;
2641
2642
    /* check */
2643
16.4k
    if (srcSize < 5) return ERROR(srcSize_wrong);
2644
2645
    /* SeqHead */
2646
16.4k
    *nbSeq = MEM_readLE16(ip); ip+=2;
2647
16.4k
    LLtype  = *ip >> 6;
2648
16.4k
    Offtype = (*ip >> 4) & 3;
2649
16.4k
    MLtype  = (*ip >> 2) & 3;
2650
16.4k
    if (*ip & 2)
2651
9.04k
    {
2652
9.04k
        dumpsLength  = ip[2];
2653
9.04k
        dumpsLength += ip[1] << 8;
2654
9.04k
        ip += 3;
2655
9.04k
    }
2656
7.41k
    else
2657
7.41k
    {
2658
7.41k
        dumpsLength  = ip[1];
2659
7.41k
        dumpsLength += (ip[0] & 1) << 8;
2660
7.41k
        ip += 2;
2661
7.41k
    }
2662
16.4k
    *dumpsPtr = ip;
2663
16.4k
    ip += dumpsLength;
2664
16.4k
    *dumpsLengthPtr = dumpsLength;
2665
2666
    /* check */
2667
16.4k
    if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
2668
2669
    /* sequences */
2670
16.3k
    {
2671
16.3k
        S16 norm[MaxML+1];    /* assumption : MaxML >= MaxLL >= MaxOff */
2672
16.3k
        size_t headerSize;
2673
2674
        /* Build DTables */
2675
16.3k
        switch(LLtype)
2676
16.3k
        {
2677
1.85k
        case bt_rle :
2678
1.85k
            LLlog = 0;
2679
1.85k
            FSE_buildDTable_rle(DTableLL, *ip++); break;
2680
11.4k
        case bt_raw :
2681
11.4k
            LLlog = LLbits;
2682
11.4k
            FSE_buildDTable_raw(DTableLL, LLbits); break;
2683
3.05k
        default :
2684
3.05k
            {   U32 max = MaxLL;
2685
3.05k
                headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
2686
3.05k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
2687
2.98k
                if (LLlog > LLFSELog) return ERROR(corruption_detected);
2688
2.97k
                ip += headerSize;
2689
2.97k
                FSE_buildDTable(DTableLL, norm, max, LLlog);
2690
2.97k
        }   }
2691
2692
16.3k
        switch(Offtype)
2693
16.3k
        {
2694
6.10k
        case bt_rle :
2695
6.10k
            Offlog = 0;
2696
6.10k
            if (ip > iend-2) return ERROR(srcSize_wrong);   /* min : "raw", hence no header, but at least xxLog bits */
2697
6.09k
            FSE_buildDTable_rle(DTableOffb, *ip++ & MaxOff); /* if *ip > MaxOff, data is corrupted */
2698
6.09k
            break;
2699
6.18k
        case bt_raw :
2700
6.18k
            Offlog = Offbits;
2701
6.18k
            FSE_buildDTable_raw(DTableOffb, Offbits); break;
2702
4.02k
        default :
2703
4.02k
            {   U32 max = MaxOff;
2704
4.02k
                headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
2705
4.02k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
2706
3.96k
                if (Offlog > OffFSELog) return ERROR(corruption_detected);
2707
3.95k
                ip += headerSize;
2708
3.95k
                FSE_buildDTable(DTableOffb, norm, max, Offlog);
2709
3.95k
        }   }
2710
2711
16.2k
        switch(MLtype)
2712
16.2k
        {
2713
2.25k
        case bt_rle :
2714
2.25k
            MLlog = 0;
2715
2.25k
            if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
2716
2.24k
            FSE_buildDTable_rle(DTableML, *ip++); break;
2717
9.50k
        case bt_raw :
2718
9.50k
            MLlog = MLbits;
2719
9.50k
            FSE_buildDTable_raw(DTableML, MLbits); break;
2720
4.47k
        default :
2721
4.47k
            {   U32 max = MaxML;
2722
4.47k
                headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
2723
4.47k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
2724
4.41k
                if (MLlog > MLFSELog) return ERROR(corruption_detected);
2725
4.40k
                ip += headerSize;
2726
4.40k
                FSE_buildDTable(DTableML, norm, max, MLlog);
2727
4.40k
    }   }   }
2728
2729
16.1k
    return ip-istart;
2730
16.2k
}
2731
2732
2733
typedef struct {
2734
    size_t litLength;
2735
    size_t offset;
2736
    size_t matchLength;
2737
} seq_t;
2738
2739
typedef struct {
2740
    BIT_DStream_t DStream;
2741
    FSE_DState_t stateLL;
2742
    FSE_DState_t stateOffb;
2743
    FSE_DState_t stateML;
2744
    size_t prevOffset;
2745
    const BYTE* dumps;
2746
    const BYTE* dumpsEnd;
2747
} seqState_t;
2748
2749
2750
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
2751
3.43M
{
2752
3.43M
    size_t litLength;
2753
3.43M
    size_t prevOffset;
2754
3.43M
    size_t offset;
2755
3.43M
    size_t matchLength;
2756
3.43M
    const BYTE* dumps = seqState->dumps;
2757
3.43M
    const BYTE* const de = seqState->dumpsEnd;
2758
2759
    /* Literal length */
2760
3.43M
    litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
2761
3.43M
    prevOffset = litLength ? seq->offset : seqState->prevOffset;
2762
3.43M
    if (litLength == MaxLL) {
2763
11.1k
        const U32 add = dumps<de ? *dumps++ : 0;
2764
11.1k
        if (add < 255) litLength += add;
2765
1.31k
        else if (dumps + 3 <= de) {
2766
256
            litLength = MEM_readLE24(dumps);
2767
256
            dumps += 3;
2768
256
        }
2769
11.1k
        if (dumps >= de) { dumps = de-1; }  /* late correction, to avoid read overflow (data is now corrupted anyway) */
2770
11.1k
    }
2771
2772
    /* Offset */
2773
3.43M
    {   static const U32 offsetPrefix[MaxOff+1] = {
2774
3.43M
                1 /*fake*/, 1, 2, 4, 8, 16, 32, 64, 128, 256,
2775
3.43M
                512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144,
2776
3.43M
                524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, /*fake*/ 1, 1, 1, 1, 1 };
2777
3.43M
        U32 offsetCode, nbBits;
2778
3.43M
        offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream));   /* <= maxOff, by table construction */
2779
3.43M
        if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
2780
3.43M
        nbBits = offsetCode - 1;
2781
3.43M
        if (offsetCode==0) nbBits = 0;   /* cmove */
2782
3.43M
        offset = offsetPrefix[offsetCode] + BIT_readBits(&(seqState->DStream), nbBits);
2783
3.43M
        if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
2784
3.43M
        if (offsetCode==0) offset = prevOffset;   /* cmove */
2785
3.43M
        if (offsetCode | !litLength) seqState->prevOffset = seq->offset;   /* cmove */
2786
3.43M
    }
2787
2788
    /* MatchLength */
2789
3.43M
    matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
2790
3.43M
    if (matchLength == MaxML) {
2791
72.4k
        const U32 add = dumps<de ? *dumps++ : 0;
2792
72.4k
        if (add < 255) matchLength += add;
2793
925
        else if (dumps + 3 <= de){
2794
249
            matchLength = MEM_readLE24(dumps);
2795
249
            dumps += 3;
2796
249
        }
2797
72.4k
        if (dumps >= de) { dumps = de-1; }  /* late correction, to avoid read overflow (data is now corrupted anyway) */
2798
72.4k
    }
2799
3.43M
    matchLength += MINMATCH;
2800
2801
    /* save result */
2802
3.43M
    seq->litLength = litLength;
2803
3.43M
    seq->offset = offset;
2804
3.43M
    seq->matchLength = matchLength;
2805
3.43M
    seqState->dumps = dumps;
2806
3.43M
}
2807
2808
2809
static size_t ZSTD_execSequence(BYTE* op,
2810
                                BYTE* const oend, seq_t sequence,
2811
                                const BYTE** litPtr, const BYTE* const litLimit,
2812
                                const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
2813
3.43M
{
2814
3.43M
    static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 };   /* added */
2815
3.43M
    static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 };   /* subtracted */
2816
3.43M
    BYTE* const oLitEnd = op + sequence.litLength;
2817
3.43M
    const size_t sequenceLength = sequence.litLength + sequence.matchLength;
2818
3.43M
    BYTE* const oMatchEnd = op + sequenceLength;   /* risk : address space overflow (32-bits) */
2819
3.43M
    BYTE* const oend_8 = oend-8;
2820
3.43M
    const BYTE* const litEnd = *litPtr + sequence.litLength;
2821
3.43M
    const BYTE* match = oLitEnd - sequence.offset;
2822
2823
    /* checks */
2824
3.43M
    size_t const seqLength = sequence.litLength + sequence.matchLength;
2825
2826
3.43M
    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
2827
3.43M
    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
2828
    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
2829
3.43M
    if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall);
2830
2831
3.43M
    if (oMatchEnd > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */
2832
3.43M
    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */
2833
2834
    /* copy Literals */
2835
3.43M
    ZSTD_wildcopy(op, *litPtr, (ptrdiff_t)sequence.litLength);   /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
2836
3.43M
    op = oLitEnd;
2837
3.43M
    *litPtr = litEnd;   /* update for next sequence */
2838
2839
    /* copy Match */
2840
3.43M
    if (sequence.offset > (size_t)(oLitEnd - base))
2841
784
    {
2842
        /* offset beyond prefix */
2843
784
        if (sequence.offset > (size_t)(oLitEnd - vBase))
2844
161
            return ERROR(corruption_detected);
2845
623
        match = dictEnd - (base-match);
2846
623
        if (match + sequence.matchLength <= dictEnd)
2847
551
        {
2848
551
            memmove(oLitEnd, match, sequence.matchLength);
2849
551
            return sequenceLength;
2850
551
        }
2851
        /* span extDict & currentPrefixSegment */
2852
72
        {
2853
72
            size_t length1 = dictEnd - match;
2854
72
            memmove(oLitEnd, match, length1);
2855
72
            op = oLitEnd + length1;
2856
72
            sequence.matchLength -= length1;
2857
72
            match = base;
2858
72
            if (op > oend_8 || sequence.matchLength < MINMATCH) {
2859
69
              while (op < oMatchEnd) *op++ = *match++;
2860
20
              return sequenceLength;
2861
20
            }
2862
72
        }
2863
72
    }
2864
    /* Requirement: op <= oend_8 */
2865
2866
    /* match within prefix */
2867
3.43M
    if (sequence.offset < 8) {
2868
        /* close range match, overlap */
2869
3.41M
        const int sub2 = dec64table[sequence.offset];
2870
3.41M
        op[0] = match[0];
2871
3.41M
        op[1] = match[1];
2872
3.41M
        op[2] = match[2];
2873
3.41M
        op[3] = match[3];
2874
3.41M
        match += dec32table[sequence.offset];
2875
3.41M
        ZSTD_copy4(op+4, match);
2876
3.41M
        match -= sub2;
2877
3.41M
    } else {
2878
27.8k
        ZSTD_copy8(op, match);
2879
27.8k
    }
2880
3.43M
    op += 8; match += 8;
2881
2882
3.43M
    if (oMatchEnd > oend-(16-MINMATCH))
2883
121
    {
2884
121
        if (op < oend_8)
2885
51
        {
2886
51
            ZSTD_wildcopy(op, match, oend_8 - op);
2887
51
            match += oend_8 - op;
2888
51
            op = oend_8;
2889
51
        }
2890
303
        while (op < oMatchEnd) *op++ = *match++;
2891
121
    }
2892
3.43M
    else
2893
3.43M
    {
2894
3.43M
        ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8, but must be signed */
2895
3.43M
    }
2896
3.43M
    return sequenceLength;
2897
3.43M
}
2898
2899
2900
static size_t ZSTD_decompressSequences(
2901
                               ZSTD_DCtx* dctx,
2902
                               void* dst, size_t maxDstSize,
2903
                         const void* seqStart, size_t seqSize)
2904
16.4k
{
2905
16.4k
    const BYTE* ip = (const BYTE*)seqStart;
2906
16.4k
    const BYTE* const iend = ip + seqSize;
2907
16.4k
    BYTE* const ostart = (BYTE* const)dst;
2908
16.4k
    BYTE* op = ostart;
2909
16.4k
    BYTE* const oend = ostart + maxDstSize;
2910
16.4k
    size_t errorCode, dumpsLength;
2911
16.4k
    const BYTE* litPtr = dctx->litPtr;
2912
16.4k
    const BYTE* const litEnd = litPtr + dctx->litSize;
2913
16.4k
    int nbSeq;
2914
16.4k
    const BYTE* dumps;
2915
16.4k
    U32* DTableLL = dctx->LLTable;
2916
16.4k
    U32* DTableML = dctx->MLTable;
2917
16.4k
    U32* DTableOffb = dctx->OffTable;
2918
16.4k
    const BYTE* const base = (const BYTE*) (dctx->base);
2919
16.4k
    const BYTE* const vBase = (const BYTE*) (dctx->vBase);
2920
16.4k
    const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
2921
2922
    /* Build Decoding Tables */
2923
16.4k
    errorCode = ZSTD_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
2924
16.4k
                                      DTableLL, DTableML, DTableOffb,
2925
16.4k
                                      ip, iend-ip);
2926
16.4k
    if (ZSTD_isError(errorCode)) return errorCode;
2927
16.1k
    ip += errorCode;
2928
2929
    /* Regen sequences */
2930
16.1k
    {
2931
16.1k
        seq_t sequence;
2932
16.1k
        seqState_t seqState;
2933
2934
16.1k
        memset(&sequence, 0, sizeof(sequence));
2935
16.1k
        sequence.offset = 4;
2936
16.1k
        seqState.dumps = dumps;
2937
16.1k
        seqState.dumpsEnd = dumps + dumpsLength;
2938
16.1k
        seqState.prevOffset = 4;
2939
16.1k
        errorCode = BIT_initDStream(&(seqState.DStream), ip, iend-ip);
2940
16.1k
        if (ERR_isError(errorCode)) return ERROR(corruption_detected);
2941
16.0k
        FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
2942
16.0k
        FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
2943
16.0k
        FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
2944
2945
3.45M
        for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && nbSeq ; )
2946
3.43M
        {
2947
3.43M
            size_t oneSeqSize;
2948
3.43M
            nbSeq--;
2949
3.43M
            ZSTD_decodeSequence(&sequence, &seqState);
2950
3.43M
            oneSeqSize = ZSTD_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
2951
3.43M
            if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
2952
3.43M
            op += oneSeqSize;
2953
3.43M
        }
2954
2955
        /* check if reached exact end */
2956
15.3k
        if ( !BIT_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected);   /* DStream should be entirely and exactly consumed; otherwise data is corrupted */
2957
2958
        /* last literal segment */
2959
15.1k
        {
2960
15.1k
            size_t lastLLSize = litEnd - litPtr;
2961
15.1k
            if (litPtr > litEnd) return ERROR(corruption_detected);
2962
15.1k
            if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
2963
15.0k
            if (lastLLSize > 0) {
2964
6.60k
                if (op != litPtr) memcpy(op, litPtr, lastLLSize);
2965
6.60k
                op += lastLLSize;
2966
6.60k
            }
2967
15.0k
        }
2968
15.0k
    }
2969
2970
0
    return op-ostart;
2971
15.1k
}
2972
2973
2974
static void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst)
2975
21.4k
{
2976
21.4k
    if (dst != dctx->previousDstEnd)   /* not contiguous */
2977
5.51k
    {
2978
5.51k
        dctx->dictEnd = dctx->previousDstEnd;
2979
5.51k
        dctx->vBase = (const char*)dst - ((const char*)(dctx->previousDstEnd) - (const char*)(dctx->base));
2980
5.51k
        dctx->base = dst;
2981
5.51k
        dctx->previousDstEnd = dst;
2982
5.51k
    }
2983
21.4k
}
2984
2985
2986
static size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
2987
                            void* dst, size_t maxDstSize,
2988
                      const void* src, size_t srcSize)
2989
18.8k
{
2990
    /* blockType == blockCompressed */
2991
18.8k
    const BYTE* ip = (const BYTE*)src;
2992
18.8k
    size_t litCSize;
2993
2994
18.8k
    if (srcSize > BLOCKSIZE) return ERROR(corruption_detected);
2995
2996
    /* Decode literals sub-block */
2997
18.8k
    litCSize = ZSTD_decodeLiteralsBlock(dctx, src, srcSize);
2998
18.8k
    if (ZSTD_isError(litCSize)) return litCSize;
2999
16.4k
    ip += litCSize;
3000
16.4k
    srcSize -= litCSize;
3001
3002
16.4k
    return ZSTD_decompressSequences(dctx, dst, maxDstSize, ip, srcSize);
3003
18.8k
}
3004
3005
3006
static size_t ZSTD_decompress_usingDict(ZSTD_DCtx* ctx,
3007
                                 void* dst, size_t maxDstSize,
3008
                                 const void* src, size_t srcSize,
3009
                                 const void* dict, size_t dictSize)
3010
5.03k
{
3011
5.03k
    const BYTE* ip = (const BYTE*)src;
3012
5.03k
    const BYTE* iend = ip + srcSize;
3013
5.03k
    BYTE* const ostart = (BYTE* const)dst;
3014
5.03k
    BYTE* op = ostart;
3015
5.03k
    BYTE* const oend = ostart + maxDstSize;
3016
5.03k
    size_t remainingSize = srcSize;
3017
5.03k
    blockProperties_t blockProperties;
3018
3019
    /* init */
3020
5.03k
    ZSTD_resetDCtx(ctx);
3021
5.03k
    if (dict)
3022
0
    {
3023
0
        ZSTD_decompress_insertDictionary(ctx, dict, dictSize);
3024
0
        ctx->dictEnd = ctx->previousDstEnd;
3025
0
        ctx->vBase = (const char*)dst - ((const char*)(ctx->previousDstEnd) - (const char*)(ctx->base));
3026
0
        ctx->base = dst;
3027
0
    }
3028
5.03k
    else
3029
5.03k
    {
3030
5.03k
        ctx->vBase = ctx->base = ctx->dictEnd = dst;
3031
5.03k
    }
3032
3033
    /* Frame Header */
3034
5.03k
    {
3035
5.03k
        size_t frameHeaderSize;
3036
5.03k
        if (srcSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
3037
5.03k
        frameHeaderSize = ZSTD_decodeFrameHeader_Part1(ctx, src, ZSTD_frameHeaderSize_min);
3038
5.03k
        if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
3039
5.03k
        if (srcSize < frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
3040
5.03k
        ip += frameHeaderSize; remainingSize -= frameHeaderSize;
3041
5.03k
        frameHeaderSize = ZSTD_decodeFrameHeader_Part2(ctx, src, frameHeaderSize);
3042
5.03k
        if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
3043
5.03k
    }
3044
3045
    /* Loop on each block */
3046
17.2k
    while (1)
3047
17.2k
    {
3048
17.2k
        size_t decodedSize=0;
3049
17.2k
        size_t cBlockSize = ZSTD_getcBlockSize(ip, iend-ip, &blockProperties);
3050
17.2k
        if (ZSTD_isError(cBlockSize)) return cBlockSize;
3051
3052
17.2k
        ip += ZSTD_blockHeaderSize;
3053
17.2k
        remainingSize -= ZSTD_blockHeaderSize;
3054
17.2k
        if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
3055
3056
17.2k
        switch(blockProperties.blockType)
3057
17.2k
        {
3058
11.7k
        case bt_compressed:
3059
11.7k
            decodedSize = ZSTD_decompressBlock_internal(ctx, op, oend-op, ip, cBlockSize);
3060
11.7k
            break;
3061
3.69k
        case bt_raw :
3062
3.69k
            decodedSize = ZSTD_copyRawBlock(op, oend-op, ip, cBlockSize);
3063
3.69k
            break;
3064
19
        case bt_rle :
3065
19
            return ERROR(GENERIC);   /* not yet supported */
3066
0
            break;
3067
1.70k
        case bt_end :
3068
            /* end of frame */
3069
1.70k
            if (remainingSize) return ERROR(srcSize_wrong);
3070
1.70k
            break;
3071
1.70k
        default:
3072
0
            return ERROR(GENERIC);   /* impossible */
3073
17.2k
        }
3074
17.1k
        if (cBlockSize == 0) break;   /* bt_end */
3075
3076
14.4k
        if (ZSTD_isError(decodedSize)) return decodedSize;
3077
12.1k
        op += decodedSize;
3078
12.1k
        ip += cBlockSize;
3079
12.1k
        remainingSize -= cBlockSize;
3080
12.1k
    }
3081
3082
2.78k
    return op-ostart;
3083
5.01k
}
3084
3085
/* ZSTD_errorFrameSizeInfoLegacy() :
3086
   assumes `cSize` and `dBound` are _not_ NULL */
3087
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
3088
396
{
3089
396
    *cSize = ret;
3090
396
    *dBound = ZSTD_CONTENTSIZE_ERROR;
3091
396
}
3092
3093
void ZSTDv04_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
3094
6.03k
{
3095
6.03k
    const BYTE* ip = (const BYTE*)src;
3096
6.03k
    size_t remainingSize = srcSize;
3097
6.03k
    size_t nbBlocks = 0;
3098
6.03k
    blockProperties_t blockProperties;
3099
3100
    /* Frame Header */
3101
6.03k
    if (srcSize < ZSTD_frameHeaderSize_min) {
3102
20
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3103
20
        return;
3104
20
    }
3105
6.01k
    if (MEM_readLE32(src) != ZSTD_MAGICNUMBER) {
3106
0
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
3107
0
        return;
3108
0
    }
3109
6.01k
    ip += ZSTD_frameHeaderSize_min; remainingSize -= ZSTD_frameHeaderSize_min;
3110
3111
    /* Loop on each block */
3112
23.5k
    while (1)
3113
23.5k
    {
3114
23.5k
        size_t cBlockSize = ZSTD_getcBlockSize(ip, remainingSize, &blockProperties);
3115
23.5k
        if (ZSTD_isError(cBlockSize)) {
3116
107
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
3117
107
            return;
3118
107
        }
3119
3120
23.4k
        ip += ZSTD_blockHeaderSize;
3121
23.4k
        remainingSize -= ZSTD_blockHeaderSize;
3122
23.4k
        if (cBlockSize > remainingSize) {
3123
269
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
3124
269
            return;
3125
269
        }
3126
3127
23.1k
        if (cBlockSize == 0) break;   /* bt_end */
3128
3129
17.5k
        ip += cBlockSize;
3130
17.5k
        remainingSize -= cBlockSize;
3131
17.5k
        nbBlocks++;
3132
17.5k
    }
3133
3134
5.64k
    *cSize = ip - (const BYTE*)src;
3135
5.64k
    *dBound = nbBlocks * BLOCKSIZE;
3136
5.64k
}
3137
3138
/* ******************************
3139
*  Streaming Decompression API
3140
********************************/
3141
static size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx)
3142
30.1k
{
3143
30.1k
    return dctx->expected;
3144
30.1k
}
3145
3146
static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3147
21.4k
{
3148
    /* Sanity check */
3149
21.4k
    if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
3150
21.4k
    ZSTD_checkContinuity(ctx, dst);
3151
3152
    /* Decompress : frame header; part 1 */
3153
21.4k
    switch (ctx->stage)
3154
21.4k
    {
3155
3.01k
    case ZSTDds_getFrameHeaderSize :
3156
        /* get frame header size */
3157
3.01k
        if (srcSize != ZSTD_frameHeaderSize_min) return ERROR(srcSize_wrong);   /* impossible */
3158
3.01k
        ctx->headerSize = ZSTD_decodeFrameHeader_Part1(ctx, src, ZSTD_frameHeaderSize_min);
3159
3.01k
        if (ZSTD_isError(ctx->headerSize)) return ctx->headerSize;
3160
3.01k
        memcpy(ctx->headerBuffer, src, ZSTD_frameHeaderSize_min);
3161
3.01k
        if (ctx->headerSize > ZSTD_frameHeaderSize_min) return ERROR(GENERIC);   /* impossible */
3162
3.01k
        ctx->expected = 0;   /* not necessary to copy more */
3163
        /* fallthrough */
3164
3.01k
    case ZSTDds_decodeFrameHeader:
3165
        /* get frame header */
3166
3.01k
        {   size_t const result = ZSTD_decodeFrameHeader_Part2(ctx, ctx->headerBuffer, ctx->headerSize);
3167
3.01k
            if (ZSTD_isError(result)) return result;
3168
3.01k
            ctx->expected = ZSTD_blockHeaderSize;
3169
3.01k
            ctx->stage = ZSTDds_decodeBlockHeader;
3170
3.01k
            return 0;
3171
3.01k
        }
3172
10.1k
    case ZSTDds_decodeBlockHeader:
3173
        /* Decode block header */
3174
10.1k
        {   blockProperties_t bp;
3175
10.1k
            size_t const blockSize = ZSTD_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
3176
10.1k
            if (ZSTD_isError(blockSize)) return blockSize;
3177
10.1k
            if (bp.blockType == bt_end)
3178
1.09k
            {
3179
1.09k
                ctx->expected = 0;
3180
1.09k
                ctx->stage = ZSTDds_getFrameHeaderSize;
3181
1.09k
            }
3182
9.02k
            else
3183
9.02k
            {
3184
9.02k
                ctx->expected = blockSize;
3185
9.02k
                ctx->bType = bp.blockType;
3186
9.02k
                ctx->stage = ZSTDds_decompressBlock;
3187
9.02k
            }
3188
10.1k
            return 0;
3189
10.1k
        }
3190
8.35k
    case ZSTDds_decompressBlock:
3191
8.35k
        {
3192
            /* Decompress : block content */
3193
8.35k
            size_t rSize;
3194
8.35k
            switch(ctx->bType)
3195
8.35k
            {
3196
7.07k
            case bt_compressed:
3197
7.07k
                rSize = ZSTD_decompressBlock_internal(ctx, dst, maxDstSize, src, srcSize);
3198
7.07k
                break;
3199
1.28k
            case bt_raw :
3200
1.28k
                rSize = ZSTD_copyRawBlock(dst, maxDstSize, src, srcSize);
3201
1.28k
                break;
3202
2
            case bt_rle :
3203
2
                return ERROR(GENERIC);   /* not yet handled */
3204
0
                break;
3205
0
            case bt_end :   /* should never happen (filtered at phase 1) */
3206
0
                rSize = 0;
3207
0
                break;
3208
0
            default:
3209
0
                return ERROR(GENERIC);
3210
8.35k
            }
3211
8.35k
            ctx->stage = ZSTDds_decodeBlockHeader;
3212
8.35k
            ctx->expected = ZSTD_blockHeaderSize;
3213
8.35k
            if (ZSTD_isError(rSize)) return rSize;
3214
7.33k
            ctx->previousDstEnd = (char*)dst + rSize;
3215
7.33k
            return rSize;
3216
8.35k
        }
3217
0
    default:
3218
0
        return ERROR(GENERIC);   /* impossible */
3219
21.4k
    }
3220
21.4k
}
3221
3222
3223
static void ZSTD_decompress_insertDictionary(ZSTD_DCtx* ctx, const void* dict, size_t dictSize)
3224
0
{
3225
0
    ctx->dictEnd = ctx->previousDstEnd;
3226
0
    ctx->vBase = (const char*)dict - ((const char*)(ctx->previousDstEnd) - (const char*)(ctx->base));
3227
0
    ctx->base = dict;
3228
0
    ctx->previousDstEnd = (const char*)dict + dictSize;
3229
0
}
3230
3231
3232
3233
/*
3234
    Buffered version of Zstd compression library
3235
    Copyright (C) 2015, Yann Collet.
3236
3237
    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
3238
3239
    Redistribution and use in source and binary forms, with or without
3240
    modification, are permitted provided that the following conditions are
3241
    met:
3242
    * Redistributions of source code must retain the above copyright
3243
    notice, this list of conditions and the following disclaimer.
3244
    * Redistributions in binary form must reproduce the above
3245
    copyright notice, this list of conditions and the following disclaimer
3246
    in the documentation and/or other materials provided with the
3247
    distribution.
3248
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3249
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3250
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3251
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3252
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3253
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3254
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3255
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3256
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3257
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3258
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3259
3260
    You can contact the author at :
3261
    - zstd source repository : https://github.com/Cyan4973/zstd
3262
    - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
3263
*/
3264
3265
/* The objects defined into this file should be considered experimental.
3266
 * They are not labelled stable, as their prototype may change in the future.
3267
 * You can use them for tests, provide feedback, or if you can endure risk of future changes.
3268
 */
3269
3270
/* *************************************
3271
*  Includes
3272
***************************************/
3273
#include <stdlib.h>
3274
3275
3276
/** ************************************************
3277
*  Streaming decompression
3278
*
3279
*  A ZBUFF_DCtx object is required to track streaming operation.
3280
*  Use ZBUFF_createDCtx() and ZBUFF_freeDCtx() to create/release resources.
3281
*  Use ZBUFF_decompressInit() to start a new decompression operation.
3282
*  ZBUFF_DCtx objects can be reused multiple times.
3283
*
3284
*  Use ZBUFF_decompressContinue() repetitively to consume your input.
3285
*  *srcSizePtr and *maxDstSizePtr can be any size.
3286
*  The function will report how many bytes were read or written by modifying *srcSizePtr and *maxDstSizePtr.
3287
*  Note that it may not consume the entire input, in which case it's up to the caller to call again the function with remaining input.
3288
*  The content of dst will be overwritten (up to *maxDstSizePtr) at each function call, so save its content if it matters or change dst .
3289
*  return : a hint to preferred nb of bytes to use as input for next function call (it's only a hint, to improve latency)
3290
*            or 0 when a frame is completely decoded
3291
*            or an error code, which can be tested using ZBUFF_isError().
3292
*
3293
*  Hint : recommended buffer sizes (not compulsory)
3294
*  output : 128 KB block size is the internal unit, it ensures it's always possible to write a full block when it's decoded.
3295
*  input : just follow indications from ZBUFF_decompressContinue() to minimize latency. It should always be <= 128 KB + 3 .
3296
* **************************************************/
3297
3298
typedef enum { ZBUFFds_init, ZBUFFds_readHeader, ZBUFFds_loadHeader, ZBUFFds_decodeHeader,
3299
               ZBUFFds_read, ZBUFFds_load, ZBUFFds_flush } ZBUFF_dStage;
3300
3301
/* *** Resource management *** */
3302
3303
299
#define ZSTD_frameHeaderSize_max 5   /* too magical, should come from reference */
3304
struct ZBUFFv04_DCtx_s {
3305
    ZSTD_DCtx* zc;
3306
    ZSTD_parameters params;
3307
    char* inBuff;
3308
    size_t inBuffSize;
3309
    size_t inPos;
3310
    char* outBuff;
3311
    size_t outBuffSize;
3312
    size_t outStart;
3313
    size_t outEnd;
3314
    size_t hPos;
3315
    const char* dict;
3316
    size_t dictSize;
3317
    ZBUFF_dStage stage;
3318
    unsigned char headerBuffer[ZSTD_frameHeaderSize_max];
3319
};   /* typedef'd to ZBUFF_DCtx within "zstd_buffered.h" */
3320
3321
typedef ZBUFFv04_DCtx ZBUFF_DCtx;
3322
3323
3324
static ZBUFF_DCtx* ZBUFF_createDCtx(void)
3325
2.25k
{
3326
2.25k
    ZBUFF_DCtx* zbc = (ZBUFF_DCtx*)malloc(sizeof(ZBUFF_DCtx));
3327
2.25k
    if (zbc==NULL) return NULL;
3328
2.25k
    memset(zbc, 0, sizeof(*zbc));
3329
2.25k
    zbc->zc = ZSTD_createDCtx();
3330
2.25k
    zbc->stage = ZBUFFds_init;
3331
2.25k
    return zbc;
3332
2.25k
}
3333
3334
static size_t ZBUFF_freeDCtx(ZBUFF_DCtx* zbc)
3335
2.25k
{
3336
2.25k
    if (zbc==NULL) return 0;   /* support free on null */
3337
2.25k
    ZSTD_freeDCtx(zbc->zc);
3338
2.25k
    free(zbc->inBuff);
3339
2.25k
    free(zbc->outBuff);
3340
2.25k
    free(zbc);
3341
2.25k
    return 0;
3342
2.25k
}
3343
3344
3345
/* *** Initialization *** */
3346
3347
static size_t ZBUFF_decompressInit(ZBUFF_DCtx* zbc)
3348
3.03k
{
3349
3.03k
    zbc->stage = ZBUFFds_readHeader;
3350
3.03k
    zbc->hPos = zbc->inPos = zbc->outStart = zbc->outEnd = zbc->dictSize = 0;
3351
3.03k
    return ZSTD_resetDCtx(zbc->zc);
3352
3.03k
}
3353
3354
3355
static size_t ZBUFF_decompressWithDictionary(ZBUFF_DCtx* zbc, const void* src, size_t srcSize)
3356
3.03k
{
3357
3.03k
    zbc->dict = (const char*)src;
3358
3.03k
    zbc->dictSize = srcSize;
3359
3.03k
    return 0;
3360
3.03k
}
3361
3362
static size_t ZBUFF_limitCopy(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3363
7.87k
{
3364
7.87k
    size_t length = MIN(maxDstSize, srcSize);
3365
7.87k
    if (length > 0) {
3366
6.90k
        memcpy(dst, src, length);
3367
6.90k
    }
3368
7.87k
    return length;
3369
7.87k
}
3370
3371
/* *** Decompression *** */
3372
3373
static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDstSizePtr, const void* src, size_t* srcSizePtr)
3374
6.36k
{
3375
6.36k
    const char* const istart = (const char*)src;
3376
6.36k
    const char* ip = istart;
3377
6.36k
    const char* const iend = istart + *srcSizePtr;
3378
6.36k
    char* const ostart = (char*)dst;
3379
6.36k
    char* op = ostart;
3380
6.36k
    char* const oend = ostart + *maxDstSizePtr;
3381
6.36k
    U32 notDone = 1;
3382
3383
6.36k
    DEBUGLOG(5, "ZBUFF_decompressContinue");
3384
39.3k
    while (notDone)
3385
34.3k
    {
3386
34.3k
        switch(zbc->stage)
3387
34.3k
        {
3388
3389
0
        case ZBUFFds_init :
3390
0
            DEBUGLOG(5, "ZBUFF_decompressContinue: stage==ZBUFFds_init => ERROR(init_missing)");
3391
0
            return ERROR(init_missing);
3392
3393
3.03k
        case ZBUFFds_readHeader :
3394
            /* read header from src */
3395
3.03k
            {   size_t const headerSize = ZSTD_getFrameParams(&(zbc->params), src, *srcSizePtr);
3396
3.03k
                if (ZSTD_isError(headerSize)) return headerSize;
3397
3.03k
                if (headerSize) {
3398
                    /* not enough input to decode header : tell how many bytes would be necessary */
3399
34
                    memcpy(zbc->headerBuffer+zbc->hPos, src, *srcSizePtr);
3400
34
                    zbc->hPos += *srcSizePtr;
3401
34
                    *maxDstSizePtr = 0;
3402
34
                    zbc->stage = ZBUFFds_loadHeader;
3403
34
                    return headerSize - zbc->hPos;
3404
34
                }
3405
2.99k
                zbc->stage = ZBUFFds_decodeHeader;
3406
2.99k
                break;
3407
3.03k
            }
3408
3409
299
        case ZBUFFds_loadHeader:
3410
            /* complete header from src */
3411
299
            {   size_t headerSize = ZBUFF_limitCopy(
3412
299
                    zbc->headerBuffer + zbc->hPos, ZSTD_frameHeaderSize_max - zbc->hPos,
3413
299
                    src, *srcSizePtr);
3414
299
                zbc->hPos += headerSize;
3415
299
                ip += headerSize;
3416
299
                headerSize = ZSTD_getFrameParams(&(zbc->params), zbc->headerBuffer, zbc->hPos);
3417
299
                if (ZSTD_isError(headerSize)) return headerSize;
3418
286
                if (headerSize) {
3419
                    /* not enough input to decode header : tell how many bytes would be necessary */
3420
267
                    *maxDstSizePtr = 0;
3421
267
                    return headerSize - zbc->hPos;
3422
267
            }   }
3423
            /* intentional fallthrough */
3424
3425
3.01k
        case ZBUFFds_decodeHeader:
3426
                /* apply header to create / resize buffers */
3427
3.01k
                {   size_t const neededOutSize = (size_t)1 << zbc->params.windowLog;
3428
3.01k
                    size_t const neededInSize = BLOCKSIZE;   /* a block is never > BLOCKSIZE */
3429
3.01k
                    if (zbc->inBuffSize < neededInSize) {
3430
2.24k
                        free(zbc->inBuff);
3431
2.24k
                        zbc->inBuffSize = neededInSize;
3432
2.24k
                        zbc->inBuff = (char*)malloc(neededInSize);
3433
2.24k
                        if (zbc->inBuff == NULL) return ERROR(memory_allocation);
3434
2.24k
                    }
3435
3.01k
                    if (zbc->outBuffSize < neededOutSize) {
3436
2.51k
                        free(zbc->outBuff);
3437
2.51k
                        zbc->outBuffSize = neededOutSize;
3438
2.51k
                        zbc->outBuff = (char*)malloc(neededOutSize);
3439
2.51k
                        if (zbc->outBuff == NULL) return ERROR(memory_allocation);
3440
2.51k
                }   }
3441
3.01k
                if (zbc->dictSize)
3442
0
                    ZSTD_decompress_insertDictionary(zbc->zc, zbc->dict, zbc->dictSize);
3443
3.01k
                if (zbc->hPos) {
3444
                    /* some data already loaded into headerBuffer : transfer into inBuff */
3445
19
                    memcpy(zbc->inBuff, zbc->headerBuffer, zbc->hPos);
3446
19
                    zbc->inPos = zbc->hPos;
3447
19
                    zbc->hPos = 0;
3448
19
                    zbc->stage = ZBUFFds_load;
3449
19
                    break;
3450
19
                }
3451
2.99k
                zbc->stage = ZBUFFds_read;
3452
    /* fall-through */
3453
23.8k
        case ZBUFFds_read:
3454
23.8k
            {
3455
23.8k
                size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
3456
23.8k
                if (neededInSize==0)   /* end of frame */
3457
1.64k
                {
3458
1.64k
                    zbc->stage = ZBUFFds_init;
3459
1.64k
                    notDone = 0;
3460
1.64k
                    break;
3461
1.64k
                }
3462
22.2k
                if ((size_t)(iend-ip) >= neededInSize)
3463
21.2k
                {
3464
                    /* directly decode from src */
3465
21.2k
                    size_t decodedSize = ZSTD_decompressContinue(zbc->zc,
3466
21.2k
                        zbc->outBuff + zbc->outStart, zbc->outBuffSize - zbc->outStart,
3467
21.2k
                        ip, neededInSize);
3468
21.2k
                    if (ZSTD_isError(decodedSize)) return decodedSize;
3469
20.2k
                    ip += neededInSize;
3470
20.2k
                    if (!decodedSize) break;   /* this was just a header */
3471
4.52k
                    zbc->outEnd = zbc->outStart +  decodedSize;
3472
4.52k
                    zbc->stage = ZBUFFds_flush;
3473
4.52k
                    break;
3474
20.2k
                }
3475
984
                if (ip==iend) { notDone = 0; break; }   /* no more input */
3476
372
                zbc->stage = ZBUFFds_load;
3477
372
            }
3478
      /* fall-through */
3479
1.30k
        case ZBUFFds_load:
3480
1.30k
            {
3481
1.30k
                size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
3482
1.30k
                size_t toLoad = neededInSize - zbc->inPos;   /* should always be <= remaining space within inBuff */
3483
1.30k
                size_t loadedSize;
3484
1.30k
                if (toLoad > zbc->inBuffSize - zbc->inPos) return ERROR(corruption_detected);   /* should never happen */
3485
1.28k
                loadedSize = ZBUFF_limitCopy(zbc->inBuff + zbc->inPos, toLoad, ip, iend-ip);
3486
1.28k
                ip += loadedSize;
3487
1.28k
                zbc->inPos += loadedSize;
3488
1.28k
                if (loadedSize < toLoad) { notDone = 0; break; }   /* not enough input, wait for more */
3489
248
                {
3490
248
                    size_t decodedSize = ZSTD_decompressContinue(zbc->zc,
3491
248
                        zbc->outBuff + zbc->outStart, zbc->outBuffSize - zbc->outStart,
3492
248
                        zbc->inBuff, neededInSize);
3493
248
                    if (ZSTD_isError(decodedSize)) return decodedSize;
3494
231
                    zbc->inPos = 0;   /* input is consumed */
3495
231
                    if (!decodedSize) { zbc->stage = ZBUFFds_read; break; }   /* this was just a header */
3496
103
                    zbc->outEnd = zbc->outStart +  decodedSize;
3497
103
                    zbc->stage = ZBUFFds_flush;
3498
                    /* ZBUFFds_flush follows */
3499
103
                }
3500
103
            }
3501
      /* fall-through */
3502
6.29k
        case ZBUFFds_flush:
3503
6.29k
            {
3504
6.29k
                size_t toFlushSize = zbc->outEnd - zbc->outStart;
3505
6.29k
                size_t flushedSize = ZBUFF_limitCopy(op, oend-op, zbc->outBuff + zbc->outStart, toFlushSize);
3506
6.29k
                op += flushedSize;
3507
6.29k
                zbc->outStart += flushedSize;
3508
6.29k
                if (flushedSize == toFlushSize)
3509
4.58k
                {
3510
4.58k
                    zbc->stage = ZBUFFds_read;
3511
4.58k
                    if (zbc->outStart + BLOCKSIZE > zbc->outBuffSize)
3512
2.56k
                        zbc->outStart = zbc->outEnd = 0;
3513
4.58k
                    break;
3514
4.58k
                }
3515
                /* cannot flush everything */
3516
1.71k
                notDone = 0;
3517
1.71k
                break;
3518
6.29k
            }
3519
0
        default: return ERROR(GENERIC);   /* impossible */
3520
34.3k
        }
3521
34.3k
    }
3522
3523
5.00k
    *srcSizePtr = ip-istart;
3524
5.00k
    *maxDstSizePtr = op-ostart;
3525
3526
5.00k
    {
3527
5.00k
        size_t nextSrcSizeHint = ZSTD_nextSrcSizeToDecompress(zbc->zc);
3528
5.00k
        if (nextSrcSizeHint > 3) nextSrcSizeHint+= 3;   /* get the next block header while at it */
3529
5.00k
        nextSrcSizeHint -= zbc->inPos;   /* already loaded*/
3530
5.00k
        return nextSrcSizeHint;
3531
6.36k
    }
3532
6.36k
}
3533
3534
3535
/* *************************************
3536
*  Tool functions
3537
***************************************/
3538
0
unsigned ZBUFFv04_isError(size_t errorCode) { return ERR_isError(errorCode); }
3539
0
const char* ZBUFFv04_getErrorName(size_t errorCode) { return ERR_getErrorName(errorCode); }
3540
3541
0
size_t ZBUFFv04_recommendedDInSize(void)  { return BLOCKSIZE + 3; }
3542
0
size_t ZBUFFv04_recommendedDOutSize(void) { return BLOCKSIZE; }
3543
3544
3545
3546
/*- ========================================================================= -*/
3547
3548
/* final wrapping stage */
3549
3550
size_t ZSTDv04_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3551
5.03k
{
3552
5.03k
    return ZSTD_decompress_usingDict(dctx, dst, maxDstSize, src, srcSize, NULL, 0);
3553
5.03k
}
3554
3555
size_t ZSTDv04_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3556
5.03k
{
3557
5.03k
#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE==1)
3558
5.03k
    size_t regenSize;
3559
5.03k
    ZSTD_DCtx* dctx = ZSTD_createDCtx();
3560
5.03k
    if (dctx==NULL) return ERROR(memory_allocation);
3561
5.03k
    regenSize = ZSTDv04_decompressDCtx(dctx, dst, maxDstSize, src, srcSize);
3562
5.03k
    ZSTD_freeDCtx(dctx);
3563
5.03k
    return regenSize;
3564
#else
3565
    ZSTD_DCtx dctx;
3566
    return ZSTDv04_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize);
3567
#endif
3568
5.03k
}
3569
3570
0
size_t ZSTDv04_resetDCtx(ZSTDv04_Dctx* dctx) { return ZSTD_resetDCtx(dctx); }
3571
3572
size_t ZSTDv04_nextSrcSizeToDecompress(ZSTDv04_Dctx* dctx)
3573
0
{
3574
0
    return ZSTD_nextSrcSizeToDecompress(dctx);
3575
0
}
3576
3577
size_t ZSTDv04_decompressContinue(ZSTDv04_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
3578
0
{
3579
0
    return ZSTD_decompressContinue(dctx, dst, maxDstSize, src, srcSize);
3580
0
}
3581
3582
3583
3584
2.25k
ZBUFFv04_DCtx* ZBUFFv04_createDCtx(void) { return ZBUFF_createDCtx(); }
3585
2.25k
size_t ZBUFFv04_freeDCtx(ZBUFFv04_DCtx* dctx) { return ZBUFF_freeDCtx(dctx); }
3586
3587
3.03k
size_t ZBUFFv04_decompressInit(ZBUFFv04_DCtx* dctx) { return ZBUFF_decompressInit(dctx); }
3588
size_t ZBUFFv04_decompressWithDictionary(ZBUFFv04_DCtx* dctx, const void* src, size_t srcSize)
3589
3.03k
{ return ZBUFF_decompressWithDictionary(dctx, src, srcSize); }
3590
3591
size_t ZBUFFv04_decompressContinue(ZBUFFv04_DCtx* dctx, void* dst, size_t* maxDstSizePtr, const void* src, size_t* srcSizePtr)
3592
6.36k
{
3593
6.36k
    DEBUGLOG(5, "ZBUFFv04_decompressContinue");
3594
6.36k
    return ZBUFF_decompressContinue(dctx, dst, maxDstSizePtr, src, srcSizePtr);
3595
6.36k
}
3596
3597
0
ZSTD_DCtx* ZSTDv04_createDCtx(void) { return ZSTD_createDCtx(); }
3598
0
size_t ZSTDv04_freeDCtx(ZSTD_DCtx* dctx) { return ZSTD_freeDCtx(dctx); }