Coverage Report

Created: 2026-06-01 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/zstd/lib/legacy/zstd_v01.c
Line
Count
Source
1
/*
2
 * Copyright (c) Yann Collet, Meta Platforms, Inc. and affiliates.
3
 * All rights reserved.
4
 *
5
 * This source code is licensed under both the BSD-style license (found in the
6
 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
 * in the COPYING file in the root directory of this source tree).
8
 * You may select, at your option, one of the above-listed licenses.
9
 */
10
11
12
/******************************************
13
*  Includes
14
******************************************/
15
#include <stddef.h>    /* size_t, ptrdiff_t */
16
#include "zstd_v01.h"
17
#include "../common/compiler.h"
18
#include "../common/error_private.h"
19
20
21
/******************************************
22
*  Static allocation
23
******************************************/
24
/* You can statically allocate FSE CTable/DTable as a table of unsigned using below macro */
25
#define FSE_DTABLE_SIZE_U32(maxTableLog)                   (1 + (1<<maxTableLog))
26
27
/* You can statically allocate Huff0 DTable as a table of unsigned short using below macro */
28
#define HUF_DTABLE_SIZE_U16(maxTableLog)   (1 + (1<<maxTableLog))
29
#define HUF_CREATE_STATIC_DTABLE(DTable, maxTableLog) \
30
7.09k
        unsigned short DTable[HUF_DTABLE_SIZE_U16(maxTableLog)] = { maxTableLog }
31
32
33
/******************************************
34
*  Error Management
35
******************************************/
36
#define FSE_LIST_ERRORS(ITEM) \
37
        ITEM(FSE_OK_NoError) ITEM(FSE_ERROR_GENERIC) \
38
        ITEM(FSE_ERROR_tableLog_tooLarge) ITEM(FSE_ERROR_maxSymbolValue_tooLarge) ITEM(FSE_ERROR_maxSymbolValue_tooSmall) \
39
        ITEM(FSE_ERROR_dstSize_tooSmall) ITEM(FSE_ERROR_srcSize_wrong)\
40
        ITEM(FSE_ERROR_corruptionDetected) \
41
        ITEM(FSE_ERROR_maxCode)
42
43
#define FSE_GENERATE_ENUM(ENUM) ENUM,
44
typedef enum { FSE_LIST_ERRORS(FSE_GENERATE_ENUM) } FSE_errorCodes;  /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
45
46
47
/******************************************
48
*  FSE symbol compression API
49
******************************************/
50
/*
51
   This API consists of small unitary functions, which highly benefit from being inlined.
52
   You will want to enable link-time-optimization to ensure these functions are properly inlined in your binary.
53
   Visual seems to do it automatically.
54
   For gcc or clang, you'll need to add -flto flag at compilation and linking stages.
55
   If none of these solutions is applicable, include "fse.c" directly.
56
*/
57
58
typedef unsigned FSE_CTable;   /* don't allocate that. It's just a way to be more restrictive than void* */
59
typedef unsigned FSE_DTable;   /* don't allocate that. It's just a way to be more restrictive than void* */
60
61
typedef struct
62
{
63
    size_t bitContainer;
64
    int    bitPos;
65
    char*  startPtr;
66
    char*  ptr;
67
    char*  endPtr;
68
} FSE_CStream_t;
69
70
typedef struct
71
{
72
    ptrdiff_t   value;
73
    const void* stateTable;
74
    const void* symbolTT;
75
    unsigned    stateLog;
76
} FSE_CState_t;
77
78
typedef struct
79
{
80
    size_t   bitContainer;
81
    unsigned bitsConsumed;
82
    const char* ptr;
83
    const char* start;
84
} FSE_DStream_t;
85
86
typedef struct
87
{
88
    size_t      state;
89
    const void* table;   /* precise table may vary, depending on U16 */
90
} FSE_DState_t;
91
92
typedef enum { FSE_DStream_unfinished = 0,
93
               FSE_DStream_endOfBuffer = 1,
94
               FSE_DStream_completed = 2,
95
               FSE_DStream_tooFar = 3 } FSE_DStream_status;  /* result of FSE_reloadDStream() */
96
               /* 1,2,4,8 would be better for bitmap combinations, but slows down performance a bit ... ?! */
97
98
99
/****************************************************************
100
*  Tuning parameters
101
****************************************************************/
102
/* MEMORY_USAGE :
103
*  Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
104
*  Increasing memory usage improves compression ratio
105
*  Reduced memory usage can improve speed, due to cache effect
106
*  Recommended max value is 14, for 16KB, which nicely fits into Intel x86 L1 cache */
107
22.1k
#define FSE_MAX_MEMORY_USAGE 14
108
#define FSE_DEFAULT_MEMORY_USAGE 13
109
110
/* FSE_MAX_SYMBOL_VALUE :
111
*  Maximum symbol value authorized.
112
*  Required for proper stack allocation */
113
9.15k
#define FSE_MAX_SYMBOL_VALUE 255
114
115
116
/****************************************************************
117
*  template functions type & suffix
118
****************************************************************/
119
1.13M
#define FSE_FUNCTION_TYPE BYTE
120
#define FSE_FUNCTION_EXTENSION
121
122
123
/****************************************************************
124
*  Byte symbol type
125
****************************************************************/
126
typedef struct
127
{
128
    unsigned short newState;
129
    unsigned char  symbol;
130
    unsigned char  nbBits;
131
} FSE_decode_t;   /* size == U32 */
132
133
134
135
/****************************************************************
136
*  Compiler specifics
137
****************************************************************/
138
#ifdef _MSC_VER    /* Visual Studio */
139
#  define FORCE_INLINE static __forceinline
140
#  include <intrin.h>                    /* For Visual 2005 */
141
#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
142
#  pragma warning(disable : 4214)        /* disable: C4214: non-int bitfields */
143
#else
144
#  define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
145
#  if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
146
#    ifdef __GNUC__
147
#      define FORCE_INLINE static inline __attribute__((always_inline))
148
#    else
149
#      define FORCE_INLINE static inline
150
#    endif
151
#  else
152
#    define FORCE_INLINE static
153
#  endif /* __STDC_VERSION__ */
154
#endif
155
156
157
/****************************************************************
158
*  Includes
159
****************************************************************/
160
#include <stdlib.h>     /* malloc, free, qsort */
161
#include <string.h>     /* memcpy, memset */
162
#include <stdio.h>      /* printf (debug) */
163
164
165
#ifndef MEM_ACCESS_MODULE
166
#define MEM_ACCESS_MODULE
167
/****************************************************************
168
*  Basic Types
169
*****************************************************************/
170
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
171
# include <stdint.h>
172
typedef  uint8_t BYTE;
173
typedef uint16_t U16;
174
typedef  int16_t S16;
175
typedef uint32_t U32;
176
typedef  int32_t S32;
177
typedef uint64_t U64;
178
typedef  int64_t S64;
179
#else
180
typedef unsigned char       BYTE;
181
typedef unsigned short      U16;
182
typedef   signed short      S16;
183
typedef unsigned int        U32;
184
typedef   signed int        S32;
185
typedef unsigned long long  U64;
186
typedef   signed long long  S64;
187
#endif
188
189
#endif   /* MEM_ACCESS_MODULE */
190
191
/****************************************************************
192
*  Memory I/O
193
*****************************************************************/
194
195
static unsigned FSE_32bits(void)
196
4.10M
{
197
4.10M
    return sizeof(void*)==4;
198
4.10M
}
199
200
static unsigned FSE_isLittleEndian(void)
201
1.44M
{
202
1.44M
    const union { U32 i; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
203
1.44M
    return one.c[0];
204
1.44M
}
205
206
static U16 FSE_read16(const void* memPtr)
207
19.1k
{
208
19.1k
    U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
209
19.1k
}
210
211
static U32 FSE_read32(const void* memPtr)
212
101k
{
213
101k
    U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
214
101k
}
215
216
static U64 FSE_read64(const void* memPtr)
217
1.32M
{
218
1.32M
    U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
219
1.32M
}
220
221
static U16 FSE_readLE16(const void* memPtr)
222
19.1k
{
223
19.1k
    if (FSE_isLittleEndian())
224
19.1k
        return FSE_read16(memPtr);
225
0
    else
226
0
    {
227
0
        const BYTE* p = (const BYTE*)memPtr;
228
0
        return (U16)(p[0] + (p[1]<<8));
229
0
    }
230
19.1k
}
231
232
static U32 FSE_readLE32(const void* memPtr)
233
101k
{
234
101k
    if (FSE_isLittleEndian())
235
101k
        return FSE_read32(memPtr);
236
0
    else
237
0
    {
238
0
        const BYTE* p = (const BYTE*)memPtr;
239
0
        return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
240
0
    }
241
101k
}
242
243
244
static U64 FSE_readLE64(const void* memPtr)
245
1.32M
{
246
1.32M
    if (FSE_isLittleEndian())
247
1.32M
        return FSE_read64(memPtr);
248
0
    else
249
0
    {
250
0
        const BYTE* p = (const BYTE*)memPtr;
251
0
        return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
252
0
                     + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
253
0
    }
254
1.32M
}
255
256
static size_t FSE_readLEST(const void* memPtr)
257
1.32M
{
258
1.32M
    if (FSE_32bits())
259
0
        return (size_t)FSE_readLE32(memPtr);
260
1.32M
    else
261
1.32M
        return (size_t)FSE_readLE64(memPtr);
262
1.32M
}
263
264
265
266
/****************************************************************
267
*  Constants
268
*****************************************************************/
269
22.1k
#define FSE_MAX_TABLELOG  (FSE_MAX_MEMORY_USAGE-2)
270
#define FSE_MAX_TABLESIZE (1U<<FSE_MAX_TABLELOG)
271
#define FSE_MAXTABLESIZE_MASK (FSE_MAX_TABLESIZE-1)
272
#define FSE_DEFAULT_TABLELOG (FSE_DEFAULT_MEMORY_USAGE-2)
273
8.41k
#define FSE_MIN_TABLELOG 5
274
275
8.41k
#define FSE_TABLELOG_ABSOLUTE_MAX 15
276
#if FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX
277
#error "FSE_MAX_TABLELOG > FSE_TABLELOG_ABSOLUTE_MAX is not supported"
278
#endif
279
280
281
/****************************************************************
282
*  Error Management
283
****************************************************************/
284
7.09k
#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; }   /* use only *after* variable declarations */
285
286
287
/****************************************************************
288
*  Complex types
289
****************************************************************/
290
typedef struct
291
{
292
    int deltaFindState;
293
    U32 deltaNbBits;
294
} FSE_symbolCompressionTransform; /* total 8 bytes */
295
296
typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
297
298
/****************************************************************
299
*  Internal functions
300
****************************************************************/
301
FORCE_INLINE unsigned FSE_highbit32 (U32 val)
302
1.19M
{
303
#   if defined(_MSC_VER)   /* Visual */
304
    unsigned long r;
305
    return _BitScanReverse(&r, val) ? (unsigned)r : 0;
306
#   elif defined(__GNUC__) && (GCC_VERSION >= 304)   /* GCC Intrinsic */
307
    return __builtin_clz (val) ^ 31;
308
#   else   /* Software version */
309
    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 };
310
    U32 v = val;
311
    unsigned r;
312
    v |= v >> 1;
313
    v |= v >> 2;
314
    v |= v >> 4;
315
    v |= v >> 8;
316
    v |= v >> 16;
317
    r = DeBruijnClz[ (U32) (v * 0x07C4ACDDU) >> 27];
318
    return r;
319
#   endif
320
1.19M
}
321
322
323
/****************************************************************
324
*  Templates
325
****************************************************************/
326
/*
327
  designed to be included
328
  for type-specific functions (template emulation in C)
329
  Objective is to write these functions only once, for improved maintenance
330
*/
331
332
/* safety checks */
333
#ifndef FSE_FUNCTION_EXTENSION
334
#  error "FSE_FUNCTION_EXTENSION must be defined"
335
#endif
336
#ifndef FSE_FUNCTION_TYPE
337
#  error "FSE_FUNCTION_TYPE must be defined"
338
#endif
339
340
/* Function names */
341
#define FSE_CAT(X,Y) X##Y
342
#define FSE_FUNCTION_NAME(X,Y) FSE_CAT(X,Y)
343
#define FSE_TYPE_NAME(X,Y) FSE_CAT(X,Y)
344
345
346
347
8.15k
static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
348
349
8.15k
#define FSE_DECODE_TYPE FSE_decode_t
350
351
352
typedef struct {
353
    U16 tableLog;
354
    U16 fastMode;
355
} FSE_DTableHeader;   /* sizeof U32 */
356
357
static size_t FSE_buildDTable
358
(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
359
8.15k
{
360
8.15k
    void* ptr = dt;
361
8.15k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
362
8.15k
    FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)(ptr) + 1;   /* because dt is unsigned, 32-bits aligned on 32-bits */
363
8.15k
    const U32 tableSize = 1 << tableLog;
364
8.15k
    const U32 tableMask = tableSize-1;
365
8.15k
    const U32 step = FSE_tableStep(tableSize);
366
8.15k
    U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
367
8.15k
    U32 position = 0;
368
8.15k
    U32 highThreshold = tableSize-1;
369
8.15k
    const S16 largeLimit= (S16)(1 << (tableLog-1));
370
8.15k
    U32 noLarge = 1;
371
8.15k
    U32 s;
372
373
    /* Sanity Checks */
374
8.15k
    if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return (size_t)-FSE_ERROR_maxSymbolValue_tooLarge;
375
8.15k
    if (tableLog > FSE_MAX_TABLELOG) return (size_t)-FSE_ERROR_tableLog_tooLarge;
376
377
    /* Init, lay down lowprob symbols */
378
8.14k
    DTableH[0].tableLog = (U16)tableLog;
379
96.8k
    for (s=0; s<=maxSymbolValue; s++)
380
88.6k
    {
381
88.6k
        if (normalizedCounter[s]==-1)
382
41.1k
        {
383
41.1k
            tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
384
41.1k
            symbolNext[s] = 1;
385
41.1k
        }
386
47.4k
        else
387
47.4k
        {
388
47.4k
            if (normalizedCounter[s] >= largeLimit) noLarge=0;
389
47.4k
            symbolNext[s] = normalizedCounter[s];
390
47.4k
        }
391
88.6k
    }
392
393
    /* Spread symbols */
394
96.8k
    for (s=0; s<=maxSymbolValue; s++)
395
88.6k
    {
396
88.6k
        int i;
397
1.18M
        for (i=0; i<normalizedCounter[s]; i++)
398
1.09M
        {
399
1.09M
            tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
400
1.09M
            position = (position + step) & tableMask;
401
1.13M
            while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
402
1.09M
        }
403
88.6k
    }
404
405
8.14k
    if (position!=0) return (size_t)-FSE_ERROR_GENERIC;   /* position must reach all cells once, otherwise normalizedCounter is incorrect */
406
407
    /* Build Decoding table */
408
8.14k
    {
409
8.14k
        U32 i;
410
1.14M
        for (i=0; i<tableSize; i++)
411
1.13M
        {
412
1.13M
            FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
413
1.13M
            U16 nextState = symbolNext[symbol]++;
414
1.13M
            tableDecode[i].nbBits = (BYTE) (tableLog - FSE_highbit32 ((U32)nextState) );
415
1.13M
            tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
416
1.13M
        }
417
8.14k
    }
418
419
8.14k
    DTableH->fastMode = (U16)noLarge;
420
8.14k
    return 0;
421
8.14k
}
422
423
424
/******************************************
425
*  FSE byte symbol
426
******************************************/
427
#ifndef FSE_COMMONDEFS_ONLY
428
429
66.6k
static unsigned FSE_isError(size_t code) { return (code > (size_t)(-FSE_ERROR_maxCode)); }
430
431
static short FSE_abs(short a)
432
84.7k
{
433
84.7k
    return a<0? (short)-a : a;
434
84.7k
}
435
436
437
/****************************************************************
438
*  Header bitstream management
439
****************************************************************/
440
static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
441
                 const void* headerBuffer, size_t hbSize)
