Coverage Report

Created: 2026-01-10 07:04

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
424
        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
6.17k
#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
1.13k
#define FSE_MAX_SYMBOL_VALUE 255
114
115
116
/****************************************************************
117
*  template functions type & suffix
118
****************************************************************/
119
218k
#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
1.89M
{
197
1.89M
    return sizeof(void*)==4;
198
1.89M
}
199
200
static unsigned FSE_isLittleEndian(void)
201
510k
{
202
510k
    const union { U32 i; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
203
510k
    return one.c[0];
204
510k
}
205
206
static U16 FSE_read16(const void* memPtr)
207
615
{
208
615
    U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
209
615
}
210
211
static U32 FSE_read32(const void* memPtr)
212
11.6k
{
213
11.6k
    U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
214
11.6k
}
215
216
static U64 FSE_read64(const void* memPtr)
217
498k
{
218
498k
    U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
219
498k
}
220
221
static U16 FSE_readLE16(const void* memPtr)
222
615
{
223
615
    if (FSE_isLittleEndian())
224
615
        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
615
}
231
232
static U32 FSE_readLE32(const void* memPtr)
233
11.6k
{
234
11.6k
    if (FSE_isLittleEndian())
235
11.6k
        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
11.6k
}
242
243
244
static U64 FSE_readLE64(const void* memPtr)
245
498k
{
246
498k
    if (FSE_isLittleEndian())
247
498k
        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
498k
}
255
256
static size_t FSE_readLEST(const void* memPtr)
257
498k
{
258
498k
    if (FSE_32bits())
259
0
        return (size_t)FSE_readLE32(memPtr);
260
498k
    else
261
498k
        return (size_t)FSE_readLE64(memPtr);
262
498k
}
263
264
265
266
/****************************************************************
267
*  Constants
268
*****************************************************************/
269
6.17k
#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
1.03k
#define FSE_MIN_TABLELOG 5
274
275
1.03k
#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
424
#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
222k
{
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
222k
}
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
967
static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
348
349
967
#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
967
{
360
967
    void* ptr = dt;
361
967
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
362
967
    FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)(ptr) + 1;   /* because dt is unsigned, 32-bits aligned on 32-bits */
363
967
    const U32 tableSize = 1 << tableLog;
364
967
    const U32 tableMask = tableSize-1;
365
967
    const U32 step = FSE_tableStep(tableSize);
366
967
    U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
367
967
    U32 position = 0;
368
967
    U32 highThreshold = tableSize-1;
369
967
    const S16 largeLimit= (S16)(1 << (tableLog-1));
370
967
    U32 noLarge = 1;
371
967
    U32 s;
372
373
    /* Sanity Checks */
374
967
    if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return (size_t)-FSE_ERROR_maxSymbolValue_tooLarge;
375
967
    if (tableLog > FSE_MAX_TABLELOG) return (size_t)-FSE_ERROR_tableLog_tooLarge;
376
377
    /* Init, lay down lowprob symbols */
378
966
    DTableH[0].tableLog = (U16)tableLog;
379
9.95k
    for (s=0; s<=maxSymbolValue; s++)
380
8.99k
    {
381
8.99k
        if (normalizedCounter[s]==-1)
382
3.96k
        {
383
3.96k
            tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
384
3.96k
            symbolNext[s] = 1;
385
3.96k
        }
386
5.02k
        else
387
5.02k
        {
388
5.02k
            if (normalizedCounter[s] >= largeLimit) noLarge=0;
389
5.02k
            symbolNext[s] = normalizedCounter[s];
390
5.02k
        }
391
8.99k
    }
392
393
    /* Spread symbols */
394
9.95k
    for (s=0; s<=maxSymbolValue; s++)
395
8.99k
    {
396
8.99k
        int i;
397
223k
        for (i=0; i<normalizedCounter[s]; i++)
398
214k
        {
399
214k
            tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
400
214k
            position = (position + step) & tableMask;
401
218k
            while (position > highThreshold) position = (position + step) & tableMask;   /* lowprob area */
402
214k
        }
403
8.99k
    }
404
405
966
    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
966
    {
409
966
        U32 i;
410
219k
        for (i=0; i<tableSize; i++)
411
218k
        {
412
218k
            FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
413
218k
            U16 nextState = symbolNext[symbol]++;
414
218k
            tableDecode[i].nbBits = (BYTE) (tableLog - FSE_highbit32 ((U32)nextState) );
415
218k
            tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
416
218k
        }
417
966
    }
418
419
966
    DTableH->fastMode = (U16)noLarge;
420
966
    return 0;
421
966
}
422
423
424
/******************************************
425
*  FSE byte symbol
426
******************************************/
427
#ifndef FSE_COMMONDEFS_ONLY
428
429
5.04k
static unsigned FSE_isError(size_t code) { return (code > (size_t)(-FSE_ERROR_maxCode)); }
430
431
static short FSE_abs(short a)
432
9.83k
{
433
9.83k
    return a<0? (short)-a : a;
434
9.83k
}
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
1.05k
{
443
1.05k
    const BYTE* const istart = (const BYTE*) headerBuffer;
444
1.05k
    const BYTE* const iend = istart + hbSize;
445
1.05k
    const BYTE* ip = istart;
446
1.05k
    int nbBits;
447
1.05k
    int remaining;
448
1.05k
    int threshold;
449
1.05k
    U32 bitStream;
450
1.05k
    int bitCount;
451
1.05k
    unsigned charnum = 0;
452
1.05k
    int previous0 = 0;
453
454
1.05k
    if (hbSize < 4) return (size_t)-FSE_ERROR_srcSize_wrong;
455
1.03k
    bitStream = FSE_readLE32(ip);
456
1.03k
    nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG;   /* extract tableLog */
457
1.03k
    if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return (size_t)-FSE_ERROR_tableLog_tooLarge;
458
1.02k
    bitStream >>= 4;
459
1.02k
    bitCount = 4;
460
1.02k
    *tableLogPtr = nbBits;
461
1.02k
    remaining = (1<<nbBits)+1;
462
1.02k
    threshold = 1<<nbBits;
463
1.02k
    nbBits++;
464
465
10.8k
    while ((remaining>1) && (charnum<=*maxSVPtr))
466
9.84k
    {
467
9.84k
        if (previous0)
468
1.23k
        {
469
1.23k
            unsigned n0 = charnum;
470
1.48k
            while ((bitStream & 0xFFFF) == 0xFFFF)
471
250
            {
472
250
                n0+=24;
473
250
                if (ip < iend-5)
474
212
                {
475
212
                    ip+=2;
476
212
                    bitStream = FSE_readLE32(ip) >> bitCount;
477
212
                }
478
38
                else
479
38
                {
480
38
                    bitStream >>= 16;
481
38
                    bitCount+=16;
482
38
                }
483
250
            }
484
1.70k
            while ((bitStream & 3) == 3)
485
470
            {
486
470
                n0+=3;
487
470
                bitStream>>=2;
488
470
                bitCount+=2;
489
470
            }
490
1.23k
            n0 += bitStream & 3;
491
1.23k
            bitCount += 2;
492
1.23k
            if (n0 > *maxSVPtr) return (size_t)-FSE_ERROR_maxSymbolValue_tooSmall;
493
4.63k
            while (charnum < n0) normalizedCounter[charnum++] = 0;
494
1.22k
            if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
495
517
            {
496
517
                ip += bitCount>>3;
497
517
                bitCount &= 7;
498
517
                bitStream = FSE_readLE32(ip) >> bitCount;
499
517
            }
500
711
            else
501
711
                bitStream >>= 2;
502
1.22k
        }
503
9.83k
        {
504
9.83k
            const short max = (short)((2*threshold-1)-remaining);
505
9.83k
            short count;
506
507
9.83k
            if ((bitStream & (threshold-1)) < (U32)max)
508
6.88k
            {
509
6.88k
                count = (short)(bitStream & (threshold-1));
510
6.88k
                bitCount   += nbBits-1;
511
6.88k
            }
512
2.95k
            else
513
2.95k
            {
514
2.95k
                count = (short)(bitStream & (2*threshold-1));
515
2.95k
                if (count >= threshold) count -= max;
516
2.95k
                bitCount   += nbBits;
517
2.95k
            }
518
519
9.83k
            count--;   /* extra accuracy */
520
9.83k
            remaining -= FSE_abs(count);
521
9.83k
            normalizedCounter[charnum++] = count;
522
9.83k
            previous0 = !count;
523
16.2k
            while (remaining < threshold)
524
6.41k
            {
525
6.41k
                nbBits--;
526
6.41k
                threshold >>= 1;
527
6.41k
            }
528
529
9.83k
            {
530
9.83k
                if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
531
7.65k
                {
532
7.65k
                    ip += bitCount>>3;
533
7.65k
                    bitCount &= 7;
534
7.65k
                }
535
2.18k
                else
536
2.18k
                {
537
2.18k
                    bitCount -= (int)(8 * (iend - 4 - ip));
538
2.18k
                    ip = iend - 4;
539
2.18k
                }
540
9.83k
                bitStream = FSE_readLE32(ip) >> (bitCount & 31);
541
9.83k
            }
542
9.83k
        }
543
9.83k
    }
544
1.01k
    if (remaining != 1) return (size_t)-FSE_ERROR_GENERIC;
545
1.01k
    *maxSVPtr = charnum-1;
546
547
1.01k
    ip += (bitCount+7)>>3;
548
1.01k
    if ((size_t)(ip-istart) > hbSize) return (size_t)-FSE_ERROR_srcSize_wrong;
549
987
    return ip-istart;
550
1.01k
}
551
552
553
/*********************************************************
554
*  Decompression (Byte symbols)
555
*********************************************************/
556
static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
557
2.24k
{
558
2.24k
    void* ptr = dt;
559
2.24k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
560
2.24k
    FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1;   /* because dt is unsigned */
561
562
2.24k
    DTableH->tableLog = 0;
563
2.24k
    DTableH->fastMode = 0;
564
565
2.24k
    cell->newState = 0;
566
2.24k
    cell->symbol = symbolValue;
567
2.24k
    cell->nbBits = 0;
568
569
2.24k
    return 0;
570
2.24k
}
571
572
573
static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
574
3.15k
{
575
3.15k
    void* ptr = dt;
576
3.15k
    FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
577
3.15k
    FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1;   /* because dt is unsigned */
578
3.15k
    const unsigned tableSize = 1 << nbBits;
579
3.15k
    const unsigned tableMask = tableSize - 1;
580
3.15k
    const unsigned maxSymbolValue = tableMask;
581
3.15k
    unsigned s;
582
583
    /* Sanity checks */
584
3.15k
    if (nbBits < 1) return (size_t)-FSE_ERROR_GENERIC;             /* min size */
585
586
    /* Build Decoding Table */
587
3.15k
    DTableH->tableLog = (U16)nbBits;
588
3.15k
    DTableH->fastMode = 1;
589
296k
    for (s=0; s<=maxSymbolValue; s++)
590
292k
    {
591
292k
        dinfo[s].newState = 0;
592
292k
        dinfo[s].symbol = (BYTE)s;
593
292k
        dinfo[s].nbBits = (BYTE)nbBits;
594
292k
    }
595
596
3.15k
    return 0;
597
3.15k
}
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
2.85k
{
608
2.85k
    if (srcSize < 1) return (size_t)-FSE_ERROR_srcSize_wrong;
609
610
2.84k
    if (srcSize >=  sizeof(size_t))
611
524
    {
612
524
        U32 contain32;
613
524
        bitD->start = (const char*)srcBuffer;
614
524
        bitD->ptr   = (const char*)srcBuffer + srcSize - sizeof(size_t);
615
524
        bitD->bitContainer = FSE_readLEST(bitD->ptr);
616
524
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
617
524
        if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC;   /* stop bit not present */
618
509
        bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
619
509
    }
620
2.31k
    else
621
2.31k
    {
622
2.31k
        U32 contain32;
623
2.31k
        bitD->start = (const char*)srcBuffer;
624
2.31k
        bitD->ptr   = bitD->start;
625
2.31k
        bitD->bitContainer = *(const BYTE*)(bitD->start);
626
2.31k
        switch(srcSize)
627
2.31k
        {
628
14
            case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
629
                    /* fallthrough */
630
43
            case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
631
                    /* fallthrough */
632
142
            case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
633
                    /* fallthrough */
634
199
            case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
635
                    /* fallthrough */
636
291
            case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
637
                    /* fallthrough */
638
1.85k
            case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) <<  8;
639
                    /* fallthrough */
640
2.31k
            default:;
641
2.31k
        }
642
2.31k
        contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
643
2.31k
        if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC;   /* stop bit not present */
644
2.29k
        bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
645
2.29k
        bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
646
2.29k
    }
