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