442
8.47k
{
443
8.47k
    const BYTE* const istart = (const BYTE*) headerBuffer;
444
8.47k
    const BYTE* const iend = istart + hbSize;
445
8.47k
    const BYTE* ip = istart;
446
8.47k
    int nbBits;
447
8.47k
    int remaining;
448
8.47k
    int threshold;
449
8.47k
    U32 bitStream;
450
8.47k
    int bitCount;
451
8.47k
    unsigned charnum = 0;
452
8.47k
    int previous0 = 0;
453
454
8.47k
    if (hbSize < 4) return (size_t)-FSE_ERROR_srcSize_wrong;
455
8.41k
    bitStream = FSE_readLE32(ip);
456
8.41k
    nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG;   /* extract tableLog */
457
8.41k
    if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return (size_t)-FSE_ERROR_tableLog_tooLarge;
458
8.37k
    bitStream >>= 4;
459
8.37k
    bitCount = 4;
460
8.37k
    *tableLogPtr = nbBits;
461
8.37k
    remaining = (1<<nbBits)+1;
462
8.37k
    threshold = 1<<nbBits;
463
8.37k
    nbBits++;
464
465
93.1k
    while ((remaining>1) && (charnum<=*maxSVPtr))
466
84.7k
    {
467
84.7k
        if (previous0)
468
10.4k
        {
469
10.4k
            unsigned n0 = charnum;
470
11.4k
            while ((bitStream & 0xFFFF) == 0xFFFF)
471
993
            {
472
993
                n0+=24;
473
993
                if (ip < iend-5)
474
879
                {
475
879
                    ip+=2;
476
879
                    bitStream = FSE_readLE32(ip) >> bitCount;
477
879
                }
478
114
                else
479
114
                {
480
114
                    bitStream >>= 16;
481
114
                    bitCount+=16;
482
114
                }
483
993
            }
484
13.0k
            while ((bitStream & 3) == 3)
485
2.63k
            {
486
2.63k
                n0+=3;
487
2.63k
                bitStream>>=2;
488
2.63k
                bitCount+=2;
489
2.63k
            }
490
10.4k
            n0 += bitStream & 3;
491
10.4k
            bitCount += 2;
492
10.4k
            if (n0 > *maxSVPtr) return (size_t)-FSE_ERROR_maxSymbolValue_tooSmall;
493
31.0k
            while (charnum < n0) normalizedCounter[charnum++] = 0;
494
10.4k
            if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
495
7.43k
            {
496
7.43k
                ip += bitCount>>3;
497
7.43k
                bitCount &= 7;
498
7.43k
                bitStream = FSE_readLE32(ip) >> bitCount;
499
7.43k
            }
500
2.99k
            else
501
2.99k
                bitStream >>= 2;
502
10.4k
        }
503
84.7k
        {
504
84.7k
            const short max = (short)((2*threshold-1)-remaining);
505
84.7k
            short count;
506
507
84.7k
            if ((bitStream & (threshold-1)) < (U32)max)
508
56.5k
            {
509
56.5k
                count = (short)(bitStream & (threshold-1));
510
56.5k
                bitCount   += nbBits-1;
511
56.5k
            }
512
28.1k
            else
513
28.1k
            {
514
28.1k
                count = (short)(bitStream & (2*threshold-1));
515
28.1k
                if (count >= threshold) count -= max;
516
28.1k
                bitCount   += nbBits;
517
28.1k
            }
518
519
84.7k
            count--;   /* extra accuracy */
520
84.7k
            remaining -= FSE_abs(count);
521
84.7k
            normalizedCounter[charnum++] = count;
522
84.7k
            previous0 = !count;
523
133k
            while (remaining < threshold)
524
49.2k
            {
525
49.2k
                nbBits--;
526
49.2k
                threshold >>= 1;
527
49.2k
            }
528
529
84.7k
            {
530
84.7k
                if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
531
71.8k
                {
532
71.8k
                    ip += bitCount>>3;
533
71.8k
                    bitCount &= 7;
534
71.8k
                }
535
12.9k
                else
536
12.9k
                {
537
12.9k
                    bitCount -= (int)(8 * (iend - 4 - ip));
538
12.9k
                    ip = iend - 4;
539
12.9k
                }
540
84.7k
                bitStream = FSE_readLE32(ip) >> (bitCount & 31);
541
84.7k
            }
542
84.7k
        }
543
84.7k
    }
544
8.33k
    if (remaining != 1) return (size_t)-FSE_ERROR_GENERIC;
545
8.30k
    *maxSVPtr = charnum-1;
546
547
8.30k
    ip += (bitCount+7)>>3;
548
8.30k
    if ((size_t)(ip-istart) > hbSize) return (size_t)-FSE_ERROR_srcSize_wrong;
549
8.21k
    return ip-istart;
550
8.30k
}
551
552
553
/*********************************************************
554
*  Decompression (Byte symbols)
555
*********************************************************/
556
static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
557
16.1k
{
558
16.1k
    void* ptr = dt;
559
16.1k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
560
16.1k
    FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1;   /* because dt is unsigned */
561
562
16.1k
    DTableH->tableLog = 0;
563
16.1k
    DTableH->fastMode = 0;
564
565
16.1k
    cell->newState = 0;
566
16.1k
    cell->symbol = symbolValue;
567
16.1k
    cell->nbBits = 0;
568
569
16.1k
    return 0;
570
16.1k
}
571
572
573
static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
574
25.3k
{
575
25.3k
    void* ptr = dt;
576
25.3k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
577
25.3k
    FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1;   /* because dt is unsigned */
578
25.3k
    const unsigned tableSize = 1 << nbBits;
579
25.3k
    const unsigned tableMask = tableSize - 1;
580
25.3k
    const unsigned maxSymbolValue = tableMask;
581
25.3k
    unsigned s;
582
583
    /* Sanity checks */
584
25.3k
    if (nbBits < 1) return (size_t)-FSE_ERROR_GENERIC;             /* min size */
585
586
    /* Build Decoding Table */
587
25.3k
    DTableH->tableLog = (U16)nbBits;
588
25.3k
    DTableH->fastMode = 1;
589
2.29M
    for (s=0; s<=maxSymbolValue; s++)
590
2.26M
    {
591
2.26M
        dinfo[s].newState = 0;
592
2.26M
        dinfo[s].symbol = (BYTE)s;
593
2.26M
        dinfo[s].nbBits = (BYTE)nbBits;
594
2.26M
    }
595
596
25.3k
    return 0;
597
25.3k
}
598
599
600
/* FSE_initDStream
601
 * Initialize a FSE_DStream_t.
602
 * srcBuffer must point at the beginning of an FSE block.
603
 * The function result is the size of the FSE_block (== srcSize).
604
 * If srcSize is too small, the function will return an errorCode;
605
 */