647
648
2.80k
    return srcSize;
649
2.84k
}
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
855k
{
661
855k
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
662
855k
    return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
663
855k
}
664
665
static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits)   /* only if nbBits >= 1 !! */
666
1.89M
{
667
1.89M
    const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
668
1.89M
    return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
669
1.89M
}
670
671
static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
672
2.75M
{
673
2.75M
    bitD->bitsConsumed += nbBits;
674
2.75M
}
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
855k
{
686
855k
    size_t value = FSE_lookBits(bitD, nbBits);
687
855k
    FSE_skipBits(bitD, nbBits);
688
855k
    return value;
689
855k
}
690
691
static size_t FSE_readBitsFast(FSE_DStream_t* bitD, U32 nbBits)   /* only if nbBits >= 1 !! */
692
4.05k
{
693
4.05k
    size_t value = FSE_lookBitsFast(bitD, nbBits);
694
4.05k
    FSE_skipBits(bitD, nbBits);
695
4.05k
    return value;
696
4.05k
}
697
698
static unsigned FSE_reloadDStream(FSE_DStream_t* bitD)
699
722k
{
700
722k
    if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* should never happen */
701
48.5k
        return FSE_DStream_tooFar;
702
703
673k
    if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
704
494k
    {
705
494k
        bitD->ptr -= bitD->bitsConsumed >> 3;
706
494k
        bitD->bitsConsumed &= 7;
707
494k
        bitD->bitContainer = FSE_readLEST(bitD->ptr);
708
494k
        return FSE_DStream_unfinished;
709
494k
    }
710
179k
    if (bitD->ptr == bitD->start)
711
176k
    {
712
176k
        if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return FSE_DStream_endOfBuffer;
713
22.9k
        return FSE_DStream_completed;
714
176k
    }
715
3.40k
    {
716
3.40k
        U32 nbBytes = bitD->bitsConsumed >> 3;
717
3.40k
        U32 result = FSE_DStream_unfinished;
718
3.40k
        if (bitD->ptr - nbBytes < bitD->start)
719
130
        {
720
130
            nbBytes = (U32)(bitD->ptr - bitD->start);  /* ptr > start */
721
130
            result = FSE_DStream_endOfBuffer;
722
130
        }
723
3.40k
        bitD->ptr -= nbBytes;
724
3.40k
        bitD->bitsConsumed -= nbBytes*8;
725
3.40k
        bitD->bitContainer = FSE_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD) */
726
3.40k
        return result;
727
179k
    }
