extzstd 0.1.1 → 0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/HISTORY.ja.md +18 -0
- data/README.md +15 -50
- data/contrib/zstd/CONTRIBUTING.md +1 -1
- data/contrib/zstd/COPYING +339 -0
- data/contrib/zstd/Makefile +82 -51
- data/contrib/zstd/NEWS +92 -5
- data/contrib/zstd/README.md +50 -41
- data/contrib/zstd/appveyor.yml +164 -102
- data/contrib/zstd/circle.yml +10 -22
- data/contrib/zstd/lib/BUCK +31 -10
- data/contrib/zstd/lib/Makefile +57 -31
- data/contrib/zstd/lib/README.md +68 -37
- data/contrib/zstd/lib/common/bitstream.h +130 -76
- data/contrib/zstd/lib/common/compiler.h +86 -0
- data/contrib/zstd/lib/common/error_private.c +15 -11
- data/contrib/zstd/lib/common/error_private.h +8 -8
- data/contrib/zstd/lib/common/fse.h +19 -9
- data/contrib/zstd/lib/common/fse_decompress.c +3 -22
- data/contrib/zstd/lib/common/huf.h +68 -26
- data/contrib/zstd/lib/common/mem.h +23 -35
- data/contrib/zstd/lib/common/pool.c +123 -63
- data/contrib/zstd/lib/common/pool.h +19 -10
- data/contrib/zstd/lib/common/threading.c +11 -16
- data/contrib/zstd/lib/common/threading.h +52 -33
- data/contrib/zstd/lib/common/xxhash.c +28 -22
- data/contrib/zstd/lib/common/zstd_common.c +40 -27
- data/contrib/zstd/lib/common/zstd_errors.h +43 -34
- data/contrib/zstd/lib/common/zstd_internal.h +131 -123
- data/contrib/zstd/lib/compress/fse_compress.c +17 -33
- data/contrib/zstd/lib/compress/huf_compress.c +15 -9
- data/contrib/zstd/lib/compress/zstd_compress.c +2096 -2363
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +462 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +309 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.h +29 -0
- data/contrib/zstd/lib/compress/zstd_fast.c +243 -0
- data/contrib/zstd/lib/compress/zstd_fast.h +31 -0
- data/contrib/zstd/lib/compress/zstd_lazy.c +765 -0
- data/contrib/zstd/lib/compress/zstd_lazy.h +39 -0
- data/contrib/zstd/lib/compress/zstd_ldm.c +707 -0
- data/contrib/zstd/lib/compress/zstd_ldm.h +68 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +785 -0
- data/contrib/zstd/lib/compress/zstd_opt.h +19 -908
- data/contrib/zstd/lib/compress/zstdmt_compress.c +737 -327
- data/contrib/zstd/lib/compress/zstdmt_compress.h +88 -26
- data/contrib/zstd/lib/decompress/huf_decompress.c +158 -50
- data/contrib/zstd/lib/decompress/zstd_decompress.c +884 -699
- data/contrib/zstd/lib/deprecated/zbuff.h +5 -4
- data/contrib/zstd/lib/deprecated/zbuff_common.c +5 -5
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +6 -4
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +5 -4
- data/contrib/zstd/lib/dictBuilder/cover.c +93 -77
- data/contrib/zstd/lib/dictBuilder/zdict.c +107 -92
- data/contrib/zstd/lib/dictBuilder/zdict.h +112 -102
- data/contrib/zstd/lib/legacy/zstd_legacy.h +9 -4
- data/contrib/zstd/lib/legacy/zstd_v01.c +7 -6
- data/contrib/zstd/lib/legacy/zstd_v01.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v02.c +27 -99
- data/contrib/zstd/lib/legacy/zstd_v02.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v03.c +26 -98
- data/contrib/zstd/lib/legacy/zstd_v03.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v04.c +22 -91
- data/contrib/zstd/lib/legacy/zstd_v04.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v05.c +23 -99
- data/contrib/zstd/lib/legacy/zstd_v05.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v06.c +22 -96
- data/contrib/zstd/lib/legacy/zstd_v06.h +5 -4
- data/contrib/zstd/lib/legacy/zstd_v07.c +19 -95
- data/contrib/zstd/lib/legacy/zstd_v07.h +5 -4
- data/contrib/zstd/lib/zstd.h +895 -271
- data/ext/extconf.rb +11 -2
- data/ext/extzstd.c +45 -128
- data/ext/extzstd.h +74 -31
- data/ext/extzstd_stream.c +401 -142
- data/ext/zstd_common.c +5 -0
- data/ext/zstd_compress.c +8 -0
- data/ext/zstd_decompress.c +1 -0
- data/ext/zstd_dictbuilder.c +2 -0
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +48 -1
- data/test/test_basic.rb +9 -1
- metadata +17 -7
- data/HISTORY.ja +0 -10
- data/contrib/zstd/LICENSE-examples +0 -11
- data/contrib/zstd/PATENTS +0 -33
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
|
|
@@ -331,17 +332,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
|
331
332
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
|
332
333
|
|
|
333
334
|
|
|
334
|
-
/*
|
|
335
|
-
* Start by invoking BIT_initDStream().
|
|
336
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
337
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
338
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
339
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
|
340
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
|
341
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
342
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
|
343
|
-
*/
|
|
344
|
-
|
|
345
335
|
|
|
346
336
|
/******************************************
|
|
347
337
|
* unsafe API
|
|
@@ -354,7 +344,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
|
354
344
|
/****************************************************************
|
|
355
345
|
* Helper functions
|
|
356
346
|
****************************************************************/
|
|
357
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
|
347
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
358
348
|
{
|
|
359
349
|
# if defined(_MSC_VER) /* Visual */
|
|
360
350
|
unsigned long r=0;
|
|
@@ -427,14 +417,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
427
417
|
|
|
428
418
|
return srcSize;
|
|
429
419
|
}
|
|
430
|
-
|
|
431
|
-
/*!BIT_lookBits
|
|
432
|
-
* Provides next n bits from local register
|
|
433
|
-
* local register is not modified (bits are still present for next read/look)
|
|
434
|
-
* On 32-bits, maxNbBits==25
|
|
435
|
-
* On 64-bits, maxNbBits==57
|
|
436
|
-
* @return : value extracted
|
|
437
|
-
*/
|
|
438
420
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
439
421
|
{
|
|
440
422
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -454,11 +436,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
454
436
|
bitD->bitsConsumed += nbBits;
|
|
455
437
|
}
|
|
456
438
|
|
|
457
|
-
/*!BIT_readBits
|
|
458
|
-
* Read next n bits from local register.
|
|
459
|
-
* pay attention to not read more than nbBits contained into local register.
|
|
460
|
-
* @return : extracted value.
|
|
461
|
-
*/
|
|
462
439
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
463
440
|
{
|
|
464
441
|
size_t value = BIT_lookBits(bitD, nbBits);
|
|
@@ -477,8 +454,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
477
454
|
|
|
478
455
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|
479
456
|
{
|
|
480
|
-
|
|
481
|
-
|
|
457
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
458
|
+
return BIT_DStream_overflow;
|
|
482
459
|
|
|
483
460
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
|
|
484
461
|
{
|
|
@@ -696,55 +673,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
|
696
673
|
|
|
697
674
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
|
698
675
|
|
|
699
|
-
/*
|
|
700
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
|
701
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
702
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
703
|
-
|
|
704
|
-
You will need a few variables to track your bitStream. They are :
|
|
705
|
-
|
|
706
|
-
BIT_DStream_t DStream; // Stream context
|
|
707
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
|
708
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
|
709
|
-
|
|
710
|
-
The first thing to do is to init the bitStream.
|
|
711
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
|
712
|
-
|
|
713
|
-
You should then retrieve your initial state(s)
|
|
714
|
-
(in reverse flushing order if you have several ones) :
|
|
715
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
|
716
|
-
|
|
717
|
-
You can then decode your data, symbol after symbol.
|
|
718
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
|
719
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
720
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
|
721
|
-
|
|
722
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
723
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
724
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
|
725
|
-
|
|
726
|
-
All above operations only read from local register (which size depends on size_t).
|
|
727
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
728
|
-
endSignal = FSE_reloadDStream(&DStream);
|
|
729
|
-
|
|
730
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
731
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
|
732
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
733
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
734
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
735
|
-
|
|
736
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
737
|
-
to properly detect the exact end of stream.
|
|
738
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
739
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
|
740
|
-
|
|
741
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
742
|
-
Checking if DStream has reached its end is performed by :
|
|
743
|
-
BIT_endOfDStream(&DStream);
|
|
744
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
745
|
-
FSE_endOfDState(&DState);
|
|
746
|
-
*/
|
|
747
|
-
|
|
748
676
|
|
|
749
677
|
/******************************************
|
|
750
678
|
* FSE unsafe API
|
|
@@ -1335,8 +1263,8 @@ static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsi
|
|
|
1335
1263
|
else
|
|
1336
1264
|
{
|
|
1337
1265
|
bitCount -= (int)(8 * (iend - 4 - ip));
|
|
1338
|
-
|
|
1339
|
-
|
|
1266
|
+
ip = iend - 4;
|
|
1267
|
+
}
|
|
1340
1268
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
|
1341
1269
|
}
|
|
1342
1270
|
}
|
|
@@ -2037,7 +1965,7 @@ static size_t HUF_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2037
1965
|
rankStart[0] = 0; /* forget 0w symbols; this is beginning of weight(1) */
|
|
2038
1966
|
}
|
|
2039
1967
|
|
|
2040
|
-
|
|
1968
|
+
/* Build rankVal */
|
|
2041
1969
|
{
|
|
2042
1970
|
const U32 minBits = tableLog+1 - maxW;
|
|
2043
1971
|
U32 nextRankVal = 0;
|
|
@@ -2589,14 +2517,14 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|
|
2589
2517
|
const size_t litSize = (MEM_readLE32(istart) & 0xFFFFFF) >> 2; /* no buffer issue : srcSize >= MIN_CBLOCK_SIZE */
|
|
2590
2518
|
if (litSize > srcSize-11) /* risk of reading too far with wildcopy */
|
|
2591
2519
|
{
|
|
2592
|
-
|
|
2593
|
-
|
|
2594
|
-
|
|
2595
|
-
|
|
2596
|
-
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
|
|
2520
|
+
if (litSize > srcSize-3) return ERROR(corruption_detected);
|
|
2521
|
+
memcpy(dctx->litBuffer, istart, litSize);
|
|
2522
|
+
dctx->litPtr = dctx->litBuffer;
|
|
2523
|
+
dctx->litSize = litSize;
|
|
2524
|
+
memset(dctx->litBuffer + dctx->litSize, 0, 8);
|
|
2525
|
+
return litSize+3;
|
|
2526
|
+
}
|
|
2527
|
+
/* direct reference into compressed stream */
|
|
2600
2528
|
dctx->litPtr = istart+3;
|
|
2601
2529
|
dctx->litSize = litSize;
|
|
2602
2530
|
return litSize+3;
|
|
@@ -3156,13 +3084,13 @@ static size_t ZSTD_decompressContinue(ZSTD_DCtx* ctx, void* dst, size_t maxDstSi
|
|
|
3156
3084
|
|
|
3157
3085
|
unsigned ZSTDv03_isError(size_t code)
|
|
3158
3086
|
{
|
|
3159
|
-
|
|
3087
|
+
return ZSTD_isError(code);
|
|
3160
3088
|
}
|
|
3161
3089
|
|
|
3162
3090
|
size_t ZSTDv03_decompress( void* dst, size_t maxOriginalSize,
|
|
3163
3091
|
const void* src, size_t compressedSize)
|
|
3164
3092
|
{
|
|
3165
|
-
|
|
3093
|
+
return ZSTD_decompress(dst, maxOriginalSize, src, compressedSize);
|
|
3166
3094
|
}
|
|
3167
3095
|
|
|
3168
3096
|
size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t srcSize)
|
|
@@ -3172,25 +3100,25 @@ size_t ZSTDv03_findFrameCompressedSize(const void* src, size_t srcSize)
|
|
|
3172
3100
|
|
|
3173
3101
|
ZSTDv03_Dctx* ZSTDv03_createDCtx(void)
|
|
3174
3102
|
{
|
|
3175
|
-
|
|
3103
|
+
return (ZSTDv03_Dctx*)ZSTD_createDCtx();
|
|
3176
3104
|
}
|
|
3177
3105
|
|
|
3178
3106
|
size_t ZSTDv03_freeDCtx(ZSTDv03_Dctx* dctx)
|
|
3179
3107
|
{
|
|
3180
|
-
|
|
3108
|
+
return ZSTD_freeDCtx((ZSTD_DCtx*)dctx);
|
|
3181
3109
|
}
|
|
3182
3110
|
|
|
3183
3111
|
size_t ZSTDv03_resetDCtx(ZSTDv03_Dctx* dctx)
|
|
3184
3112
|
{
|
|
3185
|
-
|
|
3113
|
+
return ZSTD_resetDCtx((ZSTD_DCtx*)dctx);
|
|
3186
3114
|
}
|
|
3187
3115
|
|
|
3188
3116
|
size_t ZSTDv03_nextSrcSizeToDecompress(ZSTDv03_Dctx* dctx)
|
|
3189
3117
|
{
|
|
3190
|
-
|
|
3118
|
+
return ZSTD_nextSrcSizeToDecompress((ZSTD_DCtx*)dctx);
|
|
3191
3119
|
}
|
|
3192
3120
|
|
|
3193
3121
|
size_t ZSTDv03_decompressContinue(ZSTDv03_Dctx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
|
3194
3122
|
{
|
|
3195
|
-
|
|
3123
|
+
return ZSTD_decompressContinue((ZSTD_DCtx*)dctx, dst, maxDstSize, src, srcSize);
|
|
3196
3124
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTD_V03_H_298734209782
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
|
|
@@ -737,16 +738,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
|
737
738
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
|
738
739
|
|
|
739
740
|
|
|
740
|
-
/*
|
|
741
|
-
* Start by invoking BIT_initDStream().
|
|
742
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
743
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
744
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
745
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
|
746
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
|
747
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
748
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
|
749
|
-
*/
|
|
750
741
|
|
|
751
742
|
|
|
752
743
|
/******************************************
|
|
@@ -760,7 +751,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
|
760
751
|
/****************************************************************
|
|
761
752
|
* Helper functions
|
|
762
753
|
****************************************************************/
|
|
763
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
|
754
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
|
764
755
|
{
|
|
765
756
|
# if defined(_MSC_VER) /* Visual */
|
|
766
757
|
unsigned long r=0;
|
|
@@ -816,13 +807,13 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
816
807
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
817
808
|
switch(srcSize)
|
|
818
809
|
{
|
|
819
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16)
|
|
820
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24)
|
|
821
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32)
|
|
822
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24;
|
|
823
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16;
|
|
824
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8;
|
|
825
|
-
default
|
|
810
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[6]) << (sizeof(size_t)*8 - 16);/* fall-through */
|
|
811
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[5]) << (sizeof(size_t)*8 - 24);/* fall-through */
|
|
812
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[4]) << (sizeof(size_t)*8 - 32);/* fall-through */
|
|
813
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[3]) << 24; /* fall-through */
|
|
814
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[2]) << 16; /* fall-through */
|
|
815
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(bitD->start))[1]) << 8; /* fall-through */
|
|
816
|
+
default: break;
|
|
826
817
|
}
|
|
827
818
|
contain32 = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
828
819
|
if (contain32 == 0) return ERROR(GENERIC); /* endMark not present */
|
|
@@ -833,13 +824,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
|
833
824
|
return srcSize;
|
|
834
825
|
}
|
|
835
826
|
|
|
836
|
-
/*!BIT_lookBits
|
|
837
|
-
* Provides next n bits from local register
|
|
838
|
-
* local register is not modified (bits are still present for next read/look)
|
|
839
|
-
* On 32-bits, maxNbBits==25
|
|
840
|
-
* On 64-bits, maxNbBits==57
|
|
841
|
-
* @return : value extracted
|
|
842
|
-
*/
|
|
843
827
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
844
828
|
{
|
|
845
829
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -859,11 +843,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
859
843
|
bitD->bitsConsumed += nbBits;
|
|
860
844
|
}
|
|
861
845
|
|
|
862
|
-
/*!BIT_readBits
|
|
863
|
-
* Read next n bits from local register.
|
|
864
|
-
* pay attention to not read more than nbBits contained into local register.
|
|
865
|
-
* @return : extracted value.
|
|
866
|
-
*/
|
|
867
846
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
868
847
|
{
|
|
869
848
|
size_t value = BIT_lookBits(bitD, nbBits);
|
|
@@ -882,8 +861,8 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|
|
882
861
|
|
|
883
862
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|
884
863
|
{
|
|
885
|
-
|
|
886
|
-
|
|
864
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
865
|
+
return BIT_DStream_overflow;
|
|
887
866
|
|
|
888
867
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer))
|
|
889
868
|
{
|
|
@@ -1010,55 +989,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
|
1010
989
|
|
|
1011
990
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
|
1012
991
|
|
|
1013
|
-
/*!
|
|
1014
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
|
1015
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
1016
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
1017
|
-
|
|
1018
|
-
You will need a few variables to track your bitStream. They are :
|
|
1019
|
-
|
|
1020
|
-
BIT_DStream_t DStream; // Stream context
|
|
1021
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
|
1022
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
|
1023
|
-
|
|
1024
|
-
The first thing to do is to init the bitStream.
|
|
1025
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
|
1026
|
-
|
|
1027
|
-
You should then retrieve your initial state(s)
|
|
1028
|
-
(in reverse flushing order if you have several ones) :
|
|
1029
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
|
1030
|
-
|
|
1031
|
-
You can then decode your data, symbol after symbol.
|
|
1032
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
|
1033
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
1034
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
|
1035
|
-
|
|
1036
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
1037
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
1038
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
|
1039
|
-
|
|
1040
|
-
All above operations only read from local register (which size depends on size_t).
|
|
1041
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
1042
|
-
endSignal = FSE_reloadDStream(&DStream);
|
|
1043
|
-
|
|
1044
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
1045
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
|
1046
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
1047
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
1048
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
1049
|
-
|
|
1050
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
1051
|
-
to properly detect the exact end of stream.
|
|
1052
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
1053
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
|
1054
|
-
|
|
1055
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
1056
|
-
Checking if DStream has reached its end is performed by :
|
|
1057
|
-
BIT_endOfDStream(&DStream);
|
|
1058
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
1059
|
-
FSE_endOfDState(&DState);
|
|
1060
|
-
*/
|
|
1061
|
-
|
|
1062
992
|
|
|
1063
993
|
/* *****************************************
|
|
1064
994
|
* FSE unsafe API
|
|
@@ -1451,8 +1381,8 @@ static size_t FSE_readNCount (short* normalizedCounter, unsigned* maxSVPtr, unsi
|
|
|
1451
1381
|
else
|
|
1452
1382
|
{
|
|
1453
1383
|
bitCount -= (int)(8 * (iend - 4 - ip));
|
|
1454
|
-
|
|
1455
|
-
|
|
1384
|
+
ip = iend - 4;
|
|
1385
|
+
}
|
|
1456
1386
|
bitStream = MEM_readLE32(ip) >> (bitCount & 31);
|
|
1457
1387
|
}
|
|
1458
1388
|
}
|
|
@@ -2776,7 +2706,7 @@ static size_t ZSTD_decodeFrameHeader_Part2(ZSTD_DCtx* zc, const void* src, size_
|
|
|
2776
2706
|
size_t result;
|
|
2777
2707
|
if (srcSize != zc->headerSize) return ERROR(srcSize_wrong);
|
|
2778
2708
|
result = ZSTD_getFrameParams(&(zc->params), src, srcSize);
|
|
2779
|
-
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(
|
|
2709
|
+
if ((MEM_32bits()) && (zc->params.windowLog > 25)) return ERROR(frameParameter_unsupported);
|
|
2780
2710
|
return result;
|
|
2781
2711
|
}
|
|
2782
2712
|
|
|
@@ -3665,7 +3595,7 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3665
3595
|
break;
|
|
3666
3596
|
}
|
|
3667
3597
|
zbc->stage = ZBUFFds_read;
|
|
3668
|
-
|
|
3598
|
+
/* fall-through */
|
|
3669
3599
|
case ZBUFFds_read:
|
|
3670
3600
|
{
|
|
3671
3601
|
size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -3691,7 +3621,7 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3691
3621
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
3692
3622
|
zbc->stage = ZBUFFds_load;
|
|
3693
3623
|
}
|
|
3694
|
-
|
|
3624
|
+
/* fall-through */
|
|
3695
3625
|
case ZBUFFds_load:
|
|
3696
3626
|
{
|
|
3697
3627
|
size_t neededInSize = ZSTD_nextSrcSizeToDecompress(zbc->zc);
|
|
@@ -3711,9 +3641,10 @@ static size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDs
|
|
|
3711
3641
|
if (!decodedSize) { zbc->stage = ZBUFFds_read; break; } /* this was just a header */
|
|
3712
3642
|
zbc->outEnd = zbc->outStart + decodedSize;
|
|
3713
3643
|
zbc->stage = ZBUFFds_flush;
|
|
3714
|
-
|
|
3644
|
+
/* ZBUFFds_flush follows */
|
|
3715
3645
|
}
|
|
3716
3646
|
}
|
|
3647
|
+
/* fall-through */
|
|
3717
3648
|
case ZBUFFds_flush:
|
|
3718
3649
|
{
|
|
3719
3650
|
size_t toFlushSize = zbc->outEnd - zbc->outStart;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/*
|
|
2
2
|
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
4
|
*
|
|
5
|
-
* This source code is licensed under the BSD-style license found in the
|
|
6
|
-
* LICENSE file in the root directory of this source tree
|
|
7
|
-
*
|
|
5
|
+
* This source code is licensed under both the BSD-style license (found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree) and the GPLv2 (found
|
|
7
|
+
* in the COPYING file in the root directory of this source tree).
|
|
8
|
+
* You may select, at your option, one of the above-listed licenses.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTD_V04_H_91868324769238
|