606
static size_t FSE_initDStream(FSE_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
607
42.0k
{
608
42.0k
    if (srcSize < 1) return (size_t)-FSE_ERROR_srcSize_wrong;
609
610
42.0k
    if (srcSize >=  sizeof(size_t))
611
17.4k
    {
612
17.4k
        U32 contain32;
613
17.4k
        bitD->start = (const char*)srcBuffer;
614
17.4k
        bitD->ptr   = (const char*)srcBuffer + srcSize - sizeof(size_t);
615
17.4k
        bitD->bitContainer = FSE_readLEST(bitD->ptr);
616
17.4k
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
617
17.4k
        if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC;   /* stop bit not present */
618
17.3k
        bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
619
17.3k
    }
620
24.5k
    else
621
24.5k
    {
622
24.5k
        U32 contain32;
623
24.5k
        bitD->start = (const char*)srcBuffer;
624
24.5k
        bitD->ptr   = bitD->start;
625
24.5k
        bitD->bitContainer = *(const BYTE*)(bitD->start);
626
24.5k
        switch(srcSize)
627
24.5k
        {
628
837
            case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
629
                    /* fallthrough */
630
2.84k
            case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
631
                    /* fallthrough */
632
5.62k
            case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
633
                    /* fallthrough */
634
6.19k
            case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
635
                    /* fallthrough */
636
12.1k
            case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
637
                    /* fallthrough */
638
16.9k
            case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) <<  8;
639
                    /* fallthrough */
640
24.5k
            default:;
641
24.5k
        }
642
24.5k
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
643
24.5k
        if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC;   /* stop bit not present */
644
24.4k
        bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
645
24.4k
        bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
646
24.4k
    }
647
648
41.8k
    return srcSize;
649
42.0k
}
650
651
652
/*!FSE_lookBits
653
 * Provides next n bits from the bitContainer.
654
 * bitContainer is not modified (bits are still present for next read/look)
655
 * On 32-bits, maxNbBits==25
656
 * On 64-bits, maxNbBits==57
657
 * return : value extracted.
658
 */
659
static size_t FSE_lookBits(FSE_DStream_t* bitD, U32 nbBits)
660
2.39M
{
661
2.39M
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
662
2.39M
    return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
663
2.39M
}
664
665
static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits)   /* only if nbBits >= 1 !! */
666
3.96M
{
667
3.96M
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
668
3.96M
    return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
669
3.96M
}
670
671
static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
672
6.35M
{
673
6.35M
    bitD->bitsConsumed += nbBits;
674
6.35M
}
675
676
677
/*!FSE_readBits
678
 * Read next n bits from the bitContainer.
679
 * On 32-bits, don't read more than maxNbBits==25
680
 * On 64-bits, don't read more than maxNbBits==57
681
 * Use the fast variant *only* if n >= 1.
682
 * return : value extracted.
683
 */
684
static size_t FSE_readBits(FSE_DStream_t* bitD, U32 nbBits)
685
2.39M
{
686
2.39M
    size_t value = FSE_lookBits(bitD, nbBits);
687
2.39M
    FSE_skipBits(bitD, nbBits);
688
2.39M
    return value;
689
2.39M
}
690
691
static size_t FSE_readBitsFast(FSE_DStream_t* bitD, U32 nbBits)   /* only if nbBits >= 1 !! */
692
11.5k
{
693
11.5k
    size_t value = FSE_lookBitsFast(bitD, nbBits);
694
11.5k
    FSE_skipBits(bitD, nbBits);
695
11.5k
    return value;
696
11.5k
}
697
698
static unsigned FSE_reloadDStream(FSE_DStream_t* bitD)
699
1.90M
{
700
1.90M
    if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* should never happen */
701
130k
        return FSE_DStream_tooFar;
702
703
1.77M
    if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
704
1.23M
    {
705
1.23M
        bitD->ptr -= bitD->bitsConsumed >> 3;
706
1.23M
        bitD->bitsConsumed &= 7;
707
1.23M
        bitD->bitContainer = FSE_readLEST(bitD->ptr);
708
1.23M
        return FSE_DStream_unfinished;
709
1.23M
    }
710
545k
    if (bitD->ptr == bitD->start)
711
473k
    {
712
473k
        if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return FSE_DStream_endOfBuffer;
713
103k
        return FSE_DStream_completed;
714
473k
    }
715
72.1k
    {
716
72.1k
        U32 nbBytes = bitD->bitsConsumed >> 3;
717
72.1k
        U32 result = FSE_DStream_unfinished;
718
72.1k
        if (bitD->ptr - nbBytes < bitD->start)
719
4.34k
        {
720
4.34k
            nbBytes = (U32)(bitD->ptr - bitD->start);  /* ptr > start */
721
4.34k
            result = FSE_DStream_endOfBuffer;
722
4.34k
        }
723
72.1k
        bitD->ptr -= nbBytes;
724
72.1k
        bitD->bitsConsumed -= nbBytes*8;
725
72.1k
        bitD->bitContainer = FSE_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD) */
726
72.1k
        return result;
727
545k
    }
728
545k
}
729
730
731
static void FSE_initDState(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD, const FSE_DTable* dt)
732
49.8k
{
733
49.8k
    const void* ptr = dt;
734
49.8k
    const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr;
735
49.8k
    DStatePtr->state = FSE_readBits(bitD, DTableH->tableLog);
736
49.8k
    FSE_reloadDStream(bitD);
737
49.8k
    DStatePtr->table = dt + 1;
738
49.8k
}
739
740
static BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
741
1.78M
{
742
1.78M
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
743
1.78M
    const U32  nbBits = DInfo.nbBits;
744
1.78M
    BYTE symbol = DInfo.symbol;
745
1.78M
    size_t lowBits = FSE_readBits(bitD, nbBits);
746
747
1.78M
    DStatePtr->state = DInfo.newState + lowBits;
748
1.78M
    return symbol;
749
1.78M
}
750
751
static BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
752
11.5k
{
753
11.5k
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
754
11.5k
    const U32 nbBits = DInfo.nbBits;
755
11.5k
    BYTE symbol = DInfo.symbol;
756
11.5k
    size_t lowBits = FSE_readBitsFast(bitD, nbBits);
757
758
11.5k
    DStatePtr->state = DInfo.newState + lowBits;
759
11.5k
    return symbol;
760
11.5k
}
761
762
/* FSE_endOfDStream
763
   Tells if bitD has reached end of bitStream or not */
764
765
static unsigned FSE_endOfDStream(const FSE_DStream_t* bitD)
766
115k
{
767
115k
    return ((bitD->ptr == bitD->start) && (bitD->bitsConsumed == sizeof(bitD->bitContainer)*8));
768
115k
}
769
770
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
771
12.4k
{
772
12.4k
    return DStatePtr->state == 0;
773
12.4k
}
774
775
776
FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
777
          void* dst, size_t maxDstSize,
778
    const void* cSrc, size_t cSrcSize,
779
    const FSE_DTable* dt, const unsigned fast)
780
857
{
781
857
    BYTE* const ostart = (BYTE*) dst;
782
857
    BYTE* op = ostart;
783
857
    BYTE* const omax = op + maxDstSize;
784
857
    BYTE* const olimit = omax-3;
785
786
857
    FSE_DStream_t bitD;
787
857
    FSE_DState_t state1;
788
857
    FSE_DState_t state2;
789
857
    size_t errorCode;
790
791
    /* Init */
792
857
    errorCode = FSE_initDStream(&bitD, cSrc, cSrcSize);   /* replaced last arg by maxCompressed Size */
793
857
    if (FSE_isError(errorCode)) return errorCode;
794
795
819
    FSE_initDState(&state1, &bitD, dt);
796
819
    FSE_initDState(&state2, &bitD, dt);
797
798
111k
#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
799
800
    /* 4 symbols per loop */
801
5.48k
    for ( ; (FSE_reloadDStream(&bitD)==FSE_DStream_unfinished) && (op<olimit) ; op+=4)
802
4.66k
    {
803
4.66k
        op[0] = FSE_GETSYMBOL(&state1);
804
805
4.66k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
806
0
            FSE_reloadDStream(&bitD);
807
808
4.66k
        op[1] = FSE_GETSYMBOL(&state2);
809
810
4.66k
        if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
811
0
            { if (FSE_reloadDStream(&bitD) > FSE_DStream_unfinished) { op+=2; break; } }
812
813
4.66k
        op[2] = FSE_GETSYMBOL(&state1);
814
815
4.66k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
816
0
            FSE_reloadDStream(&bitD);
817
818
4.66k
        op[3] = FSE_GETSYMBOL(&state2);
819
4.66k
    }
820
821
    /* tail */
822
    /* note : FSE_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly FSE_DStream_completed */
823
47.1k
    while (1)
824
47.1k
    {
825
47.1k
        if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
826
483
            break;
827
828
46.6k
        *op++ = FSE_GETSYMBOL(&state1);
829
830
46.6k
        if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
831
336
            break;
832
833
46.3k
        *op++ = FSE_GETSYMBOL(&state2);
834
46.3k
    }
835
836
    /* end ? */
837
819
    if (FSE_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
838
484
        return op-ostart;
839
840
335
    if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall;   /* dst buffer is full, but cSrc unfinished */
841
842
253
    return (size_t)-FSE_ERROR_corruptionDetected;
843
335
}
844
845
846
static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
847
                            const void* cSrc, size_t cSrcSize,
848
                            const FSE_DTable* dt)