728
179k
}
729
730
731
static void FSE_initDState(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD, const FSE_DTable* dt)
732
6.34k
{
733
6.34k
    const void* ptr = dt;
734
6.34k
    const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr;
735
6.34k
    DStatePtr->state = FSE_readBits(bitD, DTableH->tableLog);
736
6.34k
    FSE_reloadDStream(bitD);
737
6.34k
    DStatePtr->table = dt + 1;
738
6.34k
}
739
740
static BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
741
639k
{
742
639k
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
743
639k
    const U32  nbBits = DInfo.nbBits;
744
639k
    BYTE symbol = DInfo.symbol;
745
639k
    size_t lowBits = FSE_readBits(bitD, nbBits);
746
747
639k
    DStatePtr->state = DInfo.newState + lowBits;
748
639k
    return symbol;
749
639k
}
750
751
static BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
752
4.05k
{
753
4.05k
    const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
754
4.05k
    const U32 nbBits = DInfo.nbBits;
755
4.05k
    BYTE symbol = DInfo.symbol;
756
4.05k
    size_t lowBits = FSE_readBitsFast(bitD, nbBits);
757
758
4.05k
    DStatePtr->state = DInfo.newState + lowBits;
759
4.05k
    return symbol;
760
4.05k
}
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
7.44k
{
767
7.44k
    return ((bitD->ptr == bitD->start) && (bitD->bitsConsumed == sizeof(bitD->bitContainer)*8));
768
7.44k
}
769
770
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
771
729
{
772
729
    return DStatePtr->state == 0;
773
729
}
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
124
{
781
124
    BYTE* const ostart = (BYTE*) dst;
782
124
    BYTE* op = ostart;
783
124
    BYTE* const omax = op + maxDstSize;
784
124
    BYTE* const olimit = omax-3;
785
786
124
    FSE_DStream_t bitD;
787
124
    FSE_DState_t state1;
788
124
    FSE_DState_t state2;
789
124
    size_t errorCode;
790
791
    /* Init */
792
124
    errorCode = FSE_initDStream(&bitD, cSrc, cSrcSize);   /* replaced last arg by maxCompressed Size */
793
124
    if (FSE_isError(errorCode)) return errorCode;
794
795
118
    FSE_initDState(&state1, &bitD, dt);
796
118
    FSE_initDState(&state2, &bitD, dt);
797
798
12.3k
#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
799
800
    /* 4 symbols per loop */
801
1.85k
    for ( ; (FSE_reloadDStream(&bitD)==FSE_DStream_unfinished) && (op<olimit) ; op+=4)
802
1.73k
    {
803
1.73k
        op[0] = FSE_GETSYMBOL(&state1);
804
805
1.73k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
806
0
            FSE_reloadDStream(&bitD);
807
808
1.73k
        op[1] = FSE_GETSYMBOL(&state2);
809
810
1.73k
        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
1.73k
        op[2] = FSE_GETSYMBOL(&state1);
814
815
1.73k
        if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8)    /* This test must be static */
816
0
            FSE_reloadDStream(&bitD);
817
818
1.73k
        op[3] = FSE_GETSYMBOL(&state2);
819
1.73k
    }
820
821
    /* tail */
822
    /* note : FSE_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly FSE_DStream_completed */
823
2.80k
    while (1)
824
2.80k
    {
825
2.80k
        if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
826
57
            break;
827
828
2.75k
        *op++ = FSE_GETSYMBOL(&state1);
829
830
2.75k
        if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
831
61
            break;
832
833
2.69k
        *op++ = FSE_GETSYMBOL(&state2);
834
2.69k
    }
835
836
    /* end ? */
837
118
    if (FSE_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
838
15
        return op-ostart;
839
840
103
    if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall;   /* dst buffer is full, but cSrc unfinished */
841
842
71
    return (size_t)-FSE_ERROR_corruptionDetected;
843
103
}
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
124
{
850
124
    FSE_DTableHeader DTableH;
851
124
    memcpy(&DTableH, dt, sizeof(DTableH));   /* memcpy() into local variable, to avoid strict aliasing warning */
852
853
    /* select fast mode (static) */
854
124
    if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
855
70
    return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
856
124
}
857
858
859
static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
860
169
{
861
169
    const BYTE* const istart = (const BYTE*)cSrc;
862
169
    const BYTE* ip = istart;
863
169
    short counting[FSE_MAX_SYMBOL_VALUE+1];
864
169
    DTable_max_t dt;   /* Static analyzer seems unable to understand this table will be properly initialized later */
865
169
    unsigned tableLog;
866
169
    unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
867
169
    size_t errorCode;
868
869
169
    if (cSrcSize<2) return (size_t)-FSE_ERROR_srcSize_wrong;   /* too small input size */
870
871
    /* normal FSE decoding mode */
872
162
    errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
873
162
    if (FSE_isError(errorCode)) return errorCode;
874
128
    if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;   /* too small input size */
875
125
    ip += errorCode;
876
125
    cSrcSize -= errorCode;
877
878
125
    errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
879
125
    if (FSE_isError(errorCode)) return errorCode;
880
881
    /* always return, even if it is an error code */
882
124
    return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
883
125
}
884
885
886
887
/* *******************************************************
888
*  Huff0 : Huffman block compression
889
*********************************************************/
890
169
#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
14.7k
#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
424
{
921
424
    BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
922
424
    U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1];  /* large enough for values from 0 to 16 */
923
424
    U32 weightTotal;
924
424
    U32 maxBits;
925
424
    const BYTE* ip = (const BYTE*) src;
926
424
    size_t iSize;
927
424
    size_t oSize;
928
424
    U32 n;
929
424
    U32 nextRankStart;
930
424
    void* ptr = DTable+1;
931
424
    HUF_DElt* const dt = (HUF_DElt*)ptr;
