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