849
857
{
850
857
    FSE_DTableHeader DTableH;
851
857
    memcpy(&DTableH, dt, sizeof(DTableH));   /* memcpy() into local variable, to avoid strict aliasing warning */
852
853
    /* select fast mode (static) */
854
857
    if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
855
676
    return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
856
857
}
857
858
859
static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
860
1.00k
{
861
1.00k
    const BYTE* const istart = (const BYTE*)cSrc;
862
1.00k
    const BYTE* ip = istart;
863
1.00k
    short counting[FSE_MAX_SYMBOL_VALUE+1];
864
1.00k
    DTable_max_t dt;   /* Static analyzer seems unable to understand this table will be properly initialized later */
865
1.00k
    unsigned tableLog;
866
1.00k
    unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
867
1.00k
    size_t errorCode;
868
869
1.00k
    if (cSrcSize<2) return (size_t)-FSE_ERROR_srcSize_wrong;   /* too small input size */
870
871
    /* normal FSE decoding mode */
872
972
    errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
873
972
    if (FSE_isError(errorCode)) return errorCode;
874
876
    if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;   /* too small input size */
875
863
    ip += errorCode;
876
863
    cSrcSize -= errorCode;
877
878
863
    errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
879
863
    if (FSE_isError(errorCode)) return errorCode;
880
881
    /* always return, even if it is an error code */
882
857
    return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
883
863
}
884
885
886
887
/* *******************************************************
888
*  Huff0 : Huffman block compression
889
*********************************************************/
890
1.00k
#define HUF_MAX_SYMBOL_VALUE 255
891
#define HUF_DEFAULT_TABLELOG  12       /* used by default, when not specified */
892
0
#define HUF_MAX_TABLELOG  12           /* max possible tableLog; for allocation purpose; can be modified */
893
806k
#define HUF_ABSOLUTEMAX_TABLELOG  16   /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
894
#if (HUF_MAX_TABLELOG > HUF_ABSOLUTEMAX_TABLELOG)
895
#  error "HUF_MAX_TABLELOG is too large !"
896
#endif
897
898
typedef struct HUF_CElt_s {
899
  U16  val;
900
  BYTE nbBits;
901
} HUF_CElt ;
902
903
typedef struct nodeElt_s {
904
    U32 count;
905
    U16 parent;
906
    BYTE byte;
907
    BYTE nbBits;
908
} nodeElt;
909
910
911
/* *******************************************************
912
*  Huff0 : Huffman block decompression
913
*********************************************************/
914
typedef struct {
915
    BYTE byte;
916
    BYTE nbBits;
917
} HUF_DElt;
918
919
static size_t HUF_readDTable (U16* DTable, const void* src, size_t srcSize)
920
7.09k
{
921
7.09k
    BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
922
7.09k
    U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];  /* large enough for values from 0 to 16 */
923
7.09k
    U32 weightTotal;
924
7.09k
    U32 maxBits;
925
7.09k
    const BYTE* ip = (const BYTE*) src;
926
7.09k
    size_t iSize;
927
7.09k
    size_t oSize;
928
7.09k
    U32 n;
929
7.09k
    U32 nextRankStart;
930
7.09k
    void* ptr = DTable+1;
931
7.09k
    HUF_DElt* const dt = (HUF_DElt*)ptr;
932
933
7.09k
    if (!srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
934
7.09k
    iSize = ip[0];
935
936
7.09k
    FSE_STATIC_ASSERT(sizeof(HUF_DElt) == sizeof(U16));   /* if compilation fails here, assertion is false */
937
    //memset(huffWeight, 0, sizeof(huffWeight));   /* should not be necessary, but some analyzer complain ... */
938
7.09k
    if (iSize >= 128)  /* special header */
939
6.08k
    {
940
6.08k
        if (iSize >= (242))   /* RLE */
941
5.96k
        {
942
5.96k
            static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
943
5.96k
            oSize = l[iSize-242];
944
5.96k
            memset(huffWeight, 1, sizeof(huffWeight));
945
5.96k
            iSize = 0;
946
5.96k
        }
947
118
        else   /* Incompressible */
948
118
        {
949
118
            oSize = iSize - 127;
950
118
            iSize = ((oSize+1)/2);
951
118
            if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
952
100
            ip += 1;
953
1.22k
            for (n=0; n<oSize; n+=2)
954
1.12k
            {
955
1.12k
                huffWeight[n]   = ip[n/2] >> 4;
956
1.12k
                huffWeight[n+1] = ip[n/2] & 15;
957
1.12k
            }
958
100
        }
959
6.08k
    }
960
1.00k
    else  /* header compressed with FSE (normal case) */
961
1.00k
    {
962
1.00k
        if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
963
1.00k
        oSize = FSE_decompress(huffWeight, HUF_MAX_SYMBOL_VALUE, ip+1, iSize);   /* max 255 values decoded, last one is implied */
964
1.00k
        if (FSE_isError(oSize)) return oSize;
965
1.00k
    }
966
967
    /* collect weight stats */
968
6.55k
    memset(rankVal, 0, sizeof(rankVal));
969
6.55k
    weightTotal = 0;
970
813k
    for (n=0; n<oSize; n++)
971
806k
    {
972
806k
        if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return (size_t)-FSE_ERROR_corruptionDetected;
973
806k
        rankVal[huffWeight[n]]++;
974
806k
        weightTotal += (1 << huffWeight[n]) >> 1;
975
806k
    }
976
6.54k
    if (weightTotal == 0) return (size_t)-FSE_ERROR_corruptionDetected;
977
978
    /* get last non-null symbol weight (implied, total must be 2^n) */
979
6.53k
    maxBits = FSE_highbit32(weightTotal) + 1;
980
6.53k
    if (maxBits > DTable[0]) return (size_t)-FSE_ERROR_tableLog_tooLarge;   /* DTable is too small */
981
6.49k
    DTable[0] = (U16)maxBits;
982
6.49k
    {
983
6.49k
        U32 total = 1 << maxBits;
984
6.49k
        U32 rest = total - weightTotal;
985
6.49k
        U32 verif = 1 << FSE_highbit32(rest);
986
6.49k
        U32 lastWeight = FSE_highbit32(rest) + 1;
987
6.49k
        if (verif != rest) return (size_t)-FSE_ERROR_corruptionDetected;    /* last value must be a clean power of 2 */
988
6.46k
        huffWeight[oSize] = (BYTE)lastWeight;
989
6.46k
        rankVal[lastWeight]++;
990
6.46k
    }
991
992
    /* check tree construction validity */
993
6.46k
    if ((rankVal[1] < 2) || (rankVal[1] & 1)) return (size_t)-FSE_ERROR_corruptionDetected;   /* by construction : at least 2 elts of rank 1, must be even */
994
995
    /* Prepare ranks */
996
6.46k
    nextRankStart = 0;
997
54.8k
    for (n=1; n<=maxBits; n++)
998
48.3k
    {
999
48.3k
        U32 current = nextRankStart;
1000
48.3k
        nextRankStart += (rankVal[n] << (n-1));
1001
48.3k
        rankVal[n] = current;
1002
48.3k
    }
1003
1004
    /* fill DTable */
1005
816k
    for (n=0; n<=oSize; n++)
1006
809k
    {
1007
809k
        const U32 w = huffWeight[n];
1008
809k
        const U32 length = (1 << w) >> 1;
1009
809k
        U32 i;
1010
809k
        HUF_DElt D;
1011
809k
        D.byte = (BYTE)n; D.nbBits = (BYTE)(maxBits + 1 - w);
1012
2.28M
        for (i = rankVal[w]; i < rankVal[w] + length; i++)
1013
1.47M
            dt[i] = D;
1014
809k
        rankVal[w] += length;
1015
809k
    }
1016
1017
6.46k
    return iSize+1;
1018
6.46k
}
1019
1020
1021
static BYTE HUF_decodeSymbol(FSE_DStream_t* Dstream, const HUF_DElt* dt, const U32 dtLog)
1022
3.94M
{
1023
3.94M
        const size_t val = FSE_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1024
3.94M
        const BYTE c = dt[val].byte;
1025
3.94M
        FSE_skipBits(Dstream, dt[val].nbBits);
1026
3.94M
        return c;
1027
3.94M
}
1028
1029
static size_t HUF_decompress_usingDTable(   /* -3% slower when non static */
1030
          void* dst, size_t maxDstSize,
1031
    const void* cSrc, size_t cSrcSize,
1032
    const U16* DTable)