932
933
424
    if (!srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
934
424
    iSize = ip[0];
935
936
424
    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
424
    if (iSize >= 128)  /* special header */
939
254
    {
940
254
        if (iSize >= (242))   /* RLE */
941
215
        {
942
215
            static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
943
215
            oSize = l[iSize-242];
944
215
            memset(huffWeight, 1, sizeof(huffWeight));
945
215
            iSize = 0;
946
215
        }
947
39
        else   /* Incompressible */
948
39
        {
949
39
            oSize = iSize - 127;
950
39
            iSize = ((oSize+1)/2);
951
39
            if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
952
31
            ip += 1;
953
353
            for (n=0; n<oSize; n+=2)
954
322
            {
955
322
                huffWeight[n]   = ip[n/2] >> 4;
956
322
                huffWeight[n+1] = ip[n/2] & 15;
957
322
            }
958
31
        }
959
254
    }
960
170
    else  /* header compressed with FSE (normal case) */
961
170
    {
962
170
        if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
963
169
        oSize = FSE_decompress(huffWeight, HUF_MAX_SYMBOL_VALUE, ip+1, iSize);   /* max 255 values decoded, last one is implied */
964
169
        if (FSE_isError(oSize)) return oSize;
965
169
    }
966
967
    /* collect weight stats */
968
261
    memset(rankVal, 0, sizeof(rankVal));
969
261
    weightTotal = 0;
970
15.0k
    for (n=0; n<oSize; n++)
971
14.7k
    {
972
14.7k
        if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return (size_t)-FSE_ERROR_corruptionDetected;
973
14.7k
        rankVal[huffWeight[n]]++;
974
14.7k
        weightTotal += (1 << huffWeight[n]) >> 1;
975
14.7k
    }
976
259
    if (weightTotal == 0) return (size_t)-FSE_ERROR_corruptionDetected;
977
978
    /* get last non-null symbol weight (implied, total must be 2^n) */
979
256
    maxBits = FSE_highbit32(weightTotal) + 1;
980
256
    if (maxBits > DTable[0]) return (size_t)-FSE_ERROR_tableLog_tooLarge;   /* DTable is too small */
981
240
    DTable[0] = (U16)maxBits;
982
240
    {
983
240
        U32 total = 1 << maxBits;
984
240
        U32 rest = total - weightTotal;
985
240
        U32 verif = 1 << FSE_highbit32(rest);
986
240
        U32 lastWeight = FSE_highbit32(rest) + 1;
987
240
        if (verif != rest) return (size_t)-FSE_ERROR_corruptionDetected;    /* last value must be a clean power of 2 */
988
228
        huffWeight[oSize] = (BYTE)lastWeight;
989
228
        rankVal[lastWeight]++;
990
228
    }
991
992
    /* check tree construction validity */
993
228
    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
227
    nextRankStart = 0;
997
1.51k
    for (n=1; n<=maxBits; n++)
998
1.28k
    {
999
1.28k
        U32 current = nextRankStart;
1000
1.28k
        nextRankStart += (rankVal[n] << (n-1));
1001
1.28k
        rankVal[n] = current;
1002
1.28k
    }
1003
1004
    /* fill DTable */
1005
13.7k
    for (n=0; n<=oSize; n++)
1006
13.5k
    {
1007
13.5k
        const U32 w = huffWeight[n];
1008
13.5k
        const U32 length = (1 << w) >> 1;
1009
13.5k
        U32 i;
1010
13.5k
        HUF_DElt D;
1011
13.5k
        D.byte = (BYTE)n; D.nbBits = (BYTE)(maxBits + 1 - w);
1012
39.1k
        for (i = rankVal[w]; i < rankVal[w] + length; i++)
1013
25.6k
            dt[i] = D;
1014
13.5k
        rankVal[w] += length;
1015
13.5k
    }
1016
1017
227
    return iSize+1;
1018
228
}
1019
1020
1021
static BYTE HUF_decodeSymbol(FSE_DStream_t* Dstream, const HUF_DElt* dt, const U32 dtLog)
1022
1.89M
{
1023
1.89M
        const size_t val = FSE_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1024
1.89M
        const BYTE c = dt[val].byte;
1025
1.89M
        FSE_skipBits(Dstream, dt[val].nbBits);
1026
1.89M
        return c;
1027
1.89M
}
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
218
{
1034
218
    if (cSrcSize < 6) return (size_t)-FSE_ERROR_srcSize_wrong;
1035
205
    {
1036
205
        BYTE* const ostart = (BYTE*) dst;
1037
205
        BYTE* op = ostart;
1038
205
        BYTE* const omax = op + maxDstSize;
1039
205
        BYTE* const olimit = maxDstSize < 15 ? op : omax-15;
1040
1041
205
        const void* ptr = DTable;
1042
205
        const HUF_DElt* const dt = (const HUF_DElt*)(ptr)+1;
1043
205
        const U32 dtLog = DTable[0];
1044
205
        size_t errorCode;
1045
205
        U32 reloadStatus;
1046
1047
        /* Init */
1048
1049
205
        const U16* jumpTable = (const U16*)cSrc;
1050
205
        const size_t length1 = FSE_readLE16(jumpTable);
1051
205
        const size_t length2 = FSE_readLE16(jumpTable+1);
1052
205
        const size_t length3 = FSE_readLE16(jumpTable+2);
1053
205
        const size_t length4 = cSrcSize - 6 - length1 - length2 - length3;   /* check coherency !! */
1054
205
        const char* const start1 = (const char*)(cSrc) + 6;
1055
205
        const char* const start2 = start1 + length1;
1056
205
        const char* const start3 = start2 + length2;
1057
205
        const char* const start4 = start3 + length3;
1058
205
        FSE_DStream_t bitD1, bitD2, bitD3, bitD4;
1059
1060
205
        if (length1+length2+length3+6 >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1061
1062
177
        errorCode = FSE_initDStream(&bitD1, start1, length1);
1063
177
        if (FSE_isError(errorCode)) return errorCode;
1064
172
        errorCode = FSE_initDStream(&bitD2, start2, length2);
1065
172
        if (FSE_isError(errorCode)) return errorCode;
1066
166
        errorCode = FSE_initDStream(&bitD3, start3, length3);
1067
166
        if (FSE_isError(errorCode)) return errorCode;
1068
159
        errorCode = FSE_initDStream(&bitD4, start4, length4);
1069
159
        if (FSE_isError(errorCode)) return errorCode;
1070
1071
152
        reloadStatus=FSE_reloadDStream(&bitD2);
1072
1073
        /* 16 symbols per loop */
1074
116k
        for ( ; (reloadStatus<FSE_DStream_completed) && (op<olimit);  /* D2-3-4 are supposed to be synchronized and finish together */
1075
116k
            op+=16, reloadStatus = FSE_reloadDStream(&bitD2) | FSE_reloadDStream(&bitD3) | FSE_reloadDStream(&bitD4), FSE_reloadDStream(&bitD1))
1076
116k
        {
1077
116k
    #define HUF_DECODE_SYMBOL_0(n, Dstream) \
1078
496k
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog);
1079
1080
116k
    #define HUF_DECODE_SYMBOL_1(n, Dstream) \
1081
929k
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1082
929k
            if (FSE_32bits() && (HUF_MAX_TABLELOG>12)) FSE_reloadDStream(&Dstream)
1083
1084
116k
    #define HUF_DECODE_SYMBOL_2(n, Dstream) \
1085
464k
            op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1086
464k
            if (FSE_32bits()) FSE_reloadDStream(&Dstream)
1087
1088
116k
            HUF_DECODE_SYMBOL_1( 0, bitD1);
1089
116k
            HUF_DECODE_SYMBOL_1( 1, bitD2);
1090
116k
            HUF_DECODE_SYMBOL_1( 2, bitD3);
1091
116k
            HUF_DECODE_SYMBOL_1( 3, bitD4);
1092
116k
            HUF_DECODE_SYMBOL_2( 4, bitD1);
1093
116k
            HUF_DECODE_SYMBOL_2( 5, bitD2);
1094
116k
            HUF_DECODE_SYMBOL_2( 6, bitD3);
1095
116k
            HUF_DECODE_SYMBOL_2( 7, bitD4);
1096
116k
            HUF_DECODE_SYMBOL_1( 8, bitD1);
1097
116k
            HUF_DECODE_SYMBOL_1( 9, bitD2);
1098
116k
            HUF_DECODE_SYMBOL_1(10, bitD3);
1099
116k
            HUF_DECODE_SYMBOL_1(11, bitD4);
1100
116k
            HUF_DECODE_SYMBOL_0(12, bitD1);
1101
116k
            HUF_DECODE_SYMBOL_0(13, bitD2);
1102
116k
            HUF_DECODE_SYMBOL_0(14, bitD3);
1103
116k
            HUF_DECODE_SYMBOL_0(15, bitD4);
1104
116k
        }
1105
1106
152
        if (reloadStatus!=FSE_DStream_completed)   /* not complete : some bitStream might be FSE_DStream_unfinished */
1107
107
            return (size_t)-FSE_ERROR_corruptionDetected;
1108
1109
        /* tail */
1110
45
        {
1111
            /* bitTail = bitD1; */   /* *much* slower : -20% !??! */
1112
45
            FSE_DStream_t bitTail;
1113
45
            bitTail.ptr = bitD1.ptr;
1114
45
            bitTail.bitsConsumed = bitD1.bitsConsumed;
1115
45
            bitTail.bitContainer = bitD1.bitContainer;   /* required in case of FSE_DStream_endOfBuffer */
1116
45
            bitTail.start = start1;
1117
31.6k
            for ( ; (FSE_reloadDStream(&bitTail) < FSE_DStream_completed) && (op<omax) ; op++)
1118
31.6k
            {
1119
31.6k
                HUF_DECODE_SYMBOL_0(0, bitTail);
1120
31.6k
            }
1121
1122
45
            if (FSE_endOfDStream(&bitTail))
1123
27
                return op-ostart;
1124
45
        }
1125
1126
18
        if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall;   /* dst buffer is full, but cSrc unfinished */
1127
1128
15
        return (size_t)-FSE_ERROR_corruptionDetected;
1129
18
    }
1130
18
}
1131
1132
1133
static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1134
424
{
1135
424
    HUF_CREATE_STATIC_DTABLE(DTable, HUF_MAX_TABLELOG);
1136
424
    const BYTE* ip = (const BYTE*) cSrc;
1137
424
    size_t errorCode;
1138
1139
424
    errorCode = HUF_readDTable (DTable, cSrc, cSrcSize);
1140
424
    if (FSE_isError(errorCode)) return errorCode;
1141
227
    if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1142
218
    ip += errorCode;
1143
218
    cSrcSize -= errorCode;
1144
1145
218
    return HUF_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, DTable);
