cdrom: more hacks for more timing issues
[pcsx_rearmed.git] / deps / libchdr / deps / zstd-1.5.6 / lib / legacy / zstd_v01.c
CommitLineData
648db22b 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"
f535537f 17#include "../common/compiler.h"
648db22b 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 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,
44typedef 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
58typedef unsigned FSE_CTable; /* don't allocate that. It's just a way to be more restrictive than void* */
59typedef unsigned FSE_DTable; /* don't allocate that. It's just a way to be more restrictive than void* */
60
61typedef struct
62{
63 size_t bitContainer;
64 int bitPos;
65 char* startPtr;
66 char* ptr;
67 char* endPtr;
68} FSE_CStream_t;
69
70typedef struct
71{
72 ptrdiff_t value;
73 const void* stateTable;
74 const void* symbolTT;
75 unsigned stateLog;
76} FSE_CState_t;
77
78typedef struct
79{
80 size_t bitContainer;
81 unsigned bitsConsumed;
82 const char* ptr;
83 const char* start;
84} FSE_DStream_t;
85
86typedef struct
87{
88 size_t state;
89 const void* table; /* precise table may vary, depending on U16 */
90} FSE_DState_t;
91
92typedef 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#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#define FSE_MAX_SYMBOL_VALUE 255
114
115
116/****************************************************************
117* template functions type & suffix
118****************************************************************/
119#define FSE_FUNCTION_TYPE BYTE
120#define FSE_FUNCTION_EXTENSION
121
122
123/****************************************************************
124* Byte symbol type
125****************************************************************/
126typedef 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>
172typedef uint8_t BYTE;
173typedef uint16_t U16;
174typedef int16_t S16;
175typedef uint32_t U32;
176typedef int32_t S32;
177typedef uint64_t U64;
178typedef int64_t S64;
179#else
180typedef unsigned char BYTE;
181typedef unsigned short U16;
182typedef signed short S16;
183typedef unsigned int U32;
184typedef signed int S32;
185typedef unsigned long long U64;
186typedef signed long long S64;
187#endif
188
189#endif /* MEM_ACCESS_MODULE */
190
191/****************************************************************
192* Memory I/O
193*****************************************************************/
194
195static unsigned FSE_32bits(void)
196{
197 return sizeof(void*)==4;
198}
199
200static unsigned FSE_isLittleEndian(void)
201{
202 const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
203 return one.c[0];
204}
205
206static U16 FSE_read16(const void* memPtr)
207{
208 U16 val; memcpy(&val, memPtr, sizeof(val)); return val;
209}
210
211static U32 FSE_read32(const void* memPtr)
212{
213 U32 val; memcpy(&val, memPtr, sizeof(val)); return val;
214}
215
216static U64 FSE_read64(const void* memPtr)
217{
218 U64 val; memcpy(&val, memPtr, sizeof(val)); return val;
219}
220
221static U16 FSE_readLE16(const void* memPtr)
222{
223 if (FSE_isLittleEndian())
224 return FSE_read16(memPtr);
225 else
226 {
227 const BYTE* p = (const BYTE*)memPtr;
228 return (U16)(p[0] + (p[1]<<8));
229 }
230}
231
232static U32 FSE_readLE32(const void* memPtr)
233{
234 if (FSE_isLittleEndian())
235 return FSE_read32(memPtr);
236 else
237 {
238 const BYTE* p = (const BYTE*)memPtr;
239 return (U32)((U32)p[0] + ((U32)p[1]<<8) + ((U32)p[2]<<16) + ((U32)p[3]<<24));
240 }
241}
242
243
244static U64 FSE_readLE64(const void* memPtr)
245{
246 if (FSE_isLittleEndian())
247 return FSE_read64(memPtr);
248 else
249 {
250 const BYTE* p = (const BYTE*)memPtr;
251 return (U64)((U64)p[0] + ((U64)p[1]<<8) + ((U64)p[2]<<16) + ((U64)p[3]<<24)
252 + ((U64)p[4]<<32) + ((U64)p[5]<<40) + ((U64)p[6]<<48) + ((U64)p[7]<<56));
253 }
254}
255
256static size_t FSE_readLEST(const void* memPtr)
257{
258 if (FSE_32bits())
259 return (size_t)FSE_readLE32(memPtr);
260 else
261 return (size_t)FSE_readLE64(memPtr);
262}
263
264
265
266/****************************************************************
267* Constants
268*****************************************************************/
269#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#define FSE_MIN_TABLELOG 5
274
275#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#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
285
286
287/****************************************************************
288* Complex types
289****************************************************************/
290typedef struct
291{
292 int deltaFindState;
293 U32 deltaNbBits;
294} FSE_symbolCompressionTransform; /* total 8 bytes */
295
296typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
297
298/****************************************************************
299* Internal functions
300****************************************************************/
301FORCE_INLINE unsigned FSE_highbit32 (U32 val)
302{
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}
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
347static U32 FSE_tableStep(U32 tableSize) { return (tableSize>>1) + (tableSize>>3) + 3; }
348
349#define FSE_DECODE_TYPE FSE_decode_t
350
351
352typedef struct {
353 U16 tableLog;
354 U16 fastMode;
355} FSE_DTableHeader; /* sizeof U32 */
356
357static size_t FSE_buildDTable
358(FSE_DTable* dt, const short* normalizedCounter, unsigned maxSymbolValue, unsigned tableLog)
359{
360 void* ptr = dt;
361 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
362 FSE_DECODE_TYPE* const tableDecode = (FSE_DECODE_TYPE*)(ptr) + 1; /* because dt is unsigned, 32-bits aligned on 32-bits */
363 const U32 tableSize = 1 << tableLog;
364 const U32 tableMask = tableSize-1;
365 const U32 step = FSE_tableStep(tableSize);
366 U16 symbolNext[FSE_MAX_SYMBOL_VALUE+1];
367 U32 position = 0;
368 U32 highThreshold = tableSize-1;
369 const S16 largeLimit= (S16)(1 << (tableLog-1));
370 U32 noLarge = 1;
371 U32 s;
372
373 /* Sanity Checks */
374 if (maxSymbolValue > FSE_MAX_SYMBOL_VALUE) return (size_t)-FSE_ERROR_maxSymbolValue_tooLarge;
375 if (tableLog > FSE_MAX_TABLELOG) return (size_t)-FSE_ERROR_tableLog_tooLarge;
376
377 /* Init, lay down lowprob symbols */
378 DTableH[0].tableLog = (U16)tableLog;
379 for (s=0; s<=maxSymbolValue; s++)
380 {
381 if (normalizedCounter[s]==-1)
382 {
383 tableDecode[highThreshold--].symbol = (FSE_FUNCTION_TYPE)s;
384 symbolNext[s] = 1;
385 }
386 else
387 {
388 if (normalizedCounter[s] >= largeLimit) noLarge=0;
389 symbolNext[s] = normalizedCounter[s];
390 }
391 }
392
393 /* Spread symbols */
394 for (s=0; s<=maxSymbolValue; s++)
395 {
396 int i;
397 for (i=0; i<normalizedCounter[s]; i++)
398 {
399 tableDecode[position].symbol = (FSE_FUNCTION_TYPE)s;
400 position = (position + step) & tableMask;
401 while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
402 }
403 }
404
405 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 {
409 U32 i;
410 for (i=0; i<tableSize; i++)
411 {
412 FSE_FUNCTION_TYPE symbol = (FSE_FUNCTION_TYPE)(tableDecode[i].symbol);
413 U16 nextState = symbolNext[symbol]++;
414 tableDecode[i].nbBits = (BYTE) (tableLog - FSE_highbit32 ((U32)nextState) );
415 tableDecode[i].newState = (U16) ( (nextState << tableDecode[i].nbBits) - tableSize);
416 }
417 }
418
419 DTableH->fastMode = (U16)noLarge;
420 return 0;
421}
422
423
424/******************************************
425* FSE byte symbol
426******************************************/
427#ifndef FSE_COMMONDEFS_ONLY
428
429static unsigned FSE_isError(size_t code) { return (code > (size_t)(-FSE_ERROR_maxCode)); }
430
431static short FSE_abs(short a)
432{
433 return a<0? -a : a;
434}
435
436
437/****************************************************************
438* Header bitstream management
439****************************************************************/
440static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsigned* tableLogPtr,
441 const void* headerBuffer, size_t hbSize)
442{
443 const BYTE* const istart = (const BYTE*) headerBuffer;
444 const BYTE* const iend = istart + hbSize;
445 const BYTE* ip = istart;
446 int nbBits;
447 int remaining;
448 int threshold;
449 U32 bitStream;
450 int bitCount;
451 unsigned charnum = 0;
452 int previous0 = 0;
453
454 if (hbSize < 4) return (size_t)-FSE_ERROR_srcSize_wrong;
455 bitStream = FSE_readLE32(ip);
456 nbBits = (bitStream & 0xF) + FSE_MIN_TABLELOG; /* extract tableLog */
457 if (nbBits > FSE_TABLELOG_ABSOLUTE_MAX) return (size_t)-FSE_ERROR_tableLog_tooLarge;
458 bitStream >>= 4;
459 bitCount = 4;
460 *tableLogPtr = nbBits;
461 remaining = (1<<nbBits)+1;
462 threshold = 1<<nbBits;
463 nbBits++;
464
465 while ((remaining>1) && (charnum<=*maxSVPtr))
466 {
467 if (previous0)
468 {
469 unsigned n0 = charnum;
470 while ((bitStream & 0xFFFF) == 0xFFFF)
471 {
472 n0+=24;
473 if (ip < iend-5)
474 {
475 ip+=2;
476 bitStream = FSE_readLE32(ip) >> bitCount;
477 }
478 else
479 {
480 bitStream >>= 16;
481 bitCount+=16;
482 }
483 }
484 while ((bitStream & 3) == 3)
485 {
486 n0+=3;
487 bitStream>>=2;
488 bitCount+=2;
489 }
490 n0 += bitStream & 3;
491 bitCount += 2;
492 if (n0 > *maxSVPtr) return (size_t)-FSE_ERROR_maxSymbolValue_tooSmall;
493 while (charnum < n0) normalizedCounter[charnum++] = 0;
494 if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
495 {
496 ip += bitCount>>3;
497 bitCount &= 7;
498 bitStream = FSE_readLE32(ip) >> bitCount;
499 }
500 else
501 bitStream >>= 2;
502 }
503 {
504 const short max = (short)((2*threshold-1)-remaining);
505 short count;
506
507 if ((bitStream & (threshold-1)) < (U32)max)
508 {
509 count = (short)(bitStream & (threshold-1));
510 bitCount += nbBits-1;
511 }
512 else
513 {
514 count = (short)(bitStream & (2*threshold-1));
515 if (count >= threshold) count -= max;
516 bitCount += nbBits;
517 }
518
519 count--; /* extra accuracy */
520 remaining -= FSE_abs(count);
521 normalizedCounter[charnum++] = count;
522 previous0 = !count;
523 while (remaining < threshold)
524 {
525 nbBits--;
526 threshold >>= 1;
527 }
528
529 {
530 if ((ip <= iend-7) || (ip + (bitCount>>3) <= iend-4))
531 {
532 ip += bitCount>>3;
533 bitCount &= 7;
534 }
535 else
536 {
537 bitCount -= (int)(8 * (iend - 4 - ip));
538 ip = iend - 4;
539 }
540 bitStream = FSE_readLE32(ip) >> (bitCount & 31);
541 }
542 }
543 }
544 if (remaining != 1) return (size_t)-FSE_ERROR_GENERIC;
545 *maxSVPtr = charnum-1;
546
547 ip += (bitCount+7)>>3;
548 if ((size_t)(ip-istart) > hbSize) return (size_t)-FSE_ERROR_srcSize_wrong;
549 return ip-istart;
550}
551
552
553/*********************************************************
554* Decompression (Byte symbols)
555*********************************************************/
556static size_t FSE_buildDTable_rle (FSE_DTable* dt, BYTE symbolValue)
557{
558 void* ptr = dt;
559 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
560 FSE_decode_t* const cell = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
561
562 DTableH->tableLog = 0;
563 DTableH->fastMode = 0;
564
565 cell->newState = 0;
566 cell->symbol = symbolValue;
567 cell->nbBits = 0;
568
569 return 0;
570}
571
572
573static size_t FSE_buildDTable_raw (FSE_DTable* dt, unsigned nbBits)
574{
575 void* ptr = dt;
576 FSE_DTableHeader* const DTableH = (FSE_DTableHeader*)ptr;
577 FSE_decode_t* const dinfo = (FSE_decode_t*)(ptr) + 1; /* because dt is unsigned */
578 const unsigned tableSize = 1 << nbBits;
579 const unsigned tableMask = tableSize - 1;
580 const unsigned maxSymbolValue = tableMask;
581 unsigned s;
582
583 /* Sanity checks */
584 if (nbBits < 1) return (size_t)-FSE_ERROR_GENERIC; /* min size */
585
586 /* Build Decoding Table */
587 DTableH->tableLog = (U16)nbBits;
588 DTableH->fastMode = 1;
589 for (s=0; s<=maxSymbolValue; s++)
590 {
591 dinfo[s].newState = 0;
592 dinfo[s].symbol = (BYTE)s;
593 dinfo[s].nbBits = (BYTE)nbBits;
594 }
595
596 return 0;
597}
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 */
606static size_t FSE_initDStream(FSE_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
607{
608 if (srcSize < 1) return (size_t)-FSE_ERROR_srcSize_wrong;
609
610 if (srcSize >= sizeof(size_t))
611 {
612 U32 contain32;
613 bitD->start = (const char*)srcBuffer;
614 bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(size_t);
615 bitD->bitContainer = FSE_readLEST(bitD->ptr);
616 contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
617 if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC; /* stop bit not present */
618 bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
619 }
620 else
621 {
622 U32 contain32;
623 bitD->start = (const char*)srcBuffer;
624 bitD->ptr = bitD->start;
625 bitD->bitContainer = *(const BYTE*)(bitD->start);
626 switch(srcSize)
627 {
628 case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);
629 /* fallthrough */
630 case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);
631 /* fallthrough */
632 case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);
633 /* fallthrough */
634 case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
635 /* fallthrough */
636 case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
637 /* fallthrough */
638 case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
639 /* fallthrough */
640 default:;
641 }
642 contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
643 if (contain32 == 0) return (size_t)-FSE_ERROR_GENERIC; /* stop bit not present */
644 bitD->bitsConsumed = 8 - FSE_highbit32(contain32);
645 bitD->bitsConsumed += (U32)(sizeof(size_t) - srcSize)*8;
646 }
647
648 return srcSize;
649}
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 */
659static size_t FSE_lookBits(FSE_DStream_t* bitD, U32 nbBits)
660{
661 const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
662 return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
663}
664
665static size_t FSE_lookBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
666{
667 const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
668 return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
669}
670
671static void FSE_skipBits(FSE_DStream_t* bitD, U32 nbBits)
672{
673 bitD->bitsConsumed += nbBits;
674}
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 */
684static size_t FSE_readBits(FSE_DStream_t* bitD, U32 nbBits)
685{
686 size_t value = FSE_lookBits(bitD, nbBits);
687 FSE_skipBits(bitD, nbBits);
688 return value;
689}
690
691static size_t FSE_readBitsFast(FSE_DStream_t* bitD, U32 nbBits) /* only if nbBits >= 1 !! */
692{
693 size_t value = FSE_lookBitsFast(bitD, nbBits);
694 FSE_skipBits(bitD, nbBits);
695 return value;
696}
697
698static unsigned FSE_reloadDStream(FSE_DStream_t* bitD)
699{
700 if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
701 return FSE_DStream_tooFar;
702
703 if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
704 {
705 bitD->ptr -= bitD->bitsConsumed >> 3;
706 bitD->bitsConsumed &= 7;
707 bitD->bitContainer = FSE_readLEST(bitD->ptr);
708 return FSE_DStream_unfinished;
709 }
710 if (bitD->ptr == bitD->start)
711 {
712 if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return FSE_DStream_endOfBuffer;
713 return FSE_DStream_completed;
714 }
715 {
716 U32 nbBytes = bitD->bitsConsumed >> 3;
717 U32 result = FSE_DStream_unfinished;
718 if (bitD->ptr - nbBytes < bitD->start)
719 {
720 nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
721 result = FSE_DStream_endOfBuffer;
722 }
723 bitD->ptr -= nbBytes;
724 bitD->bitsConsumed -= nbBytes*8;
725 bitD->bitContainer = FSE_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
726 return result;
727 }
728}
729
730
731static void FSE_initDState(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD, const FSE_DTable* dt)
732{
733 const void* ptr = dt;
734 const FSE_DTableHeader* const DTableH = (const FSE_DTableHeader*)ptr;
735 DStatePtr->state = FSE_readBits(bitD, DTableH->tableLog);
736 FSE_reloadDStream(bitD);
737 DStatePtr->table = dt + 1;
738}
739
740static BYTE FSE_decodeSymbol(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
741{
742 const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
743 const U32 nbBits = DInfo.nbBits;
744 BYTE symbol = DInfo.symbol;
745 size_t lowBits = FSE_readBits(bitD, nbBits);
746
747 DStatePtr->state = DInfo.newState + lowBits;
748 return symbol;
749}
750
751static BYTE FSE_decodeSymbolFast(FSE_DState_t* DStatePtr, FSE_DStream_t* bitD)
752{
753 const FSE_decode_t DInfo = ((const FSE_decode_t*)(DStatePtr->table))[DStatePtr->state];
754 const U32 nbBits = DInfo.nbBits;
755 BYTE symbol = DInfo.symbol;
756 size_t lowBits = FSE_readBitsFast(bitD, nbBits);
757
758 DStatePtr->state = DInfo.newState + lowBits;
759 return symbol;
760}
761
762/* FSE_endOfDStream
763 Tells if bitD has reached end of bitStream or not */
764
765static unsigned FSE_endOfDStream(const FSE_DStream_t* bitD)
766{
767 return ((bitD->ptr == bitD->start) && (bitD->bitsConsumed == sizeof(bitD->bitContainer)*8));
768}
769
770static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr)
771{
772 return DStatePtr->state == 0;
773}
774
775
776FORCE_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{
781 BYTE* const ostart = (BYTE*) dst;
782 BYTE* op = ostart;
783 BYTE* const omax = op + maxDstSize;
784 BYTE* const olimit = omax-3;
785
786 FSE_DStream_t bitD;
787 FSE_DState_t state1;
788 FSE_DState_t state2;
789 size_t errorCode;
790
791 /* Init */
792 errorCode = FSE_initDStream(&bitD, cSrc, cSrcSize); /* replaced last arg by maxCompressed Size */
793 if (FSE_isError(errorCode)) return errorCode;
794
795 FSE_initDState(&state1, &bitD, dt);
796 FSE_initDState(&state2, &bitD, dt);
797
798#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
799
800 /* 4 symbols per loop */
801 for ( ; (FSE_reloadDStream(&bitD)==FSE_DStream_unfinished) && (op<olimit) ; op+=4)
802 {
803 op[0] = FSE_GETSYMBOL(&state1);
804
805 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
806 FSE_reloadDStream(&bitD);
807
808 op[1] = FSE_GETSYMBOL(&state2);
809
810 if (FSE_MAX_TABLELOG*4+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
811 { if (FSE_reloadDStream(&bitD) > FSE_DStream_unfinished) { op+=2; break; } }
812
813 op[2] = FSE_GETSYMBOL(&state1);
814
815 if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
816 FSE_reloadDStream(&bitD);
817
818 op[3] = FSE_GETSYMBOL(&state2);
819 }
820
821 /* tail */
822 /* note : FSE_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly FSE_DStream_completed */
823 while (1)
824 {
825 if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state1))) )
826 break;
827
828 *op++ = FSE_GETSYMBOL(&state1);
829
830 if ( (FSE_reloadDStream(&bitD)>FSE_DStream_completed) || (op==omax) || (FSE_endOfDStream(&bitD) && (fast || FSE_endOfDState(&state2))) )
831 break;
832
833 *op++ = FSE_GETSYMBOL(&state2);
834 }
835
836 /* end ? */
837 if (FSE_endOfDStream(&bitD) && FSE_endOfDState(&state1) && FSE_endOfDState(&state2))
838 return op-ostart;
839
840 if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall; /* dst buffer is full, but cSrc unfinished */
841
842 return (size_t)-FSE_ERROR_corruptionDetected;
843}
844
845
846static size_t FSE_decompress_usingDTable(void* dst, size_t originalSize,
847 const void* cSrc, size_t cSrcSize,
848 const FSE_DTable* dt)
849{
850 FSE_DTableHeader DTableH;
851 memcpy(&DTableH, dt, sizeof(DTableH)); /* memcpy() into local variable, to avoid strict aliasing warning */
852
853 /* select fast mode (static) */
854 if (DTableH.fastMode) return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 1);
855 return FSE_decompress_usingDTable_generic(dst, originalSize, cSrc, cSrcSize, dt, 0);
856}
857
858
859static size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
860{
861 const BYTE* const istart = (const BYTE*)cSrc;
862 const BYTE* ip = istart;
863 short counting[FSE_MAX_SYMBOL_VALUE+1];
864 DTable_max_t dt; /* Static analyzer seems unable to understand this table will be properly initialized later */
865 unsigned tableLog;
866 unsigned maxSymbolValue = FSE_MAX_SYMBOL_VALUE;
867 size_t errorCode;
868
869 if (cSrcSize<2) return (size_t)-FSE_ERROR_srcSize_wrong; /* too small input size */
870
871 /* normal FSE decoding mode */
872 errorCode = FSE_readNCount (counting, &maxSymbolValue, &tableLog, istart, cSrcSize);
873 if (FSE_isError(errorCode)) return errorCode;
874 if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong; /* too small input size */
875 ip += errorCode;
876 cSrcSize -= errorCode;
877
878 errorCode = FSE_buildDTable (dt, counting, maxSymbolValue, tableLog);
879 if (FSE_isError(errorCode)) return errorCode;
880
881 /* always return, even if it is an error code */
882 return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt);
883}
884
885
886
887/* *******************************************************
888* Huff0 : Huffman block compression
889*********************************************************/
890#define HUF_MAX_SYMBOL_VALUE 255
891#define HUF_DEFAULT_TABLELOG 12 /* used by default, when not specified */
892#define HUF_MAX_TABLELOG 12 /* max possible tableLog; for allocation purpose; can be modified */
893#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
898typedef struct HUF_CElt_s {
899 U16 val;
900 BYTE nbBits;
901} HUF_CElt ;
902
903typedef 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*********************************************************/
914typedef struct {
915 BYTE byte;
916 BYTE nbBits;
917} HUF_DElt;
918
919static size_t HUF_readDTable (U16* DTable, const void* src, size_t srcSize)
920{
921 BYTE huffWeight[HUF_MAX_SYMBOL_VALUE + 1];
922 U32 rankVal[HUF_ABSOLUTEMAX_TABLELOG + 1]; /* large enough for values from 0 to 16 */
923 U32 weightTotal;
924 U32 maxBits;
925 const BYTE* ip = (const BYTE*) src;
926 size_t iSize;
927 size_t oSize;
928 U32 n;
929 U32 nextRankStart;
930 void* ptr = DTable+1;
931 HUF_DElt* const dt = (HUF_DElt*)ptr;
932
933 if (!srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
934 iSize = ip[0];
935
936 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 if (iSize >= 128) /* special header */
939 {
940 if (iSize >= (242)) /* RLE */
941 {
942 static int l[14] = { 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64, 127, 128 };
943 oSize = l[iSize-242];
944 memset(huffWeight, 1, sizeof(huffWeight));
945 iSize = 0;
946 }
947 else /* Incompressible */
948 {
949 oSize = iSize - 127;
950 iSize = ((oSize+1)/2);
951 if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
952 ip += 1;
953 for (n=0; n<oSize; n+=2)
954 {
955 huffWeight[n] = ip[n/2] >> 4;
956 huffWeight[n+1] = ip[n/2] & 15;
957 }
958 }
959 }
960 else /* header compressed with FSE (normal case) */
961 {
962 if (iSize+1 > srcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
963 oSize = FSE_decompress(huffWeight, HUF_MAX_SYMBOL_VALUE, ip+1, iSize); /* max 255 values decoded, last one is implied */
964 if (FSE_isError(oSize)) return oSize;
965 }
966
967 /* collect weight stats */
968 memset(rankVal, 0, sizeof(rankVal));
969 weightTotal = 0;
970 for (n=0; n<oSize; n++)
971 {
972 if (huffWeight[n] >= HUF_ABSOLUTEMAX_TABLELOG) return (size_t)-FSE_ERROR_corruptionDetected;
973 rankVal[huffWeight[n]]++;
974 weightTotal += (1 << huffWeight[n]) >> 1;
975 }
976 if (weightTotal == 0) return (size_t)-FSE_ERROR_corruptionDetected;
977
978 /* get last non-null symbol weight (implied, total must be 2^n) */
979 maxBits = FSE_highbit32(weightTotal) + 1;
980 if (maxBits > DTable[0]) return (size_t)-FSE_ERROR_tableLog_tooLarge; /* DTable is too small */
981 DTable[0] = (U16)maxBits;
982 {
983 U32 total = 1 << maxBits;
984 U32 rest = total - weightTotal;
985 U32 verif = 1 << FSE_highbit32(rest);
986 U32 lastWeight = FSE_highbit32(rest) + 1;
987 if (verif != rest) return (size_t)-FSE_ERROR_corruptionDetected; /* last value must be a clean power of 2 */
988 huffWeight[oSize] = (BYTE)lastWeight;
989 rankVal[lastWeight]++;
990 }
991
992 /* check tree construction validity */
993 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 nextRankStart = 0;
997 for (n=1; n<=maxBits; n++)
998 {
999 U32 current = nextRankStart;
1000 nextRankStart += (rankVal[n] << (n-1));
1001 rankVal[n] = current;
1002 }
1003
1004 /* fill DTable */
1005 for (n=0; n<=oSize; n++)
1006 {
1007 const U32 w = huffWeight[n];
1008 const U32 length = (1 << w) >> 1;
1009 U32 i;
1010 HUF_DElt D;
1011 D.byte = (BYTE)n; D.nbBits = (BYTE)(maxBits + 1 - w);
1012 for (i = rankVal[w]; i < rankVal[w] + length; i++)
1013 dt[i] = D;
1014 rankVal[w] += length;
1015 }
1016
1017 return iSize+1;
1018}
1019
1020
1021static BYTE HUF_decodeSymbol(FSE_DStream_t* Dstream, const HUF_DElt* dt, const U32 dtLog)
1022{
1023 const size_t val = FSE_lookBitsFast(Dstream, dtLog); /* note : dtLog >= 1 */
1024 const BYTE c = dt[val].byte;
1025 FSE_skipBits(Dstream, dt[val].nbBits);
1026 return c;
1027}
1028
1029static 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{
1034 if (cSrcSize < 6) return (size_t)-FSE_ERROR_srcSize_wrong;
1035 {
1036 BYTE* const ostart = (BYTE*) dst;
1037 BYTE* op = ostart;
1038 BYTE* const omax = op + maxDstSize;
1039 BYTE* const olimit = maxDstSize < 15 ? op : omax-15;
1040
1041 const void* ptr = DTable;
1042 const HUF_DElt* const dt = (const HUF_DElt*)(ptr)+1;
1043 const U32 dtLog = DTable[0];
1044 size_t errorCode;
1045 U32 reloadStatus;
1046
1047 /* Init */
1048
1049 const U16* jumpTable = (const U16*)cSrc;
1050 const size_t length1 = FSE_readLE16(jumpTable);
1051 const size_t length2 = FSE_readLE16(jumpTable+1);
1052 const size_t length3 = FSE_readLE16(jumpTable+2);
1053 const size_t length4 = cSrcSize - 6 - length1 - length2 - length3; /* check coherency !! */
1054 const char* const start1 = (const char*)(cSrc) + 6;
1055 const char* const start2 = start1 + length1;
1056 const char* const start3 = start2 + length2;
1057 const char* const start4 = start3 + length3;
1058 FSE_DStream_t bitD1, bitD2, bitD3, bitD4;
1059
1060 if (length1+length2+length3+6 >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1061
1062 errorCode = FSE_initDStream(&bitD1, start1, length1);
1063 if (FSE_isError(errorCode)) return errorCode;
1064 errorCode = FSE_initDStream(&bitD2, start2, length2);
1065 if (FSE_isError(errorCode)) return errorCode;
1066 errorCode = FSE_initDStream(&bitD3, start3, length3);
1067 if (FSE_isError(errorCode)) return errorCode;
1068 errorCode = FSE_initDStream(&bitD4, start4, length4);
1069 if (FSE_isError(errorCode)) return errorCode;
1070
1071 reloadStatus=FSE_reloadDStream(&bitD2);
1072
1073 /* 16 symbols per loop */
1074 for ( ; (reloadStatus<FSE_DStream_completed) && (op<olimit); /* D2-3-4 are supposed to be synchronized and finish together */
1075 op+=16, reloadStatus = FSE_reloadDStream(&bitD2) | FSE_reloadDStream(&bitD3) | FSE_reloadDStream(&bitD4), FSE_reloadDStream(&bitD1))
1076 {
1077 #define HUF_DECODE_SYMBOL_0(n, Dstream) \
1078 op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog);
1079
1080 #define HUF_DECODE_SYMBOL_1(n, Dstream) \
1081 op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1082 if (FSE_32bits() && (HUF_MAX_TABLELOG>12)) FSE_reloadDStream(&Dstream)
1083
1084 #define HUF_DECODE_SYMBOL_2(n, Dstream) \
1085 op[n] = HUF_decodeSymbol(&Dstream, dt, dtLog); \
1086 if (FSE_32bits()) FSE_reloadDStream(&Dstream)
1087
1088 HUF_DECODE_SYMBOL_1( 0, bitD1);
1089 HUF_DECODE_SYMBOL_1( 1, bitD2);
1090 HUF_DECODE_SYMBOL_1( 2, bitD3);
1091 HUF_DECODE_SYMBOL_1( 3, bitD4);
1092 HUF_DECODE_SYMBOL_2( 4, bitD1);
1093 HUF_DECODE_SYMBOL_2( 5, bitD2);
1094 HUF_DECODE_SYMBOL_2( 6, bitD3);
1095 HUF_DECODE_SYMBOL_2( 7, bitD4);
1096 HUF_DECODE_SYMBOL_1( 8, bitD1);
1097 HUF_DECODE_SYMBOL_1( 9, bitD2);
1098 HUF_DECODE_SYMBOL_1(10, bitD3);
1099 HUF_DECODE_SYMBOL_1(11, bitD4);
1100 HUF_DECODE_SYMBOL_0(12, bitD1);
1101 HUF_DECODE_SYMBOL_0(13, bitD2);
1102 HUF_DECODE_SYMBOL_0(14, bitD3);
1103 HUF_DECODE_SYMBOL_0(15, bitD4);
1104 }
1105
1106 if (reloadStatus!=FSE_DStream_completed) /* not complete : some bitStream might be FSE_DStream_unfinished */
1107 return (size_t)-FSE_ERROR_corruptionDetected;
1108
1109 /* tail */
1110 {
1111 /* bitTail = bitD1; */ /* *much* slower : -20% !??! */
1112 FSE_DStream_t bitTail;
1113 bitTail.ptr = bitD1.ptr;
1114 bitTail.bitsConsumed = bitD1.bitsConsumed;
1115 bitTail.bitContainer = bitD1.bitContainer; /* required in case of FSE_DStream_endOfBuffer */
1116 bitTail.start = start1;
1117 for ( ; (FSE_reloadDStream(&bitTail) < FSE_DStream_completed) && (op<omax) ; op++)
1118 {
1119 HUF_DECODE_SYMBOL_0(0, bitTail);
1120 }
1121
1122 if (FSE_endOfDStream(&bitTail))
1123 return op-ostart;
1124 }
1125
1126 if (op==omax) return (size_t)-FSE_ERROR_dstSize_tooSmall; /* dst buffer is full, but cSrc unfinished */
1127
1128 return (size_t)-FSE_ERROR_corruptionDetected;
1129 }
1130}
1131
1132
1133static size_t HUF_decompress (void* dst, size_t maxDstSize, const void* cSrc, size_t cSrcSize)
1134{
1135 HUF_CREATE_STATIC_DTABLE(DTable, HUF_MAX_TABLELOG);
1136 const BYTE* ip = (const BYTE*) cSrc;
1137 size_t errorCode;
1138
1139 errorCode = HUF_readDTable (DTable, cSrc, cSrcSize);
1140 if (FSE_isError(errorCode)) return errorCode;
1141 if (errorCode >= cSrcSize) return (size_t)-FSE_ERROR_srcSize_wrong;
1142 ip += errorCode;
1143 cSrcSize -= errorCode;
1144
1145 return HUF_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, DTable);
1146}
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
1246typedef uint8_t BYTE;
1247typedef uint16_t U16;
1248typedef int16_t S16;
1249typedef uint32_t U32;
1250typedef int32_t S32;
1251typedef uint64_t U64;
1252#else
1253typedef unsigned char BYTE;
1254typedef unsigned short U16;
1255typedef signed short S16;
1256typedef unsigned int U32;
1257typedef signed int S32;
1258typedef unsigned long long U64;
1259#endif
1260
1261#endif /* MEM_ACCESS_MODULE */
1262
1263
1264/********************************************************
1265* Constants
1266*********************************************************/
1267static 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#define KB *(1 <<10)
1281#define MB *(1 <<20)
1282#define GB *(1U<<30)
1283
1284#define BLOCKSIZE (128 KB) /* define, for static allocation */
1285
1286#define WORKPLACESIZE (BLOCKSIZE*3)
1287#define MINMATCH 4
1288#define MLbits 7
1289#define LLbits 6
1290#define Offbits 5
1291#define MaxML ((1<<MLbits )-1)
1292#define MaxLL ((1<<LLbits )-1)
1293#define MaxOff ((1<<Offbits)-1)
1294#define LitFSELog 11
1295#define MLFSELog 10
1296#define LLFSELog 10
1297#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#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
1305
1306static const size_t ZSTD_blockHeaderSize = 3;
1307static const size_t ZSTD_frameHeaderSize = 4;
1308
1309
1310/********************************************************
1311* Memory operations
1312*********************************************************/
1313static unsigned ZSTD_32bits(void) { return sizeof(void*)==4; }
1314
1315static unsigned ZSTD_isLittleEndian(void)
1316{
1317 const union { U32 i; BYTE c[4]; } one = { 1 }; /* don't use static : performance detrimental */
1318 return one.c[0];
1319}
1320
1321static U16 ZSTD_read16(const void* p) { U16 r; memcpy(&r, p, sizeof(r)); return r; }
1322
1323static void ZSTD_copy4(void* dst, const void* src) { memcpy(dst, src, 4); }
1324
1325static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
1326
1327#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
1328
1329static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
1330{
1331 const BYTE* ip = (const BYTE*)src;
1332 BYTE* op = (BYTE*)dst;
1333 BYTE* const oend = op + length;
1334 while (op < oend) COPY8(op, ip);
1335}
1336
1337static U16 ZSTD_readLE16(const void* memPtr)
1338{
1339 if (ZSTD_isLittleEndian()) return ZSTD_read16(memPtr);
1340 else
1341 {
1342 const BYTE* p = (const BYTE*)memPtr;
1343 return (U16)((U16)p[0] + ((U16)p[1]<<8));
1344 }
1345}
1346
1347static U32 ZSTD_readLE24(const void* memPtr)
1348{
1349 return ZSTD_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
1350}
1351
1352static U32 ZSTD_readBE32(const void* memPtr)
1353{
1354 const BYTE* p = (const BYTE*)memPtr;
1355 return (U32)(((U32)p[0]<<24) + ((U32)p[1]<<16) + ((U32)p[2]<<8) + ((U32)p[3]<<0));
1356}
1357
1358
1359/**************************************
1360* Local structures
1361***************************************/
1362typedef struct ZSTD_Cctx_s ZSTD_Cctx;
1363
1364typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
1365
1366typedef struct
1367{
1368 blockType_t blockType;
1369 U32 origSize;
1370} blockProperties_t;
1371
1372typedef 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
1389typedef 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 */
1410unsigned 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
1425static size_t ZSTDv01_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
1426{
1427 const BYTE* const in = (const BYTE* const)src;
1428 BYTE headerFlags;
1429 U32 cSize;
1430
1431 if (srcSize < 3) return ERROR(srcSize_wrong);
1432
1433 headerFlags = *in;
1434 cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
1435
1436 bpPtr->blockType = (blockType_t)(headerFlags >> 6);
1437 bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
1438
1439 if (bpPtr->blockType == bt_end) return 0;
1440 if (bpPtr->blockType == bt_rle) return 1;
1441 return cSize;
1442}
1443
1444
1445static size_t ZSTD_copyUncompressedBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1446{
1447 if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
1448 if (srcSize > 0) {
1449 memcpy(dst, src, srcSize);
1450 }
1451 return srcSize;
1452}
1453
1454
1455static size_t ZSTD_decompressLiterals(void* ctx,
1456 void* dst, size_t maxDstSize,
1457 const void* src, size_t srcSize)
1458{
1459 BYTE* op = (BYTE*)dst;
1460 BYTE* const oend = op + maxDstSize;
1461 const BYTE* ip = (const BYTE*)src;
1462 size_t errorCode;
1463 size_t litSize;
1464
1465 /* check : minimum 2, for litSize, +1, for content */
1466 if (srcSize <= 3) return ERROR(corruption_detected);
1467
1468 litSize = ip[1] + (ip[0]<<8);
1469 litSize += ((ip[-3] >> 3) & 7) << 16; /* mmmmh.... */
1470 op = oend - litSize;
1471
1472 (void)ctx;
1473 if (litSize > maxDstSize) return ERROR(dstSize_tooSmall);
1474 errorCode = HUF_decompress(op, litSize, ip+2, srcSize-2);
1475 if (FSE_isError(errorCode)) return ERROR(GENERIC);
1476 return litSize;
1477}
1478
1479
1480static 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{
1485 const BYTE* const istart = (const BYTE* const)src;
1486 const BYTE* ip = istart;
1487 BYTE* const ostart = (BYTE* const)dst;
1488 BYTE* const oend = ostart + maxDstSize;
1489 blockProperties_t litbp;
1490
1491 size_t litcSize = ZSTDv01_getcBlockSize(src, srcSize, &litbp);
1492 if (ZSTDv01_isError(litcSize)) return litcSize;
1493 if (litcSize > srcSize - ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1494 ip += ZSTD_blockHeaderSize;
1495
1496 switch(litbp.blockType)
1497 {
1498 case bt_raw:
1499 *litStart = ip;
1500 ip += litcSize;
1501 *litSize = litcSize;
1502 break;
1503 case bt_rle:
1504 {
1505 size_t rleSize = litbp.origSize;
1506 if (rleSize>maxDstSize) return ERROR(dstSize_tooSmall);
1507 if (!srcSize) return ERROR(srcSize_wrong);
1508 if (rleSize > 0) {
1509 memset(oend - rleSize, *ip, rleSize);
1510 }
1511 *litStart = oend - rleSize;
1512 *litSize = rleSize;
1513 ip++;
1514 break;
1515 }
1516 case bt_compressed:
1517 {
1518 size_t decodedLitSize = ZSTD_decompressLiterals(ctx, dst, maxDstSize, ip, litcSize);
1519 if (ZSTDv01_isError(decodedLitSize)) return decodedLitSize;
1520 *litStart = oend - decodedLitSize;
1521 *litSize = decodedLitSize;
1522 ip += litcSize;
1523 break;
1524 }
1525 case bt_end:
1526 default:
1527 return ERROR(GENERIC);
1528 }
1529
1530 return ip-istart;
1531}
1532
1533
1534static 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{
1538 const BYTE* const istart = (const BYTE* const)src;
1539 const BYTE* ip = istart;
1540 const BYTE* const iend = istart + srcSize;
1541 U32 LLtype, Offtype, MLtype;
1542 U32 LLlog, Offlog, MLlog;
1543 size_t dumpsLength;
1544
1545 /* check */
1546 if (srcSize < 5) return ERROR(srcSize_wrong);
1547
1548 /* SeqHead */
1549 *nbSeq = ZSTD_readLE16(ip); ip+=2;
1550 LLtype = *ip >> 6;
1551 Offtype = (*ip >> 4) & 3;
1552 MLtype = (*ip >> 2) & 3;
1553 if (*ip & 2)
1554 {
1555 dumpsLength = ip[2];
1556 dumpsLength += ip[1] << 8;
1557 ip += 3;
1558 }
1559 else
1560 {
1561 dumpsLength = ip[1];
1562 dumpsLength += (ip[0] & 1) << 8;
1563 ip += 2;
1564 }
1565 *dumpsPtr = ip;
1566 ip += dumpsLength;
1567 *dumpsLengthPtr = dumpsLength;
1568
1569 /* check */
1570 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 {
1574 S16 norm[MaxML+1]; /* assumption : MaxML >= MaxLL and MaxOff */
1575 size_t headerSize;
1576
1577 /* Build DTables */
1578 switch(LLtype)
1579 {
1580 case bt_rle :
1581 LLlog = 0;
1582 FSE_buildDTable_rle(DTableLL, *ip++); break;
1583 case bt_raw :
1584 LLlog = LLbits;
1585 FSE_buildDTable_raw(DTableLL, LLbits); break;
1586 default :
1587 { U32 max = MaxLL;
1588 headerSize = FSE_readNCount(norm, &max, &LLlog, ip, iend-ip);
1589 if (FSE_isError(headerSize)) return ERROR(GENERIC);
1590 if (LLlog > LLFSELog) return ERROR(corruption_detected);
1591 ip += headerSize;
1592 FSE_buildDTable(DTableLL, norm, max, LLlog);
1593 } }
1594
1595 switch(Offtype)
1596 {
1597 case bt_rle :
1598 Offlog = 0;
1599 if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1600 FSE_buildDTable_rle(DTableOffb, *ip++); break;
1601 case bt_raw :
1602 Offlog = Offbits;
1603 FSE_buildDTable_raw(DTableOffb, Offbits); break;
1604 default :
1605 { U32 max = MaxOff;
1606 headerSize = FSE_readNCount(norm, &max, &Offlog, ip, iend-ip);
1607 if (FSE_isError(headerSize)) return ERROR(GENERIC);
1608 if (Offlog > OffFSELog) return ERROR(corruption_detected);
1609 ip += headerSize;
1610 FSE_buildDTable(DTableOffb, norm, max, Offlog);
1611 } }
1612
1613 switch(MLtype)
1614 {
1615 case bt_rle :
1616 MLlog = 0;
1617 if (ip > iend-2) return ERROR(srcSize_wrong); /* min : "raw", hence no header, but at least xxLog bits */
1618 FSE_buildDTable_rle(DTableML, *ip++); break;
1619 case bt_raw :
1620 MLlog = MLbits;
1621 FSE_buildDTable_raw(DTableML, MLbits); break;
1622 default :
1623 { U32 max = MaxML;
1624 headerSize = FSE_readNCount(norm, &max, &MLlog, ip, iend-ip);
1625 if (FSE_isError(headerSize)) return ERROR(GENERIC);
1626 if (MLlog > MLFSELog) return ERROR(corruption_detected);
1627 ip += headerSize;
1628 FSE_buildDTable(DTableML, norm, max, MLlog);
1629 } } }
1630
1631 return ip-istart;
1632}
1633
1634
1635typedef struct {
1636 size_t litLength;
1637 size_t offset;
1638 size_t matchLength;
1639} seq_t;
1640
1641typedef 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
1652static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState)
1653{
1654 size_t litLength;
1655 size_t prevOffset;
1656 size_t offset;
1657 size_t matchLength;
1658 const BYTE* dumps = seqState->dumps;
1659 const BYTE* const de = seqState->dumpsEnd;
1660
1661 /* Literal length */
1662 litLength = FSE_decodeSymbol(&(seqState->stateLL), &(seqState->DStream));
1663 prevOffset = litLength ? seq->offset : seqState->prevOffset;
1664 seqState->prevOffset = seq->offset;
1665 if (litLength == MaxLL)
1666 {
1667 const U32 add = dumps<de ? *dumps++ : 0;
1668 if (add < 255) litLength += add;
1669 else
1670 {
1671 if (dumps<=(de-3))
1672 {
1673 litLength = ZSTD_readLE24(dumps);
1674 dumps += 3;
1675 }
1676 }
1677 }
1678
1679 /* Offset */
1680 {
1681 U32 offsetCode, nbBits;
1682 offsetCode = FSE_decodeSymbol(&(seqState->stateOffb), &(seqState->DStream));
1683 if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1684 nbBits = offsetCode - 1;
1685 if (offsetCode==0) nbBits = 0; /* cmove */
1686 offset = ((size_t)1 << (nbBits & ((sizeof(offset)*8)-1))) + FSE_readBits(&(seqState->DStream), nbBits);
1687 if (ZSTD_32bits()) FSE_reloadDStream(&(seqState->DStream));
1688 if (offsetCode==0) offset = prevOffset;
1689 }
1690
1691 /* MatchLength */
1692 matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
1693 if (matchLength == MaxML)
1694 {
1695 const U32 add = dumps<de ? *dumps++ : 0;
1696 if (add < 255) matchLength += add;
1697 else
1698 {
1699 if (dumps<=(de-3))
1700 {
1701 matchLength = ZSTD_readLE24(dumps);
1702 dumps += 3;
1703 }
1704 }
1705 }
1706 matchLength += MINMATCH;
1707
1708 /* save result */
1709 seq->litLength = litLength;
1710 seq->offset = offset;
1711 seq->matchLength = matchLength;
1712 seqState->dumps = dumps;
1713}
1714
1715
1716static 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{
1721 static const int dec32table[] = {0, 1, 2, 1, 4, 4, 4, 4}; /* added */
1722 static const int dec64table[] = {8, 8, 8, 7, 8, 9,10,11}; /* subtracted */
1723 const BYTE* const ostart = op;
1724 BYTE* const oLitEnd = op + sequence.litLength;
1725 const size_t litLength = sequence.litLength;
1726 BYTE* const endMatch = op + litLength + sequence.matchLength; /* risk : address space overflow (32-bits) */
1727 const BYTE* const litEnd = *litPtr + litLength;
1728
1729 /* checks */
1730 size_t const seqLength = sequence.litLength + sequence.matchLength;
1731
1732 if (seqLength > (size_t)(oend - op)) return ERROR(dstSize_tooSmall);
1733 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 if (sequence.offset > (U32)(oLitEnd - base)) return ERROR(corruption_detected);
1736
1737 if (endMatch > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
1738 if (litEnd > litLimit) return ERROR(corruption_detected); /* overRead beyond lit buffer */
1739 if (sequence.matchLength > (size_t)(*litPtr-op)) return ERROR(dstSize_tooSmall); /* overwrite literal segment */
1740
1741 /* copy Literals */
1742 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 op += litLength;
1745 *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 if (oend-op < 8) return ERROR(dstSize_tooSmall);
1749
1750 /* copy Match */
1751 {
1752 const U32 overlapRisk = (((size_t)(litEnd - endMatch)) < 12);
1753 const BYTE* match = op - sequence.offset; /* possible underflow at op - offset ? */
1754 size_t qutt = 12;
1755 U64 saved[2];
1756
1757 /* check */
1758 if (match < base) return ERROR(corruption_detected);
1759 if (sequence.offset > (size_t)base) return ERROR(corruption_detected);
1760
1761 /* save beginning of literal sequence, in case of write overlap */
1762 if (overlapRisk)
1763 {
1764 if ((endMatch + qutt) > oend) qutt = oend-endMatch;
1765 memcpy(saved, endMatch, qutt);
1766 }
1767
1768 if (sequence.offset < 8)
1769 {
1770 const int dec64 = dec64table[sequence.offset];
1771 op[0] = match[0];
1772 op[1] = match[1];
1773 op[2] = match[2];
1774 op[3] = match[3];
1775 match += dec32table[sequence.offset];
1776 ZSTD_copy4(op+4, match);
1777 match -= dec64;
1778 } else { ZSTD_copy8(op, match); }
1779 op += 8; match += 8;
1780
1781 if (endMatch > oend-(16-MINMATCH))
1782 {
1783 if (op < oend-8)
1784 {
1785 ZSTD_wildcopy(op, match, (oend-8) - op);
1786 match += (oend-8) - op;
1787 op = oend-8;
1788 }
1789 while (op<endMatch) *op++ = *match++;
1790 }
1791 else
1792 ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
1793
1794 /* restore, in case of overlap */
1795 if (overlapRisk) memcpy(endMatch, saved, qutt);
1796 }
1797
1798 return endMatch-ostart;
1799}
1800
1801typedef 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
1814static 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{
1820 dctx_t* dctx = (dctx_t*)ctx;
1821 const BYTE* ip = (const BYTE*)seqStart;
1822 const BYTE* const iend = ip + seqSize;
1823 BYTE* const ostart = (BYTE* const)dst;
1824 BYTE* op = ostart;
1825 BYTE* const oend = ostart + maxDstSize;
1826 size_t errorCode, dumpsLength;
1827 const BYTE* litPtr = litStart;
1828 const BYTE* const litEnd = litStart + litSize;
1829 int nbSeq;
1830 const BYTE* dumps;
1831 U32* DTableLL = dctx->LLTable;
1832 U32* DTableML = dctx->MLTable;
1833 U32* DTableOffb = dctx->OffTable;
1834 BYTE* const base = (BYTE*) (dctx->base);
1835
1836 /* Build Decoding Tables */
1837 errorCode = ZSTDv01_decodeSeqHeaders(&nbSeq, &dumps, &dumpsLength,
1838 DTableLL, DTableML, DTableOffb,
1839 ip, iend-ip);
1840 if (ZSTDv01_isError(errorCode)) return errorCode;
1841 ip += errorCode;
1842
1843 /* Regen sequences */
1844 {
1845 seq_t sequence;
1846 seqState_t seqState;
1847
1848 memset(&sequence, 0, sizeof(sequence));
1849 seqState.dumps = dumps;
1850 seqState.dumpsEnd = dumps + dumpsLength;
1851 seqState.prevOffset = 1;
1852 errorCode = FSE_initDStream(&(seqState.DStream), ip, iend-ip);
1853 if (FSE_isError(errorCode)) return ERROR(corruption_detected);
1854 FSE_initDState(&(seqState.stateLL), &(seqState.DStream), DTableLL);
1855 FSE_initDState(&(seqState.stateOffb), &(seqState.DStream), DTableOffb);
1856 FSE_initDState(&(seqState.stateML), &(seqState.DStream), DTableML);
1857
1858 for ( ; (FSE_reloadDStream(&(seqState.DStream)) <= FSE_DStream_completed) && (nbSeq>0) ; )
1859 {
1860 size_t oneSeqSize;
1861 nbSeq--;
1862 ZSTD_decodeSequence(&sequence, &seqState);
1863 oneSeqSize = ZSTD_execSequence(op, sequence, &litPtr, litEnd, base, oend);
1864 if (ZSTDv01_isError(oneSeqSize)) return oneSeqSize;
1865 op += oneSeqSize;
1866 }
1867
1868 /* check if reached exact end */
1869 if ( !FSE_endOfDStream(&(seqState.DStream)) ) return ERROR(corruption_detected); /* requested too much : data is corrupted */
1870 if (nbSeq<0) return ERROR(corruption_detected); /* requested too many sequences : data is corrupted */
1871
1872 /* last literal segment */
1873 {
1874 size_t lastLLSize = litEnd - litPtr;
1875 if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
1876 if (lastLLSize > 0) {
1877 if (op != litPtr) memmove(op, litPtr, lastLLSize);
1878 op += lastLLSize;
1879 }
1880 }
1881 }
1882
1883 return op-ostart;
1884}
1885
1886
1887static size_t ZSTD_decompressBlock(
1888 void* ctx,
1889 void* dst, size_t maxDstSize,
1890 const void* src, size_t srcSize)
1891{
1892 /* blockType == blockCompressed, srcSize is trusted */
1893 const BYTE* ip = (const BYTE*)src;
1894 const BYTE* litPtr = NULL;
1895 size_t litSize = 0;
1896 size_t errorCode;
1897
1898 /* Decode literals sub-block */
1899 errorCode = ZSTDv01_decodeLiteralsBlock(ctx, dst, maxDstSize, &litPtr, &litSize, src, srcSize);
1900 if (ZSTDv01_isError(errorCode)) return errorCode;
1901 ip += errorCode;
1902 srcSize -= errorCode;
1903
1904 return ZSTD_decompressSequences(ctx, dst, maxDstSize, ip, srcSize, litPtr, litSize);
1905}
1906
1907
1908size_t ZSTDv01_decompressDCtx(void* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1909{
1910 const BYTE* ip = (const BYTE*)src;
1911 const BYTE* iend = ip + srcSize;
1912 BYTE* const ostart = (BYTE* const)dst;
1913 BYTE* op = ostart;
1914 BYTE* const oend = ostart + maxDstSize;
1915 size_t remainingSize = srcSize;
1916 U32 magicNumber;
1917 size_t errorCode=0;
1918 blockProperties_t blockProperties;
1919
1920 /* Frame Header */
1921 if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
1922 magicNumber = ZSTD_readBE32(src);
1923 if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
1924 ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
1925
1926 /* Loop on each block */
1927 while (1)
1928 {
1929 size_t blockSize = ZSTDv01_getcBlockSize(ip, iend-ip, &blockProperties);
1930 if (ZSTDv01_isError(blockSize)) return blockSize;
1931
1932 ip += ZSTD_blockHeaderSize;
1933 remainingSize -= ZSTD_blockHeaderSize;
1934 if (blockSize > remainingSize) return ERROR(srcSize_wrong);
1935
1936 switch(blockProperties.blockType)
1937 {
1938 case bt_compressed:
1939 errorCode = ZSTD_decompressBlock(ctx, op, oend-op, ip, blockSize);
1940 break;
1941 case bt_raw :
1942 errorCode = ZSTD_copyUncompressedBlock(op, oend-op, ip, blockSize);
1943 break;
1944 case bt_rle :
1945 return ERROR(GENERIC); /* not yet supported */
1946 break;
1947 case bt_end :
1948 /* end of frame */
1949 if (remainingSize) return ERROR(srcSize_wrong);
1950 break;
1951 default:
1952 return ERROR(GENERIC);
1953 }
1954 if (blockSize == 0) break; /* bt_end */
1955
1956 if (ZSTDv01_isError(errorCode)) return errorCode;
1957 op += errorCode;
1958 ip += blockSize;
1959 remainingSize -= blockSize;
1960 }
1961
1962 return op-ostart;
1963}
1964
1965size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
1966{
1967 dctx_t ctx;
1968 ctx.base = dst;
1969 return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
1970}
1971
1972/* ZSTD_errorFrameSizeInfoLegacy() :
1973 assumes `cSize` and `dBound` are _not_ NULL */
1974static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
1975{
1976 *cSize = ret;
1977 *dBound = ZSTD_CONTENTSIZE_ERROR;
1978}
1979
1980void ZSTDv01_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
1981{
1982 const BYTE* ip = (const BYTE*)src;
1983 size_t remainingSize = srcSize;
1984 size_t nbBlocks = 0;
1985 U32 magicNumber;
1986 blockProperties_t blockProperties;
1987
1988 /* Frame Header */
1989 if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) {
1990 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
1991 return;
1992 }
1993 magicNumber = ZSTD_readBE32(src);
1994 if (magicNumber != ZSTD_magicNumber) {
1995 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
1996 return;
1997 }
1998 ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
1999
2000 /* Loop on each block */
2001 while (1)
2002 {
2003 size_t blockSize = ZSTDv01_getcBlockSize(ip, remainingSize, &blockProperties);
2004 if (ZSTDv01_isError(blockSize)) {
2005 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, blockSize);
2006 return;
2007 }
2008
2009 ip += ZSTD_blockHeaderSize;
2010 remainingSize -= ZSTD_blockHeaderSize;
2011 if (blockSize > remainingSize) {
2012 ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
2013 return;
2014 }
2015
2016 if (blockSize == 0) break; /* bt_end */
2017
2018 ip += blockSize;
2019 remainingSize -= blockSize;
2020 nbBlocks++;
2021 }
2022
2023 *cSize = ip - (const BYTE*)src;
2024 *dBound = nbBlocks * BLOCKSIZE;
2025}
2026
2027/*******************************
2028* Streaming Decompression API
2029*******************************/
2030
2031size_t ZSTDv01_resetDCtx(ZSTDv01_Dctx* dctx)
2032{
2033 dctx->expected = ZSTD_frameHeaderSize;
2034 dctx->phase = 0;
2035 dctx->previousDstEnd = NULL;
2036 dctx->base = NULL;
2037 return 0;
2038}
2039
2040ZSTDv01_Dctx* ZSTDv01_createDCtx(void)
2041{
2042 ZSTDv01_Dctx* dctx = (ZSTDv01_Dctx*)malloc(sizeof(ZSTDv01_Dctx));
2043 if (dctx==NULL) return NULL;
2044 ZSTDv01_resetDCtx(dctx);
2045 return dctx;
2046}
2047
2048size_t ZSTDv01_freeDCtx(ZSTDv01_Dctx* dctx)
2049{
2050 free(dctx);
2051 return 0;
2052}
2053
2054size_t ZSTDv01_nextSrcSizeToDecompress(ZSTDv01_Dctx* dctx)
2055{
2056 return ((dctx_t*)dctx)->expected;
2057}
2058
2059size_t ZSTDv01_decompressContinue(ZSTDv01_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
2060{
2061 dctx_t* ctx = (dctx_t*)dctx;
2062
2063 /* Sanity check */
2064 if (srcSize != ctx->expected) return ERROR(srcSize_wrong);
2065 if (dst != ctx->previousDstEnd) /* not contiguous */
2066 ctx->base = dst;
2067
2068 /* Decompress : frame header */
2069 if (ctx->phase == 0)
2070 {
2071 /* Check frame magic header */
2072 U32 magicNumber = ZSTD_readBE32(src);
2073 if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
2074 ctx->phase = 1;
2075 ctx->expected = ZSTD_blockHeaderSize;
2076 return 0;
2077 }
2078
2079 /* Decompress : block header */
2080 if (ctx->phase == 1)
2081 {
2082 blockProperties_t bp;
2083 size_t blockSize = ZSTDv01_getcBlockSize(src, ZSTD_blockHeaderSize, &bp);
2084 if (ZSTDv01_isError(blockSize)) return blockSize;
2085 if (bp.blockType == bt_end)
2086 {
2087 ctx->expected = 0;
2088 ctx->phase = 0;
2089 }
2090 else
2091 {
2092 ctx->expected = blockSize;
2093 ctx->bType = bp.blockType;
2094 ctx->phase = 2;
2095 }
2096
2097 return 0;
2098 }
2099
2100 /* Decompress : block content */
2101 {
2102 size_t rSize;
2103 switch(ctx->bType)
2104 {
2105 case bt_compressed:
2106 rSize = ZSTD_decompressBlock(ctx, dst, maxDstSize, src, srcSize);
2107 break;
2108 case bt_raw :
2109 rSize = ZSTD_copyUncompressedBlock(dst, maxDstSize, src, srcSize);
2110 break;
2111 case bt_rle :
2112 return ERROR(GENERIC); /* not yet handled */
2113 break;
2114 case bt_end : /* should never happen (filtered at phase 1) */
2115 rSize = 0;
2116 break;
2117 default:
2118 return ERROR(GENERIC);
2119 }
2120 ctx->phase = 1;
2121 ctx->expected = ZSTD_blockHeaderSize;
f535537f 2122 if (ZSTDv01_isError(rSize)) return rSize;
648db22b 2123 ctx->previousDstEnd = (void*)( ((char*)dst) + rSize);
2124 return rSize;
2125 }
2126
2127}