1033
6.42k
{
1034
6.42k
    if (cSrcSize < 6) return (size_t)-FSE_ERROR_srcSize_wrong;
1035
6.37k
    {
1036
6.37k
        BYTE* const ostart = (BYTE*) dst;
1037
6.37k
        BYTE* op = ostart;
1038
6.37k
        BYTE* const omax = op + maxDstSize;
1039
6.37k
        BYTE* const olimit = maxDstSize < 15 ? op : omax-15;
1040
1041
6.37k
        const void* ptr = DTable;
1042
6.37k
        const HUF_DElt* const dt = (const HUF_DElt*)(ptr)+1;
1043
6.37k
        const U32 dtLog = DTable[0];
1044
6.37k
        size_t errorCode;
1045
6.37k
        U32 reloadStatus;
1046
1047
        /* Init */
1048
1049
6.37k
        const U16* jumpTable = (const U16*)cSrc;
1050
6.37k
        const size_t length1 = FSE_readLE16(jumpTable);
1051
6.37k
        const size_t length2 = FSE_readLE16(jumpTable+1);
1052
6.37k
        const size_t length3 = FSE_readLE16(jumpTable+2);
1053
6.37k
        const size_t length4 = cSrcSize - 6 - length1 - length2 - length3;   /* check coherency !! */
1054
6.37k
        const char* const start1 = (const char*)(cSrc) + 6;
1055
6.37k
        const char* const start2 = start1 + length1;
1056
6.37k
        const char* const start3 = start2 + length2;
1057
6.37k
        const char* const start4 = start3 + length3;
1058
6.37k
        FSE_DStream_t bitD1, bitD2, bitD3, bitD4;
1059
1060
6.37k
        if (length1+length2+length3+6 >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1061
1062
6.30k
        errorCode = FSE_initDStream(&bitD1, start1, length1);
1063
6.30k
        if (FSE_isError(errorCode)) return errorCode;
1064
6.28k
        errorCode = FSE_initDStream(&bitD2, start2, length2);
1065
6.28k
        if (FSE_isError(errorCode)) return errorCode;
1066
6.25k
        errorCode = FSE_initDStream(&bitD3, start3, length3);
1067
6.25k
        if (FSE_isError(errorCode)) return errorCode;
1068
6.21k
        errorCode = FSE_initDStream(&bitD4, start4, length4);
1069
6.21k
        if (FSE_isError(errorCode)) return errorCode;
1070
1071
6.17k
        reloadStatus=FSE_reloadDStream(&bitD2);
1072
1073
        /* 16 symbols per loop */
1074
237k
        for ( ; (reloadStatus<FSE_DStream_completed) && (op<olimit);  /* D2-3-4 are supposed to be synchronized and finish together */
1075
231k
            op+=16, reloadStatus = FSE_reloadDStream(&bitD2) | FSE_reloadDStream(&bitD3) | FSE_reloadDStream(&bitD4), FSE_reloadDStream(&bitD1))
1076
231k
        {
1077
231k
    #define HUF_DECODE_SYMBOL_0(n, Dstream) \
1078
1.17M
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog);
1079
1080
231k
    #define HUF_DECODE_SYMBOL_1(n, Dstream) \
1081
1.85M
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1082
1.85M
            if (FSE_32bits() && (HUF_MAX_TABLELOG>12)) FSE_reloadDStream(&Dstream)
1083
1084
231k
    #define HUF_DECODE_SYMBOL_2(n, Dstream) \
1085
925k
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1086
925k
            if (FSE_32bits()) FSE_reloadDStream(&Dstream)
1087
1088
231k
            HUF_DECODE_SYMBOL_1( 0, bitD1);
1089
231k
            HUF_DECODE_SYMBOL_1( 1, bitD2);
1090
231k
            HUF_DECODE_SYMBOL_1( 2, bitD3);
1091
231k
            HUF_DECODE_SYMBOL_1( 3, bitD4);
1092
231k
            HUF_DECODE_SYMBOL_2( 4, bitD1);
1093
231k
            HUF_DECODE_SYMBOL_2( 5, bitD2);
1094
231k
            HUF_DECODE_SYMBOL_2( 6, bitD3);
1095
231k
            HUF_DECODE_SYMBOL_2( 7, bitD4);
1096
231k
            HUF_DECODE_SYMBOL_1( 8, bitD1);
1097
231k
            HUF_DECODE_SYMBOL_1( 9, bitD2);
1098
231k
            HUF_DECODE_SYMBOL_1(10, bitD3);
1099
231k
            HUF_DECODE_SYMBOL_1(11, bitD4);
1100
231k
            HUF_DECODE_SYMBOL_0(12, bitD1);
1101
231k
            HUF_DECODE_SYMBOL_0(13, bitD2);
1102
231k
            HUF_DECODE_SYMBOL_0(14, bitD3);
1103
231k
            HUF_DECODE_SYMBOL_0(15, bitD4);
1104
231k
        }
1105
1106
6.17k
        if (reloadStatus!=FSE_DStream_completed)   /* not complete : some bitStream might be FSE_DStream_unfinished */
1107
377
            return (size_t)-FSE_ERROR_corruptionDetected;
1108
1109
        /* tail */
1110
5.79k
        {
1111
            /* bitTail = bitD1; */   /* *much* slower : -20% !??! */
1112
5.79k
            FSE_DStream_t bitTail;
1113
5.79k
            bitTail.ptr = bitD1.ptr;
1114
5.79k
            bitTail.bitsConsumed = bitD1.bitsConsumed;
1115
5.79k
            bitTail.bitContainer = bitD1.bitContainer;   /* required in case of FSE_DStream_endOfBuffer */
1116
5.79k
            bitTail.start = start1;
1117
250k
            for ( ; (FSE_reloadDStream(&bitTail) < FSE_DStream_completed) && (op<omax) ; op++)
1118
245k
            {
1119
245k
                HUF_DECODE_SYMBOL_0(0, bitTail);
1120
245k
            }
1121
1122
5.79k
            if (FSE_endOfDStream(&bitTail))
1123
5.73k
                return op-ostart;
1124
5.79k
        }
1125
1126
60
        if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall;   /* dst buffer is full, but cSrc unfinished */
1127
1128
36
        return (size_t)-FSE_ERROR_corruptionDetected;
1129
60
    }
1130
60
}
1131
1132
1133
static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1134
7.09k
{
1135
7.09k
    HUF_CREATE_STATIC_DTABLE(DTable, HUF_MAX_TABLELOG);
1136
7.09k
    const BYTE* ip = (const BYTE*) cSrc;
1137
7.09k
    size_t errorCode;
1138
1139
7.09k
    errorCode = HUF_readDTable (DTable, cSrc, cSrcSize);
1140
7.09k
    if (FSE_isError(errorCode)) return errorCode;
1141
6.46k
    if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1142
6.42k
    ip += errorCode;
1143
6.42k
    cSrcSize -= errorCode;
1144
1145
6.42k
    return HUF_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, DTable);
1146
6.46k
}
1147
1148
1149
#endif   /* FSE_COMMONDEFS_ONLY */
1150
1151
/*
1152
    zstd - standard compression library
1153
    Copyright (C) 2014-2015, Yann Collet.
1154
1155
    BSD 2-Clause License (https://opensource.org/licenses/bsd-license.php)
1156
1157
    Redistribution and use in source and binary forms, with or without
1158
    modification, are permitted provided that the following conditions are
1159
    met:
1160
    * Redistributions of source code must retain the above copyright
1161
    notice, this list of conditions and the following disclaimer.
1162
    * Redistributions in binary form must reproduce the above
1163
    copyright notice, this list of conditions and the following disclaimer
1164
    in the documentation and/or other materials provided with the
1165
    distribution.
1166
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1167
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1168
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1169
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
1170
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
1171
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
1172
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
1173
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
1174
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
1175
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
1176
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
1177
1178
    You can contact the author at :
1179
    - zstd source repository : https://github.com/Cyan4973/zstd
1180
    - ztsd public forum : https://groups.google.com/forum/#!forum/lz4c
1181
*/
1182
1183
/****************************************************************
1184
*  Tuning parameters
1185
*****************************************************************/
1186
/* MEMORY_USAGE :
1187
*  Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
1188
*  Increasing memory usage improves compression ratio
1189
*  Reduced memory usage can improve speed, due to cache effect */
1190
#define ZSTD_MEMORY_USAGE 17
1191
1192
1193
/**************************************
1194
   CPU Feature Detection
1195
**************************************/
1196
/*
1197
 * Automated efficient unaligned memory access detection
1198
 * Based on known hardware architectures
1199
 * This list will be updated thanks to feedbacks
1200
 */
1201
#if defined(CPU_HAS_EFFICIENT_UNALIGNED_MEMORY_ACCESS) \
1202
    || defined(__ARM_FEATURE_UNALIGNED) \
1203
    || defined(__i386__) || defined(__x86_64__) \
1204
    || defined(_M_IX86) || defined(_M_X64) \
1205
    || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__) \
1206
    || (defined(_M_ARM) && (_M_ARM >= 7))