1146
227
}
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
2.07k
#define KB *(1 <<10)
1281
#define MB *(1 <<20)
1282
#define GB *(1U<<30)
1283
1284
2.07k
#define BLOCKSIZE (128 KB)                 /* define, for static allocation */
1285
1286
#define WORKPLACESIZE (BLOCKSIZE*3)
1287
420k
#define MINMATCH 4
1288
213k
#define MLbits   7
1289
213k
#define LLbits   6
1290
593
#define Offbits  5
1291
210k
#define MaxML  ((1<<MLbits )-1)
1292
210k
#define MaxLL  ((1<<LLbits )-1)
1293
289
#define MaxOff ((1<<Offbits)-1)
1294
#define LitFSELog  11
1295
267
#define MLFSELog   10
1296
316
#define LLFSELog   10
1297
276
#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
34
#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
420k
static unsigned ZSTD_32bits(void) { return sizeof(void*)==4; }
1314
1315
static unsigned ZSTD_isLittleEndian(void)
1316
2.30k
{
1317
2.30k
    const union { U32 i; BYTE c[4]; } one = { 1 };   /* don't use static : performance detrimental  */
1318
2.30k
    return one.c[0];
1319
2.30k
}
1320
1321
2.30k
static U16    ZSTD_read16(const void* p) { U16 r; memcpy(&r, p, sizeof(r)); return r; }
1322
1323
208k
static void   ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
1324
1325
1.51M
static void   ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
1326
1327
1.50M
#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
210k
{
1331
210k
    const BYTE* ip = (const BYTE*)src;
1332
210k
    BYTE* op = (BYTE*)dst;
1333
210k
    BYTE* const oend = op + length;
1334
1.71M
    while (op < oend) COPY8(op, ip);
1335
210k
}
1336
1337
static U16 ZSTD_readLE16(const void* memPtr)
1338
2.30k
{
1339
2.30k
    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
2.30k
}
1346
1347
static U32 ZSTD_readLE24(const void* memPtr)
1348
178
{
1349
178
    return ZSTD_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
1350
178
}
1351
1352
static U32 ZSTD_readBE32(const void* memPtr)
1353
3.13k
{
1354
3.13k
    const BYTE* p = (const BYTE*)memPtr;
1355
3.13k
    return (U32)(((U32)p[0]<<24) + ((U32)p[1]<<16) + ((U32)p[2]<<8) + ((U32)p[3]<<0));
1356
3.13k
}
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
235k
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
17.2k
{
1427
17.2k
    const BYTE* const in = (const BYTE* const)src;
1428
17.2k
    BYTE headerFlags;
1429
17.2k
    U32 cSize;
1430
1431
17.2k
    if (srcSize < 3) return ERROR(srcSize_wrong);
1432
1433
17.2k
    headerFlags = *in;
1434
17.2k
    cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
1435
1436
17.2k
    bpPtr->blockType = (blockType_t)(headerFlags >> 6);
1437
17.2k
    bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
1438
1439
17.2k
    if (bpPtr->blockType == bt_end) return 0;
1440
15.4k
    if (bpPtr->blockType == bt_rle) return 1;
1441
10.3k
    return cSize;
1442
15.4k
}
1443
1444
1445
static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1446
474
{
1447
474
    if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
1448
460
    if (srcSize > 0) {
1449
434
        memcpy(dst, src, srcSize);
1450
434
    }
1451
460
    return srcSize;
1452
474
}
1453
1454
1455
static size_t ZSTD_decompressLiterals(void* ctx,
1456
                                      void* dst, size_t maxDstSize,
1457
                                const void* src, size_t srcSize)
