Coverage Report

Created: 2025-10-10 07:01

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