1207
#  define ZSTD_UNALIGNED_ACCESS 1
1208
#else
1209
#  define ZSTD_UNALIGNED_ACCESS 0
1210
#endif
1211
1212
1213
/********************************************************
1214
*  Includes
1215
*********************************************************/
1216
#include <stdlib.h>      /* calloc */
1217
#include <string.h>      /* memcpy, memmove */
1218
#include <stdio.h>       /* debug : printf */
1219
1220
1221
/********************************************************
1222
*  Compiler specifics
1223
*********************************************************/
1224
#ifdef __AVX2__
1225
#  include <immintrin.h>   /* AVX2 intrinsics */
1226
#endif
1227
1228
#ifdef _MSC_VER    /* Visual Studio */
1229
#  include <intrin.h>                    /* For Visual 2005 */
1230
#  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */
1231
#  pragma warning(disable : 4324)        /* disable: C4324: padded structure */
1232
#endif
1233
1234
1235
#ifndef MEM_ACCESS_MODULE
1236
#define MEM_ACCESS_MODULE
1237
/********************************************************
1238
*  Basic Types
1239
*********************************************************/
1240
#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */
1241
# if defined(_AIX)
1242
#  include <inttypes.h>
1243
# else
1244
#  include <stdint.h> /* intptr_t */
1245
# endif
1246
typedef  uint8_t BYTE;
1247
typedef uint16_t U16;
1248
typedef  int16_t S16;
1249
typedef uint32_t U32;
1250
typedef  int32_t S32;
1251
typedef uint64_t U64;
1252
#else
1253
typedef unsigned char       BYTE;
1254
typedef unsigned short      U16;
1255
typedef   signed short      S16;
1256
typedef unsigned int        U32;
1257
typedef   signed int        S32;
1258
typedef unsigned long long  U64;
1259
#endif
1260
1261
#endif   /* MEM_ACCESS_MODULE */
1262
1263
1264
/********************************************************
1265
*  Constants
1266
*********************************************************/
1267
static const U32 ZSTD_magicNumber = 0xFD2FB51E;   /* 3rd version : seqNb header */
1268
1269
#define HASH_LOG (ZSTD_MEMORY_USAGE - 2)
1270
#define HASH_TABLESIZE (1 << HASH_LOG)
1271
#define HASH_MASK (HASH_TABLESIZE - 1)
1272
1273
#define KNUTH 2654435761
1274
1275
#define BIT7 128
1276
#define BIT6  64
1277
#define BIT5  32
1278
#define BIT4  16
1279
1280
11.3k
#define KB *(1 <<10)
1281
#define MB *(1 <<20)
1282
#define GB *(1U<<30)
1283
1284
11.3k
#define BLOCKSIZE (128 KB)                 /* define, for static allocation */
1285
1286
#define WORKPLACESIZE (BLOCKSIZE*3)
1287
1.12M
#define MINMATCH 4
1288
589k
#define MLbits   7
1289
579k
#define LLbits   6
1290
13.0k
#define Offbits  5
1291
564k
#define MaxML  ((1<<MLbits )-1)
1292
564k
#define MaxLL  ((1<<LLbits )-1)
1293
2.85k
#define MaxOff ((1<<Offbits)-1)
1294
#define LitFSELog  11
1295
2.23k
#define MLFSELog   10
1296
2.31k
#define LLFSELog   10
1297
2.79k
#define OffFSELog   9
1298
#define MAX(a,b) ((a)<(b)?(b):(a))
1299
#define MaxSeq MAX(MaxLL, MaxML)
1300
1301
#define LITERAL_NOENTROPY 63
1302
#define COMMAND_NOENTROPY 7   /* to remove */
1303
1304
359
#define ZSTD_CONTENTSIZE_ERROR   (0ULL - 2)
1305
1306
static const size_t ZSTD_blockHeaderSize = 3;
1307
static const size_t ZSTD_frameHeaderSize = 4;
1308
1309
1310
/********************************************************
1311
*  Memory operations
1312
*********************************************************/
1313
1.12M
static unsigned ZSTD_32bits(void) { return sizeof(void*)==4; }
1314
1315
static unsigned ZSTD_isLittleEndian(void)
1316
17.0k
{
1317
17.0k
    const union { U32 i; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
1318
17.0k
    return one.c[0];
1319
17.0k
}
1320
1321
17.0k
static U16    ZSTD_read16(const void* p) { U16 r; memcpy(&r, p, sizeof(r)); return r; }
1322
1323
508k
static void   ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
1324
1325
7.29M
static void   ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
1326
1327
7.24M
#define COPY8(d,s)    { ZSTD_copy8(d,s); d+=8; s+=8; }
1328
1329
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
1330
560k
{
1331
560k
    const BYTE* ip = (const BYTE*)src;
1332
560k
    BYTE* op = (BYTE*)dst;
1333
560k
    BYTE* const oend = op + length;
1334
7.80M
    while (op < oend) COPY8(op, ip);
1335
560k
}
1336
1337
static U16 ZSTD_readLE16(const void* memPtr)
1338
17.0k
{
1339
17.0k
    if (ZSTD_isLittleEndian()) return ZSTD_read16(memPtr);
1340
0
    else
1341
0
    {
1342
0
        const BYTE* p = (const BYTE*)memPtr;
1343
0
        return (U16)((U16)p[0] + ((U16)p[1]<<8));
1344
0
    }
1345
17.0k
}
1346
1347
static U32 ZSTD_readLE24(const void* memPtr)
1348
517
{
1349
517
    return ZSTD_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
1350
517
}
1351
1352
static U32 ZSTD_readBE32(const void* memPtr)
1353
21.4k
{
1354
21.4k
    const BYTE* p = (const BYTE*)memPtr;
1355
21.4k
    return (U32)(((U32)p[0]<<24) + ((U32)p[1]<<16) + ((U32)p[2]<<8) + ((U32)p[3]<<0));
1356
21.4k
}
1357
1358
1359
/**************************************
1360
*  Local structures
1361
***************************************/
1362
typedef struct ZSTD_Cctx_s ZSTD_Cctx;
1363
1364
typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
1365
1366
typedef struct
1367
{
1368
    blockType_t blockType;
1369
    U32 origSize;
1370
} blockProperties_t;
1371
1372
typedef struct {
1373
    void* buffer;
1374
    U32*  offsetStart;
1375
    U32*  offset;
1376
    BYTE* offCodeStart;
1377
    BYTE* offCode;
1378
    BYTE* litStart;
1379
    BYTE* lit;
1380
    BYTE* litLengthStart;
1381
    BYTE* litLength;
1382
    BYTE* matchLengthStart;
1383
    BYTE* matchLength;
1384
    BYTE* dumpsStart;
1385
    BYTE* dumps;
1386
} SeqStore_t;
1387
1388
1389
typedef struct ZSTD_Cctx_s
1390
{
1391
    const BYTE* base;
1392
    U32 current;
1393
    U32 nextUpdate;
1394
    SeqStore_t seqStore;
1395
#ifdef __AVX2__
1396
    __m256i hashTable[HASH_TABLESIZE>>3];
1397
#else
1398
    U32 hashTable[HASH_TABLESIZE];
1399
#endif
1400
    BYTE buffer[WORKPLACESIZE];
1401
} cctxi_t;
1402
1403
1404
1405
1406
/**************************************
1407
*  Error Management
1408
**************************************/
1409
/* published entry point */
1410
751k
unsigned ZSTDv01_isError(size_t code) { return ERR_isError(code); }
1411
1412
1413
/**************************************
1414
*  Tool functions
1415
**************************************/
1416
#define ZSTD_VERSION_MAJOR    0    /* for breaking interface changes  */
1417
#define ZSTD_VERSION_MINOR    1    /* for new (non-breaking) interface capabilities */
1418
#define ZSTD_VERSION_RELEASE  3    /* for tweaks, bug-fixes, or development */
1419
#define ZSTD_VERSION_NUMBER  (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
1420
1421
/**************************************************************
1422
*   Decompression code
1423
**************************************************************/
1424
1425
static size_t ZSTDv01_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
1426
127k
{
1427
127k
    const BYTE* const in = (const BYTE* const)src;
1428
127k
    BYTE headerFlags;
1429
127k
    U32 cSize;
1430
1431
127k
    if (srcSize < 3) return ERROR(srcSize_wrong);
1432
1433
126k
    headerFlags = *in;
1434
126k
    cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
1435
1436
126k
    bpPtr->blockType = (blockType_t)(headerFlags >> 6);
1437
126k
    bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
1438
1439
126k
    if (bpPtr->blockType == bt_end) return 0;
1440
118k
    if (bpPtr->blockType == bt_rle) return 1;
1441
66.2k
    return cSize;
1442
118k
}
1443
1444
1445
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1446
4.97k
{
1447
4.97k
    if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
1448
4.91k
    if (srcSize > 0) {
1449
1.01k
        memcpy(dst, src, srcSize);
1450
1.01k
    }
1451
4.91k
    return srcSize;
1452
4.97k
}
1453
1454
1455
static size_t ZSTD_decompressLiterals(void* ctx,
1456
                                      void* dst, size_t maxDstSize,
1457
                                const void* src, size_t srcSize)
1458
7.17k
{
1459
7.17k
    BYTE* op = (BYTE*)dst;
1460
7.17k
    BYTE* const oend = op + maxDstSize;
1461
7.17k
    const BYTE* ip = (const BYTE*)src;
1462
7.17k
    size_t errorCode;
1463
7.17k
    size_t litSize;
1464
1465
    /* check : minimum 2, for litSize, +1, for content */
1466
7.17k
    if (srcSize <= 3) return ERROR(corruption_detected);
1467
1468
7.17k
    litSize = ip[1] + (ip[0]<<8);
1469
7.17k
    litSize += ((ip[-3] >> 3) & 7) << 16;   /* mmmmh.... */
1470
7.17k
    op = oend - litSize;
1471
1472
7.17k
    (void)ctx;
1473
7.17k
    if (litSize > maxDstSize) return ERROR(dstSize_tooSmall);
1474
7.09k
    errorCode = HUF_decompress(op, litSize, ip+2, srcSize-2);
1475
7.09k
    if (FSE_isError(errorCode)) return ERROR(GENERIC);
1476
5.73k
    return litSize;
1477
7.09k
}
1478
1479
1480
static size_t ZSTDv01_decodeLiteralsBlock(void* ctx,
1481
                                void* dst, size_t maxDstSize,
1482
                          const BYTE** litStart, size_t* litSize,
1483
                          const void* src, size_t srcSize)
1484
18.9k
{
1485
18.9k
    const BYTE* const istart = (const BYTE* const)src;
1486
18.9k
    const BYTE* ip = istart;
1487
18.9k
    BYTE* const ostart = (BYTE* const)dst;
1488
18.9k
    BYTE* const oend = ostart + maxDstSize;
1489
18.9k
    blockProperties_t litbp;
1490
1491
18.9k
    size_t litcSize = ZSTDv01_getcBlockSize(src, srcSize, &litbp);
1492
18.9k
    if (ZSTDv01_isError(litcSize)) return litcSize;
1493
18.2k
    if (litcSize > srcSize - ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1494
18.1k
    ip += ZSTD_blockHeaderSize;
1495
1496
18.1k
    switch(litbp.blockType)
1497
18.1k
    {
1498
6.01k
    case bt_raw:
1499
6.01k
        *litStart = ip;
1500
6.01k
        ip += litcSize;
1501
6.01k
        *litSize = litcSize;
1502
6.01k
        break;
1503
4.91k
    case bt_rle:
1504
4.91k
        {
1505
4.91k
            size_t rleSize = litbp.origSize;
1506
4.91k
            if (rleSize>maxDstSize) return ERROR(dstSize_tooSmall);
1507
4.86k
            if (!srcSize) return ERROR(srcSize_wrong);
1508
4.86k
            if (rleSize > 0) {
1509
2.88k
                memset(oend - rleSize, *ip, rleSize);
1510
2.88k
            }
1511
4.86k
            *litStart = oend - rleSize;
1512
4.86k
            *litSize = rleSize;
1513
4.86k
            ip++;
1514
4.86k
            break;
1515
4.86k
        }
1516
7.17k
    case bt_compressed:
1517
7.17k
        {
1518
7.17k
            size_t decodedLitSize = ZSTD_decompressLiterals(ctx, dst, maxDstSize, ip, litcSize);
1519
7.17k
            if (ZSTDv01_isError(decodedLitSize)) return decodedLitSize;
1520
5.73k
            *litStart = oend - decodedLitSize;
1521
5.73k
            *litSize = decodedLitSize;
1522
5.73k
            ip += litcSize;
1523
5.73k
            break;
1524
7.17k
        }
1525
22
    case bt_end:
1526
22
    default:
1527
22
        return ERROR(GENERIC);
1528
18.1k
    }
1529
1530
16.6k
    return ip-istart;
1531
18.1k
}
1532
1533
1534
static size_t ZSTDv01_decodeSeqHeaders(int* nbSeq, const BYTE** dumpsPtr, size_t* dumpsLengthPtr,
1535
                         FSE_DTable* DTableLL, FSE_DTable* DTableML, FSE_DTable* DTableOffb,
1536
                         const void* src, size_t srcSize)
1537
16.6k
{
1538
16.6k
    const BYTE* const istart = (const BYTE* const)src;
1539
16.6k
    const BYTE* ip = istart;
1540
16.6k
    const BYTE* const iend = istart + srcSize;
1541
16.6k
    U32 LLtype, Offtype, MLtype;
1542
16.6k
    U32 LLlog, Offlog, MLlog;
1543
16.6k
    size_t dumpsLength;
1544
1545
    /* check */
1546
16.6k
    if (srcSize < 5) return ERROR(srcSize_wrong);
1547
1548
    /* SeqHead */
1549
16.5k
    *nbSeq = ZSTD_readLE16(ip); ip+=2;
1550
16.5k
    LLtype  = *ip >> 6;
1551
16.5k
    Offtype = (*ip >> 4) & 3;
1552
16.5k
    MLtype  = (*ip >> 2) & 3;
1553
16.5k
    if (*ip & 2)
1554
2.33k
    {
1555
2.33k
        dumpsLength  = ip[2];
1556
2.33k
        dumpsLength += ip[1] << 8;
1557
2.33k
        ip += 3;
1558
2.33k
    }
1559
14.1k
    else
1560
14.1k
    {
1561
14.1k
        dumpsLength  = ip[1];
1562
14.1k
        dumpsLength += (ip[0] & 1) << 8;
1563
14.1k
        ip += 2;
1564
14.1k
    }
1565
16.5k
    *dumpsPtr = ip;
1566
16.5k
    ip += dumpsLength;
1567
16.5k
    *dumpsLengthPtr = dumpsLength;
1568
1569
    /* check */
1570
16.5k
    if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
1571
1572
    /* sequences */
1573
16.4k
    {
1574
16.4k
        S16 norm[MaxML+1];    /* assumption : MaxML >= MaxLL and MaxOff */
1575
16.4k
        size_t headerSize;
1576
1577
        /* Build DTables */
1578
16.4k
        switch(LLtype)
1579
16.4k
        {
1580
6.45k
        case bt_rle :
1581
6.45k
            LLlog = 0;
1582
6.45k
            FSE_buildDTable_rle(DTableLL, *ip++); break;
1583
7.59k
        case bt_raw :
1584
7.59k
            LLlog = LLbits;
1585
7.59k
            FSE_buildDTable_raw(DTableLL, LLbits); break;
1586
2.35k
        default :
1587
2.35k
            {   U32 max = MaxLL;
1588
2.35k
                headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
1589
2.35k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1590
2.31k
                if (LLlog > LLFSELog) return ERROR(corruption_detected);
1591
2.29k
                ip += headerSize;
1592
2.29k
                FSE_buildDTable(DTableLL, norm, max, LLlog);
1593
2.29k
        }   }
1594
1595
16.3k
        switch(Offtype)
1596
16.3k
        {
1597
8.39k
        case bt_rle :
1598
8.39k
            Offlog = 0;
1599
8.39k
            if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1600
8.38k
            FSE_buildDTable_rle(DTableOffb, *ip++); break;
1601
5.09k
        case bt_raw :
1602
5.09k
            Offlog = Offbits;
1603
5.09k
            FSE_buildDTable_raw(DTableOffb, Offbits); break;
1604
2.85k
        default :
1605
2.85k
            {   U32 max = MaxOff;
1606
2.85k
                headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
1607
2.85k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1608
2.79k
                if (Offlog > OffFSELog) return ERROR(corruption_detected);
1609
2.77k
                ip += headerSize;
1610
2.77k
                FSE_buildDTable(DTableOffb, norm, max, Offlog);
1611
2.77k
        }   }
1612
1613
16.2k
        switch(MLtype)
1614
16.2k
        {
1615
1.33k
        case bt_rle :
1616
1.33k
            MLlog = 0;
1617
1.33k
            if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1618
1.32k
            FSE_buildDTable_rle(DTableML, *ip++); break;
1619
12.6k
        case bt_raw :
1620
12.6k
            MLlog = MLbits;
1621
12.6k
            FSE_buildDTable_raw(DTableML, MLbits); break;
1622
2.28k
        default :
1623
2.28k
            {   U32 max = MaxML;
1624
2.28k
                headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
1625
2.28k
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1626
2.23k
                if (MLlog > MLFSELog) return ERROR(corruption_detected);
1627
2.21k
                ip += headerSize;
1628
2.21k
                FSE_buildDTable(DTableML, norm, max, MLlog);
1629
2.21k
    }   }   }
1630
1631
16.1k
    return ip-istart;
1632
16.2k
}
1633
1634
1635
typedef struct {
1636
    size_t litLength;
1637
    size_t offset;
1638
    size_t matchLength;
1639
} seq_t;
1640
1641
typedef struct {
1642
    FSE_DStream_t DStream;
1643
    FSE_DState_t stateLL;
1644
    FSE_DState_t stateOffb;
1645
    FSE_DState_t stateML;
1646
    size_t prevOffset;
1647
    const BYTE* dumps;
1648
    const BYTE* dumpsEnd;
1649
} seqState_t;
1650
1651
1652
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
1653
561k
{
1654
561k
    size_t litLength;
1655
561k
    size_t prevOffset;
1656
561k
    size_t offset;
1657
561k
    size_t matchLength;
1658
561k
    const BYTE* dumps = seqState->dumps;
1659
561k
    const BYTE* const de = seqState->dumpsEnd;
1660
1661
    /* Literal length */
1662
561k
    litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
1663
561k
    prevOffset = litLength ? seq->offset : seqState->prevOffset;
1664
561k
    seqState->prevOffset = seq->offset;
1665
561k
    if (litLength == MaxLL)
1666
8.72k
    {
1667
8.72k
        const U32 add = dumps<de ? *dumps++ : 0;
1668
8.72k
        if (add < 255) litLength += add;
1669
233
        else
1670
233
        {
1671
233
            if (dumps<=(de-3))
1672
210
            {
1673
210
                litLength = ZSTD_readLE24(dumps);
1674
210
                dumps += 3;
1675
210
            }
1676
233
        }
1677
8.72k
    }
1678
1679
    /* Offset */
1680
561k
    {
1681
561k
        U32 offsetCode, nbBits;
1682
561k
        offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream));
1683
561k
        if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1684
561k
        nbBits = offsetCode - 1;
1685
561k
        if (offsetCode==0) nbBits = 0;   /* cmove */
1686
561k
        offset = ((size_t)1 << (nbBits & ((sizeof(offset)*8)-1))) + FSE_readBits(&(seqState->DStream), nbBits);
1687
561k
        if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1688
561k
        if (offsetCode==0) offset = prevOffset;
1689
561k
    }
1690
1691
    /* MatchLength */
1692
561k
    matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
1693
561k
    if (matchLength == MaxML)
1694
12.2k
    {
1695
12.2k
        const U32 add = dumps<de ? *dumps++ : 0;
1696
12.2k
        if (add < 255) matchLength += add;
1697
336
        else
1698
336
        {
1699
336
            if (dumps<=(de-3))
1700
307
            {
1701
307
                matchLength = ZSTD_readLE24(dumps);
1702
307
                dumps += 3;
1703
307
            }
1704
336
        }
1705
12.2k
    }
1706
561k
    matchLength += MINMATCH;
1707
1708
    /* save result */
1709
561k
    seq->litLength = litLength;
1710
561k
    seq->offset = offset;
1711
561k
    seq->matchLength = matchLength;
1712
561k
    seqState->dumps = dumps;
1713
561k
}
1714
1715
1716
static size_t ZSTD_execSequence(BYTE* op,
1717
                                seq_t sequence,
1718
                                const BYTE** litPtr, const BYTE* const litLimit,
1719
                                BYTE* const base, BYTE* const oend)