1458
445
{
1459
445
    BYTE* op = (BYTE*)dst;
1460
445
    BYTE* const oend = op + maxDstSize;
1461
445
    const BYTE* ip = (const BYTE*)src;
1462
445
    size_t errorCode;
1463
445
    size_t litSize;
1464
1465
    /* check : minimum 2, for litSize, +1, for content */
1466
445
    if (srcSize <= 3) return ERROR(corruption_detected);
1467
1468
439
    litSize = ip[1] + (ip[0]<<8);
1469
439
    litSize += ((ip[-3] >> 3) & 7) << 16;   /* mmmmh.... */
1470
439
    op = oend - litSize;
1471
1472
439
    (void)ctx;
1473
439
    if (litSize > maxDstSize) return ERROR(dstSize_tooSmall);
1474
424
    errorCode = HUF_decompress(op, litSize, ip+2, srcSize-2);
1475
424
    if (FSE_isError(errorCode)) return ERROR(GENERIC);
1476
27
    return litSize;
1477
424
}
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
2.65k
{
1485
2.65k
    const BYTE* const istart = (const BYTE* const)src;
1486
2.65k
    const BYTE* ip = istart;
1487
2.65k
    BYTE* const ostart = (BYTE* const)dst;
1488
2.65k
    BYTE* const oend = ostart + maxDstSize;
1489
2.65k
    blockProperties_t litbp;
1490
1491
2.65k
    size_t litcSize = ZSTDv01_getcBlockSize(src, srcSize, &litbp);
1492
2.65k
    if (ZSTDv01_isError(litcSize)) return litcSize;
1493
2.62k
    if (litcSize > srcSize - ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1494
2.58k
    ip += ZSTD_blockHeaderSize;
1495
1496
2.58k
    switch(litbp.blockType)
1497
2.58k
    {
1498
119
    case bt_raw:
1499
119
        *litStart = ip;
1500
119
        ip += litcSize;
1501
119
        *litSize = litcSize;
1502
119
        break;
1503
2.01k
    case bt_rle:
1504
2.01k
        {
1505
2.01k
            size_t rleSize = litbp.origSize;
1506
2.01k
            if (rleSize>maxDstSize) return ERROR(dstSize_tooSmall);
1507
2.01k
            if (!srcSize) return ERROR(srcSize_wrong);
1508
2.01k
            if (rleSize > 0) {
1509
1.95k
                memset(oend - rleSize, *ip, rleSize);
1510
1.95k
            }
1511
2.01k
            *litStart = oend - rleSize;
1512
2.01k
            *litSize = rleSize;
1513
2.01k
            ip++;
1514
2.01k
            break;
1515
2.01k
        }
1516
445
    case bt_compressed:
1517
445
        {
1518
445
            size_t decodedLitSize = ZSTD_decompressLiterals(ctx, dst, maxDstSize, ip, litcSize);
1519
445
            if (ZSTDv01_isError(decodedLitSize)) return decodedLitSize;
1520
27
            *litStart = oend - decodedLitSize;
1521
27
            *litSize = decodedLitSize;
1522
27
            ip += litcSize;
1523
27
            break;
1524
445
        }
1525
11
    case bt_end:
1526
11
    default:
1527
11
        return ERROR(GENERIC);
1528
2.58k
    }
1529
1530
2.15k
    return ip-istart;
1531
2.58k
}
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
2.15k
{
1538
2.15k
    const BYTE* const istart = (const BYTE* const)src;
1539
2.15k
    const BYTE* ip = istart;
1540
2.15k
    const BYTE* const iend = istart + srcSize;
1541
2.15k
    U32 LLtype, Offtype, MLtype;
1542
2.15k
    U32 LLlog, Offlog, MLlog;
1543
2.15k
    size_t dumpsLength;
1544
1545
    /* check */
1546
2.15k
    if (srcSize < 5) return ERROR(srcSize_wrong);
1547
1548
    /* SeqHead */
1549
2.12k
    *nbSeq = ZSTD_readLE16(ip); ip+=2;
1550
2.12k
    LLtype  = *ip >> 6;
1551
2.12k
    Offtype = (*ip >> 4) & 3;
1552
2.12k
    MLtype  = (*ip >> 2) & 3;
1553
2.12k
    if (*ip & 2)
1554
1.55k
    {
1555
1.55k
        dumpsLength  = ip[2];
1556
1.55k
        dumpsLength += ip[1] << 8;
1557
1.55k
        ip += 3;
1558
1.55k
    }
1559
574
    else
1560
574
    {
1561
574
        dumpsLength  = ip[1];
1562
574
        dumpsLength += (ip[0] & 1) << 8;
1563
574
        ip += 2;
1564
574
    }
1565
2.12k
    *dumpsPtr = ip;
1566
2.12k
    ip += dumpsLength;
1567
2.12k
    *dumpsLengthPtr = dumpsLength;
1568
1569
    /* check */
1570
2.12k
    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
2.11k
    {
1574
2.11k
        S16 norm[MaxML+1];    /* assumption : MaxML >= MaxLL and MaxOff */
1575
2.11k
        size_t headerSize;
1576
1577
        /* Build DTables */
1578
2.11k
        switch(LLtype)
1579
2.11k
        {
1580
283
        case bt_rle :
1581
283
            LLlog = 0;
1582
283
            FSE_buildDTable_rle(DTableLL, *ip++); break;
1583
1.50k
        case bt_raw :
1584
1.50k
            LLlog = LLbits;
1585
1.50k
            FSE_buildDTable_raw(DTableLL, LLbits); break;
1586
324
        default :
1587
324
            {   U32 max = MaxLL;
1588
324
                headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
1589
324
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1590
316
                if (LLlog > LLFSELog) return ERROR(corruption_detected);
1591
314
                ip += headerSize;
1592
314
                FSE_buildDTable(DTableLL, norm, max, LLlog);
1593
314
        }   }
1594
1595
2.10k
        switch(Offtype)
1596
2.10k
        {
1597
1.66k
        case bt_rle :
1598
1.66k
            Offlog = 0;
1599
1.66k
            if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1600
1.65k
            FSE_buildDTable_rle(DTableOffb, *ip++); break;
1601
152
        case bt_raw :
1602
152
            Offlog = Offbits;
1603
152
            FSE_buildDTable_raw(DTableOffb, Offbits); break;
1604
289
        default :
1605
289
            {   U32 max = MaxOff;
1606
289
                headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
1607
289
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1608
276
                if (Offlog > OffFSELog) return ERROR(corruption_detected);
1609
268
                ip += headerSize;
1610
268
                FSE_buildDTable(DTableOffb, norm, max, Offlog);
1611
268
        }   }
1612
1613
2.07k
        switch(MLtype)
1614
2.07k
        {
1615
303
        case bt_rle :
1616
303
            MLlog = 0;
1617
303
            if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1618
300
            FSE_buildDTable_rle(DTableML, *ip++); break;
1619
1.49k
        case bt_raw :
1620
1.49k
            MLlog = MLbits;
1621
1.49k
            FSE_buildDTable_raw(DTableML, MLbits); break;
1622
276
        default :
1623
276
            {   U32 max = MaxML;
1624
276
                headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
1625
276
                if (FSE_isError(headerSize)) return ERROR(GENERIC);
1626
267
                if (MLlog > MLFSELog) return ERROR(corruption_detected);
1627
260
                ip += headerSize;
1628
260
                FSE_buildDTable(DTableML, norm, max, MLlog);
1629
260
    }   }   }
1630
1631
2.05k
    return ip-istart;
1632
2.07k
}
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
210k
{
1654
210k
    size_t litLength;
1655
210k
    size_t prevOffset;
1656
210k
    size_t offset;
1657
210k
    size_t matchLength;
1658
210k
    const BYTE* dumps = seqState->dumps;
1659
210k
    const BYTE* const de = seqState->dumpsEnd;
1660
1661
    /* Literal length */
1662
210k
    litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
1663
210k
    prevOffset = litLength ? seq->offset : seqState->prevOffset;
1664
210k
    seqState->prevOffset = seq->offset;
1665
210k
    if (litLength == MaxLL)
1666
5.74k
    {
1667
5.74k
        const U32 add = dumps<de ? *dumps++ : 0;
1668
5.74k
        if (add < 255) litLength += add;
1669
89
        else
1670
89
        {
1671
89
            if (dumps<=(de-3))
1672
77
            {
1673
77
                litLength = ZSTD_readLE24(dumps);
1674
77
                dumps += 3;
1675
77
            }
1676
89
        }
1677
5.74k
    }
1678
1679
    /* Offset */
1680
210k
    {
1681
210k
        U32 offsetCode, nbBits;
1682
210k
        offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream));
1683
210k
        if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1684
210k
        nbBits = offsetCode - 1;
1685
210k
        if (offsetCode==0) nbBits = 0;   /* cmove */
1686
210k
        offset = ((size_t)1 << (nbBits & ((sizeof(offset)*8)-1))) + FSE_readBits(&(seqState->DStream), nbBits);
1687
210k
        if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1688
210k
        if (offsetCode==0) offset = prevOffset;
1689
210k
    }
1690
1691
    /* MatchLength */
1692
210k
    matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
1693
210k
    if (matchLength == MaxML)
1694
6.40k
    {
1695
6.40k
        const U32 add = dumps<de ? *dumps++ : 0;
1696
6.40k
        if (add < 255) matchLength += add;
1697
115
        else
1698
115
        {
1699
115
            if (dumps<=(de-3))
1700
101
            {
1701
101
                matchLength = ZSTD_readLE24(dumps);
1702
101
                dumps += 3;
1703
101
            }
1704
115
        }
1705
6.40k
    }
1706
210k
    matchLength += MINMATCH;
1707
1708
    /* save result */
1709
210k
    seq->litLength = litLength;
1710
210k
    seq->offset = offset;
1711
210k
    seq->matchLength = matchLength;
1712
210k
    seqState->dumps = dumps;
1713
210k
}
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
210k
{
1721
210k
    static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4};   /* added */
1722
210k
    static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11};   /* subtracted */
1723
210k
    const BYTE* const ostart = op;
1724
210k
    BYTE* const oLitEnd = op + sequence.litLength;
1725
210k
    const size_t litLength = sequence.litLength;
1726
210k
    BYTE* const endMatch = op + litLength + sequence.matchLength;    /* risk : address space overflow (32-bits) */
1727
210k
    const BYTE* const litEnd = *litPtr + litLength;
1728
1729
    /* checks */
1730
210k
    size_t const seqLength = sequence.litLength + sequence.matchLength;
1731
1732
210k
    if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
1733
210k
    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
210k
    if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
1736
1737
210k
    if (endMatch > oend) return ERROR(dstSize_tooSmall);   /* overwrite beyond dst buffer */
1738
210k
    if (litEnd > litLimit) return ERROR(corruption_detected);   /* overRead beyond lit buffer */
1739
210k
    if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall);  /* overwrite literal segment */
1740
1741
    /* copy Literals */
1742
210k
    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
210k
    op += litLength;
1745
210k
    *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
210k
    if (oend-op < 8) return ERROR(dstSize_tooSmall);
1749
1750
    /* copy Match */
1751
210k
    {
1752
210k
        const U32 overlapRisk = (((size_t)(litEnd - endMatch)) < 12);
1753
210k
        const BYTE* match = op - sequence.offset;            /* possible underflow at op - offset ? */
1754
210k
        size_t qutt = 12;
1755
210k
        U64 saved[2];
1756
1757
        /* check */
1758
210k
        if (match < base) return ERROR(corruption_detected);
1759
210k
        if (sequence.offset > (size_t)base) return ERROR(corruption_detected);
1760
1761
        /* save beginning of literal sequence, in case of write overlap */
1762
210k
        if (overlapRisk)
1763
20
        {
1764
20
            if ((endMatch + qutt) > oend) qutt = oend-endMatch;
1765
20
            memcpy(saved, endMatch, qutt);
1766
20
        }
1767
1768
210k
        if (sequence.offset < 8)
1769
208k
        {
1770
208k
            const int dec64 = dec64table[sequence.offset];
1771
208k
            op[0] = match[0];
1772
208k
            op[1] = match[1];
1773
208k
            op[2] = match[2];
1774
208k
            op[3] = match[3];
1775
208k
            match += dec32table[sequence.offset];
1776
208k
            ZSTD_copy4(op+4, match);
1777
208k
            match -= dec64;
1778
208k
        } else { ZSTD_copy8(op, match); }
1779
210k
        op += 8; match += 8;
1780
1781
210k
        if (endMatch > oend-(16-MINMATCH))
1782
19
        {
1783
19
            if (op < oend-8)
1784
12
            {
1785
12
                ZSTD_wildcopy(op, match, (oend-8) - op);
1786
12
                match += (oend-8) - op;
1787
12
                op = oend-8;
1788
12
            }
1789
62
            while (op<endMatch) *op++ = *match++;
1790
19
        }
1791
210k
        else
1792
210k
            ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8);   /* works even if matchLength < 8 */
1793
1794
        /* restore, in case of overlap */
1795
210k
        if (overlapRisk) memcpy(endMatch, saved, qutt);
1796
210k
    }
1797
1798
0
    return endMatch-ostart;
1799
210k
}
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
2.15k
{
1820
2.15k
    dctx_t* dctx = (dctx_t*)ctx;
1821
2.15k
    const BYTE* ip = (const BYTE*)seqStart;
1822
2.15k
    const BYTE* const iend = ip + seqSize;
1823
2.15k
    BYTE* const ostart = (BYTE* const)dst;
1824
2.15k
    BYTE* op = ostart;
1825
2.15k
    BYTE* const oend = ostart + maxDstSize;
1826
2.15k
    size_t errorCode = 0;
1827
2.15k
    size_t dumpsLength = 0;
1828
2.15k
    const BYTE* litPtr = litStart;
1829
2.15k
    const BYTE* const litEnd = litStart + litSize;
1830
2.15k
    int nbSeq = 0;
1831
2.15k
    const BYTE* dumps = NULL;
1832
2.15k
    U32* DTableLL = dctx->LLTable;
1833
2.15k
    U32* DTableML = dctx->MLTable;
1834
2.15k
    U32* DTableOffb = dctx->OffTable;
1835
2.15k
    BYTE* const base = (BYTE*) (dctx->base);
1836
1837
    /* Build Decoding Tables */
1838
2.15k
    errorCode = ZSTDv01_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
1839
2.15k
                                      DTableLL, DTableML, DTableOffb,
1840
2.15k
                                      ip, iend-ip);
1841
2.15k
    if (ZSTDv01_isError(errorCode)) return errorCode;
1842
2.05k
    ip += errorCode;
1843
1844
    /* Regen sequences */