1720
561k
{
1721
561k
    static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4};   /* added */
1722
561k
    static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11};   /* subtracted */
1723
561k
    const BYTE* const ostart = op;
1724
561k
    BYTE* const oLitEnd = op + sequence.litLength;
1725
561k
    const size_t litLength = sequence.litLength;
1726
561k
    BYTE* const endMatch = op + litLength + sequence.matchLength;    /* risk : address space overflow (32-bits) */
1727
561k
    const BYTE* const litEnd = *litPtr + litLength;
1728
1729
    /* checks */
1730
561k
    size_t const seqLength = sequence.litLength + sequence.matchLength;
1731
1732
561k
    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
1733
561k
    if (sequence.litLength > (size_t)(litLimit - *litPtr)) return ERROR(corruption_detected);
1734
    /* Now we know there are no overflow in literal nor match lengths, can use pointer checks */
1735
561k
    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
1736
1737
561k
    if (endMatch > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */
1738
561k
    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */
1739
561k
    if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall);  /* overwrite literal segment */
1740
1741
    /* copy Literals */
1742
561k
    ZSTD_memmove(op, *litPtr, sequence.litLength);   /* note : v0.1 seems to allow scenarios where output or input are close to end of buffer */
1743
1744
561k
    op += litLength;
1745
561k
    *litPtr = litEnd;   /* update for next sequence */
1746
1747
    /* check : last match must be at a minimum distance of 8 from end of dest buffer */
1748
561k
    if (oend-op < 8) return ERROR(dstSize_tooSmall);
1749
1750
    /* copy Match */
1751
561k
    {
1752
561k
        const U32 overlapRisk = (((size_t)(litEnd - endMatch)) < 12);
1753
561k
        const BYTE* match = op - sequence.offset;            /* possible underflow at op - offset ? */
1754
561k
        size_t qutt = 12;
1755
561k
        U64 saved[2];
1756
1757
        /* check */
1758
561k
        if (match < base) return ERROR(corruption_detected);
1759
561k
        if (sequence.offset > (size_t)base) return ERROR(corruption_detected);
1760
1761
        /* save beginning of literal sequence, in case of write overlap */
1762
561k
        if (overlapRisk)
1763
170
        {
1764
170
            if ((endMatch + qutt) > oend) qutt = oend-endMatch;
1765
170
            memcpy(saved, endMatch, qutt);
1766
170
        }
1767
1768
561k
        if (sequence.offset < 8)
1769
508k
        {
1770
508k
            const int dec64 = dec64table[sequence.offset];
1771
508k
            op[0] = match[0];
1772
508k
            op[1] = match[1];
1773
508k
            op[2] = match[2];
1774
508k
            op[3] = match[3];
1775
508k
            match += dec32table[sequence.offset];
1776
508k
            ZSTD_copy4(op+4, match);
1777
508k
            match -= dec64;
1778
508k
        } else { ZSTD_copy8(op, match); }
1779
561k
        op += 8; match += 8;
1780
1781
561k
        if (endMatch > oend-(16-MINMATCH))
1782
135
        {
1783
135
            if (op < oend-8)
1784
59
            {
1785
59
                ZSTD_wildcopy(op, match, (oend-8) - op);
1786
59
                match += (oend-8) - op;
1787
59
                op = oend-8;
1788
59
            }
1789
306
            while (op<endMatch) *op++ = *match++;
1790
135
        }
1791
560k
        else
1792
560k
            ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
1793
1794
        /* restore, in case of overlap */
1795
561k
        if (overlapRisk) memcpy(endMatch, saved, qutt);
1796
561k
    }
1797
1798
0
    return endMatch-ostart;
1799
561k
}
1800
1801
typedef struct ZSTDv01_Dctx_s
1802
{
1803
    U32 LLTable[FSE_DTABLE_SIZE_U32(LLFSELog)];
1804
    U32 OffTable[FSE_DTABLE_SIZE_U32(OffFSELog)];
1805
    U32 MLTable[FSE_DTABLE_SIZE_U32(MLFSELog)];
1806
    void* previousDstEnd;
1807
    void* base;
1808
    size_t expected;
1809
    blockType_t bType;
1810
    U32 phase;
1811
} dctx_t;
1812
1813
1814
static size_t ZSTD_decompressSequences(
1815
                               void* ctx,
1816
                               void* dst, size_t maxDstSize,
1817
                         const void* seqStart, size_t seqSize,
1818
                         const BYTE* litStart, size_t litSize)
1819
16.6k
{
1820
16.6k
    dctx_t* dctx = (dctx_t*)ctx;
1821
16.6k
    const BYTE* ip = (const BYTE*)seqStart;
1822
16.6k
    const BYTE* const iend = ip + seqSize;
1823
16.6k
    BYTE* const ostart = (BYTE* const)dst;
1824
16.6k
    BYTE* op = ostart;
1825
16.6k
    BYTE* const oend = ostart + maxDstSize;
1826
16.6k
    size_t errorCode = 0;
1827
16.6k
    size_t dumpsLength = 0;
1828
16.6k
    const BYTE* litPtr = litStart;
1829
16.6k
    const BYTE* const litEnd = litStart + litSize;
1830
16.6k
    int nbSeq = 0;
1831
16.6k
    const BYTE* dumps = NULL;
1832
16.6k
    U32* DTableLL = dctx->LLTable;
1833
16.6k
    U32* DTableML = dctx->MLTable;
1834
16.6k
    U32* DTableOffb = dctx->OffTable;
1835
16.6k
    BYTE* const base = (BYTE*) (dctx->base);
1836
1837
    /* Build Decoding Tables */
1838
16.6k
    errorCode = ZSTDv01_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
1839
16.6k
                                      DTableLL, DTableML, DTableOffb,
1840
16.6k
                                      ip, iend-ip);
1841
16.6k
    if (ZSTDv01_isError(errorCode)) return errorCode;
1842
16.1k
    ip += errorCode;
1843
1844
    /* Regen sequences */