1845
2.05k
    {
1846
2.05k
        seq_t sequence;
1847
2.05k
        seqState_t seqState;
1848
1849
2.05k
        memset(&sequence, 0, sizeof(sequence));
1850
2.05k
        seqState.dumps = dumps;
1851
2.05k
        seqState.dumpsEnd = dumps + dumpsLength;
1852
2.05k
        seqState.prevOffset = 1;
1853
2.05k
        errorCode = FSE_initDStream(&(seqState.DStream), ip, iend-ip);
1854
2.05k
        if (FSE_isError(errorCode)) return ERROR(corruption_detected);
1855
2.03k
        FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
1856
2.03k
        FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
1857
2.03k
        FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
1858
1859
212k
        for ( ; (FSE_reloadDStream(&(seqState.DStream)) <= FSE_DStream_completed) && (nbSeq>0) ; )
1860
210k
        {
1861
210k
            size_t oneSeqSize;
1862
210k
            nbSeq--;
1863
210k
            ZSTD_decodeSequence(&sequence, &seqState);
1864
210k
            oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
1865
210k
            if (ZSTDv01_isError(oneSeqSize)) return oneSeqSize;
1866
210k
            op += oneSeqSize;
1867
210k
        }
1868
1869
        /* check if reached exact end */
1870
1.80k
        if ( !FSE_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected);   /* requested too much : data is corrupted */
1871
1.72k
        if (nbSeq<0) return ERROR(corruption_detected);   /* requested too many sequences : data is corrupted */
1872
1873
        /* last literal segment */
1874
1.72k
        {
1875
1.72k
            size_t lastLLSize = litEnd - litPtr;
1876
1.72k
            if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
1877
1.72k
            if (lastLLSize > 0) {
1878
1.64k
                if (op != litPtr) memmove(op, litPtr, lastLLSize);
1879
1.64k
                op += lastLLSize;
1880
1.64k
            }
1881
1.72k
        }
1882
1.72k
    }
1883
1884
0
    return op-ostart;
1885
1.72k
}
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
2.65k
{
1893
    /* blockType == blockCompressed, srcSize is trusted */
1894
2.65k
    const BYTE* ip = (const BYTE*)src;
1895
2.65k
    const BYTE* litPtr = NULL;
1896
2.65k
    size_t litSize = 0;
1897
2.65k
    size_t errorCode;
1898
1899
    /* Decode literals sub-block */
1900
2.65k
    errorCode = ZSTDv01_decodeLiteralsBlock(ctx, dst, maxDstSize, &litPtr, &litSize, src, srcSize);
1901
2.65k
    if (ZSTDv01_isError(errorCode)) return errorCode;
1902
2.15k
    ip += errorCode;
1903
2.15k
    srcSize -= errorCode;
1904
1905
2.15k
    return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize, litPtr, litSize);
1906
2.65k
}
1907
1908
1909
size_t ZSTDv01_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1910
1.03k
{
1911
1.03k
    const BYTE* ip = (const BYTE*)src;
1912
1.03k
    const BYTE* iend = ip + srcSize;
1913
1.03k
    BYTE* const ostart = (BYTE* const)dst;
1914
1.03k
    BYTE* op = ostart;
1915
1.03k
    BYTE* const oend = ostart + maxDstSize;
1916
1.03k
    size_t remainingSize = srcSize;
1917
1.03k
    U32 magicNumber;
1918
1.03k
    size_t errorCode=0;
1919
1.03k
    blockProperties_t blockProperties = { 0 };
1920
1921
    /* Frame Header */
1922
1.03k
    if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1923
1.03k
    magicNumber = ZSTD_readBE32(src);
1924
1.03k
    if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
1925
1.03k
    ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
1926
1927
    /* Loop on each block */
1928
3.18k
    while (1)
1929
3.18k
    {
1930
3.18k
        size_t blockSize = ZSTDv01_getcBlockSize(ip, iend-ip, &blockProperties);
1931
3.18k
        if (ZSTDv01_isError(blockSize)) return blockSize;
1932
1933
3.18k
        ip += ZSTD_blockHeaderSize;
1934
3.18k
        remainingSize -= ZSTD_blockHeaderSize;
1935
3.18k
        if (blockSize > remainingSize) return ERROR(srcSize_wrong);
1936
1937
3.18k
        switch(blockProperties.blockType)
1938
3.18k
        {
1939
2.65k
        case bt_compressed:
1940
2.65k
            errorCode = ZSTD_decompressBlock(ctx, op, oend-op, ip, blockSize);
1941
2.65k
            break;
1942
474
        case bt_raw :
1943
474
            errorCode = ZSTD_copyUncompressedBlock(op, oend-op, ip, blockSize);
1944
474
            break;
1945
16
        case bt_rle :
1946
16
            return ERROR(GENERIC);   /* not yet supported */
1947
0
            break;
1948
43
        case bt_end :
1949
            /* end of frame */
1950
43
            if (remainingSize) return ERROR(srcSize_wrong);
1951
43
            break;
1952
43
        default:
1953
0
            return ERROR(GENERIC);
1954
3.18k
        }
1955
3.17k
        if (blockSize == 0) break;   /* bt_end */
1956
1957
3.07k
        if (ZSTDv01_isError(errorCode)) return errorCode;
1958
2.15k
        op += errorCode;
1959
2.15k
        ip += blockSize;
1960
2.15k
        remainingSize -= blockSize;
1961
2.15k
    }
1962
1963
96
    return op-ostart;
1964
1.03k
}
1965
1966
size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1967
1.03k
{
1968
1.03k
    dctx_t ctx;
1969
1.03k
    ctx.base = dst;
1970
1.03k
    return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
1971
1.03k
}
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
34
{
1977
34
    *cSize = ret;
1978
34
    *dBound = ZSTD_CONTENTSIZE_ERROR;
1979
34
}
1980
1981
void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
1982
2.10k
{
1983
2.10k
    const BYTE* ip = (const BYTE*)src;
1984
2.10k
    size_t remainingSize = srcSize;
1985
2.10k
    size_t nbBlocks = 0;
1986
2.10k
    U32 magicNumber;
1987
2.10k
    blockProperties_t blockProperties;
1988
1989
    /* Frame Header */
1990
2.10k
    if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
1991
4
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
1992
4
        return;
1993
4
    }
1994
2.10k
    magicNumber = ZSTD_readBE32(src);
1995
2.10k
    if (magicNumber != ZSTD_magicNumber) {
1996
0
        ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
1997
0
        return;
1998
0
    }
1999
2.10k
    ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
2000
2001
    /* Loop on each block */
2002
11.4k
    while (1)
2003
11.4k
    {
2004
11.4k
        size_t blockSize = ZSTDv01_getcBlockSize(ip, remainingSize, &blockProperties);
2005
11.4k
        if (ZSTDv01_isError(blockSize)) {
2006
2
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, blockSize);
2007
2
            return;
2008
2
        }
2009
2010
11.4k
        ip += ZSTD_blockHeaderSize;
2011
11.4k
        remainingSize -= ZSTD_blockHeaderSize;
2012
11.4k
        if (blockSize > remainingSize) {
2013
28
            ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2014
28
            return;
2015
28
        }
2016
2017
11.3k
        if (blockSize == 0) break;   /* bt_end */
2018
2019
9.32k
        ip += blockSize;
2020
9.32k
        remainingSize -= blockSize;
2021
9.32k
        nbBlocks++;
2022
9.32k
    }
2023
2024
2.07k
    *cSize = ip - (const BYTE*)src;
2025
2.07k
    *dBound = nbBlocks * BLOCKSIZE;
2026
2.07k
}
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
}