1845
16.1k
    {
1846
16.1k
        seq_t sequence;
1847
16.1k
        seqState_t seqState;
1848
1849
16.1k
        memset(&sequence, 0, sizeof(sequence));
1850
16.1k
        seqState.dumps = dumps;
1851
16.1k
        seqState.dumpsEnd = dumps + dumpsLength;
1852
16.1k
        seqState.prevOffset = 1;
1853
16.1k
        errorCode = FSE_initDStream(&(seqState.DStream), ip, iend-ip);
1854
16.1k
        if (FSE_isError(errorCode)) return ERROR(corruption_detected);
1855
16.0k
        FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
1856
16.0k
        FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
1857
16.0k
        FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
1858
1859
577k
        for ( ; (FSE_reloadDStream(&(seqState.DStream)) <= FSE_DStream_completed) && (nbSeq>0) ; )
1860
561k
        {
1861
561k
            size_t oneSeqSize;
1862
561k
            nbSeq--;
1863
561k
            ZSTD_decodeSequence(&sequence, &seqState);
1864
561k
            oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
1865
561k
            if (ZSTDv01_isError(oneSeqSize)) return oneSeqSize;
1866
561k
            op += oneSeqSize;
1867
561k
        }
1868
1869
        /* check if reached exact end */
1870
15.1k
        if ( !FSE_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected);   /* requested too much : data is corrupted */
1871
14.9k
        if (nbSeq<0) return ERROR(corruption_detected);   /* requested too many sequences : data is corrupted */
1872
1873
        /* last literal segment */
1874
14.9k
        {
1875
14.9k
            size_t lastLLSize = litEnd - litPtr;
1876
14.9k
            if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
1877
14.9k
            if (lastLLSize > 0) {
1878
7.67k
                if (op != litPtr) memmove(op, litPtr, lastLLSize);
1879
7.67k
                op += lastLLSize;
1880
7.67k
            }
1881
14.9k
        }
1882
14.9k
    }
1883
1884
0
    return op-ostart;
1885
14.9k
}
1886
1887
1888
static size_t ZSTD_decompressBlock(
1889
                            void* ctx,
1890
                            void* dst, size_t maxDstSize,
1891
                      const void* src, size_t srcSize)
1892
18.9k
{
1893
    /* blockType == blockCompressed, srcSize is trusted */
1894
18.9k
    const BYTE* ip = (const BYTE*)src;
1895
18.9k
    const BYTE* litPtr = NULL;
1896
18.9k
    size_t litSize = 0;
1897
18.9k
    size_t errorCode;
1898
1899
    /* Decode literals sub-block */
1900
18.9k
    errorCode = ZSTDv01_decodeLiteralsBlock(ctx, dst, maxDstSize, &litPtr, &litSize, src, srcSize);
1901
18.9k
    if (ZSTDv01_isError(errorCode)) return errorCode;
1902
16.6k
    ip += errorCode;
1903
16.6k
    srcSize -= errorCode;
1904
1905
16.6k
    return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize, litPtr, litSize);
1906
18.9k
}
1907
1908
1909
size_t ZSTDv01_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1910
9.75k
{
1911
9.75k
    const BYTE* ip = (const BYTE*)src;
1912
9.75k
    const BYTE* iend = ip + srcSize;
1913
9.75k
    BYTE* const ostart = (BYTE* const)dst;
1914
9.75k
    BYTE* op = ostart;
1915
9.75k
    BYTE* const oend = ostart + maxDstSize;
1916
9.75k
    size_t remainingSize = srcSize;
1917
9.75k
    U32 magicNumber;
1918
9.75k
    size_t errorCode=0;
1919
9.75k
    blockProperties_t blockProperties = { 0 };
1920
1921
    /* Frame Header */
1922
9.75k
    if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1923
9.75k
    magicNumber = ZSTD_readBE32(src);
1924
9.75k
    if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
1925
9.75k
    ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
1926
1927
    /* Loop on each block */
1928
25.6k
    while (1)
1929
25.6k
    {
1930
25.6k
        size_t blockSize = ZSTDv01_getcBlockSize(ip, iend-ip, &blockProperties);
1931
25.6k
        if (ZSTDv01_isError(blockSize)) return blockSize;
1932
1933
25.6k
        ip += ZSTD_blockHeaderSize;
1934
25.6k
        remainingSize -= ZSTD_blockHeaderSize;
1935
25.6k
        if (blockSize > remainingSize) return ERROR(srcSize_wrong);
1936
1937
25.6k
        switch(blockProperties.blockType)
1938
25.6k
        {
1939
18.9k
        case bt_compressed:
1940
18.9k
            errorCode = ZSTD_decompressBlock(ctx, op, oend-op, ip, blockSize);
1941
18.9k
            break;
1942
4.97k
        case bt_raw :
1943
4.97k
            errorCode = ZSTD_copyUncompressedBlock(op, oend-op, ip, blockSize);
1944
4.97k
            break;
1945
16
        case bt_rle :
1946
16
            return ERROR(GENERIC);   /* not yet supported */
1947
0
            break;
1948
1.76k
        case bt_end :
1949
            /* end of frame */
1950
1.76k
            if (remainingSize) return ERROR(srcSize_wrong);
1951
1.76k
            break;
1952
1.76k
        default:
1953
0
            return ERROR(GENERIC);
1954
25.6k
        }
1955
25.6k
        if (blockSize == 0) break;   /* bt_end */
1956
1957
19.3k
        if (ZSTDv01_isError(errorCode)) return errorCode;
1958
15.9k
        op += errorCode;
1959
15.9k
        ip += blockSize;
1960
15.9k
        remainingSize -= blockSize;
1961
15.9k
    }
1962
1963
6.32k
    return op-ostart;
1964
9.75k
}
1965
1966
size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1967
9.75k
{
1968
9.75k
    dctx_t ctx;
1969
9.75k
    ctx.base = dst;
1970
9.75k
    return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
1971
9.75k
}
1972
1973
/* ZSTD_errorFrameSizeInfoLegacy() :
1974
   assumes `cSize` and `dBound` are _not_ NULL */
1975
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
1976
359
{
1977
359
    *cSize = ret;
1978
359
    *dBound = ZSTD_CONTENTSIZE_ERROR;
1979
359
}
1980
1981
void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
1982
11.7k
{
1983
11.7k
    const BYTE* ip = (const BYTE*)src;
1984
11.7k
    size_t remainingSize = srcSize;
1985
11.7k
    size_t nbBlocks = 0;
1986
11.7k
    U32 magicNumber;
1987
11.7k
    blockProperties_t blockProperties;
1988
1989
    /* Frame Header */
1990
11.7k
    if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
1991
34
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
1992
34
        return;
1993
34
    }
1994
11.7k
    magicNumber = ZSTD_readBE32(src);
1995
11.7k
    if (magicNumber != ZSTD_magicNumber) {
1996
0
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
1997
0
        return;
1998
0
    }
1999
11.7k
    ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
2000
2001
    /* Loop on each block */
2002
82.6k
    while (1)
2003
82.6k
    {
2004
82.6k
        size_t blockSize = ZSTDv01_getcBlockSize(ip, remainingSize, &blockProperties);
2005
82.6k
        if (ZSTDv01_isError(blockSize)) {
2006
77
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, blockSize);
2007
77
            return;
2008
77
        }
2009
2010
82.5k
        ip += ZSTD_blockHeaderSize;
2011
82.5k
        remainingSize -= ZSTD_blockHeaderSize;
2012
82.5k
        if (blockSize > remainingSize) {
2013
248
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2014
248
            return;
2015
248
        }
2016
2017
82.2k
        if (blockSize == 0) break;   /* bt_end */
2018
2019
70.8k
        ip += blockSize;
2020
70.8k
        remainingSize -= blockSize;
2021
70.8k
        nbBlocks++;
2022
70.8k
    }
2023
2024
11.3k
    *cSize = ip - (const BYTE*)src;
2025
11.3k
    *dBound = nbBlocks * BLOCKSIZE;
2026
11.3k
}
2027
2028
/*******************************
2029
*  Streaming Decompression API
2030
*******************************/
2031
2032
size_t ZSTDv01_resetDCtx(ZSTDv01_Dctx* dctx)
2033
0
{
2034
0
    dctx->expected = ZSTD_frameHeaderSize;
2035
0
    dctx->phase = 0;
2036
0
    dctx->previousDstEnd = NULL;
2037
0
    dctx->base = NULL;
2038
0
    return 0;
2039
0
}
2040
2041
ZSTDv01_Dctx* ZSTDv01_createDCtx(void)
2042
0
{
2043
0
    ZSTDv01_Dctx* dctx = (ZSTDv01_Dctx*)malloc(sizeof(ZSTDv01_Dctx));
2044
0
    if (dctx==NULL) return NULL;
2045
0
    ZSTDv01_resetDCtx(dctx);
2046
0
    return dctx;
2047
0
}
2048
2049
size_t ZSTDv01_freeDCtx(ZSTDv01_Dctx* dctx)
2050
0
{
2051
0
    free(dctx);
2052
0
    return 0;
2053
0
}
2054
2055
size_t ZSTDv01_nextSrcSizeToDecompress(ZSTDv01_Dctx* dctx)
2056
0
{
2057
0
    return ((dctx_t*)dctx)->expected;
2058
0
}
2059
2060
size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2061
0
{
2062
0
    dctx_t* ctx = (dctx_t*)dctx;
2063
2064
    /* Sanity check */
2065
0
    if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
2066
0
    if (dst != ctx->previousDstEnd)  /* not contiguous */
2067
0
        ctx->base = dst;
2068
2069
    /* Decompress : frame header */
2070
0
    if (ctx->phase == 0)
2071
0
    {
2072
        /* Check frame magic header */
2073
0
        U32 magicNumber = ZSTD_readBE32(src);
2074
0
        if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
2075
0
        ctx->phase = 1;
2076
0
        ctx->expected = ZSTD_blockHeaderSize;
2077
0
        return 0;
2078
0
    }
2079
2080
    /* Decompress : block header */
2081
0
    if (ctx->phase == 1)
2082
0
    {
2083
0
        blockProperties_t bp;
2084
0
        size_t blockSize = ZSTDv01_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
2085
0
        if (ZSTDv01_isError(blockSize)) return blockSize;
2086
0
        if (bp.blockType == bt_end)
2087
0
        {
2088
0
            ctx->expected = 0;
2089
0
            ctx->phase = 0;
2090
0
        }
2091
0
        else
2092
0
        {
2093
0
            ctx->expected = blockSize;
2094
0
            ctx->bType = bp.blockType;
2095
0
            ctx->phase = 2;
2096
0
        }
2097
2098
0
        return 0;
2099
0
    }
2100
2101
    /* Decompress : block content */
2102
0
    {
2103
0
        size_t rSize;
2104
0
        switch(ctx->bType)
2105
0
        {
2106
0
        case bt_compressed:
2107
0
            rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize);
2108
0
            break;
2109
0
        case bt_raw :
2110
0
            rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize);
2111
0
            break;
2112
0
        case bt_rle :
2113
0
            return ERROR(GENERIC);   /* not yet handled */
2114
0
            break;
2115
0
        case bt_end :   /* should never happen (filtered at phase 1) */
2116
0
            rSize = 0;
2117
0
            break;
2118
0
        default:
2119
0
            return ERROR(GENERIC);
2120
0
        }
2121
0
        ctx->phase = 1;
2122
0
        ctx->expected = ZSTD_blockHeaderSize;
2123
0
        if (ZSTDv01_isError(rSize)) return rSize;
2124
0
        ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
2125
0
        return rSize;
2126
0
    }
2127
2128
0
}