zstd-ruby 1.3.2.0 → 1.3.3.0
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 +4 -4
- data/README.md +1 -1
- data/ext/zstdruby/libzstd/BUCK +31 -10
- data/ext/zstdruby/libzstd/common/bitstream.h +1 -1
- data/ext/zstdruby/libzstd/common/mem.h +15 -13
- data/ext/zstdruby/libzstd/common/pool.c +1 -2
- data/ext/zstdruby/libzstd/common/zstd_common.c +10 -4
- data/ext/zstdruby/libzstd/common/zstd_internal.h +52 -170
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +434 -337
- data/ext/zstdruby/libzstd/compress/{zstd_compress.h → zstd_compress_internal.h} +191 -36
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +1 -0
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +1 -0
- data/ext/zstdruby/libzstd/compress/zstd_fast.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +66 -50
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_ldm.h +3 -2
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +504 -676
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +2 -2
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +130 -80
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +15 -7
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +41 -31
- data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -0
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v01.c +1 -1
- data/ext/zstdruby/libzstd/legacy/zstd_v02.c +1 -74
- data/ext/zstdruby/libzstd/legacy/zstd_v03.c +1 -74
- data/ext/zstdruby/libzstd/legacy/zstd_v04.c +1 -72
- data/ext/zstdruby/libzstd/legacy/zstd_v05.c +1 -73
- data/ext/zstdruby/libzstd/legacy/zstd_v06.c +1 -77
- data/ext/zstdruby/libzstd/legacy/zstd_v07.c +1 -77
- data/ext/zstdruby/libzstd/zstd.h +43 -30
- data/lib/zstd-ruby/version.rb +1 -1
- metadata +4 -4
@@ -827,9 +827,9 @@ typedef struct {
|
|
827
827
|
FSE_DState_t stateOffb;
|
828
828
|
FSE_DState_t stateML;
|
829
829
|
size_t prevOffset[ZSTD_REP_NUM];
|
830
|
-
const BYTE*
|
830
|
+
const BYTE* prefixStart;
|
831
|
+
const BYTE* dictEnd;
|
831
832
|
size_t pos;
|
832
|
-
uPtrDiff gotoDict;
|
833
833
|
} seqState_t;
|
834
834
|
|
835
835
|
|
@@ -1224,8 +1224,9 @@ seq_t ZSTD_decodeSequenceLong(seqState_t* seqState, ZSTD_longOffset_e const long
|
|
1224
1224
|
BIT_reloadDStream(&seqState->DStream);
|
1225
1225
|
|
1226
1226
|
{ size_t const pos = seqState->pos + seq.litLength;
|
1227
|
-
|
1228
|
-
|
1227
|
+
const BYTE* const matchBase = (seq.offset > pos) ? seqState->dictEnd : seqState->prefixStart;
|
1228
|
+
seq.match = matchBase + pos - seq.offset; /* note : this operation can overflow when seq.offset is really too large, which can only happen when input is corrupted.
|
1229
|
+
* No consequence though : no memory access will occur, overly large offset will be detected in ZSTD_execSequenceLong() */
|
1229
1230
|
seqState->pos = pos + seq.matchLength;
|
1230
1231
|
}
|
1231
1232
|
|
@@ -1243,7 +1244,7 @@ HINT_INLINE
|
|
1243
1244
|
size_t ZSTD_execSequenceLong(BYTE* op,
|
1244
1245
|
BYTE* const oend, seq_t sequence,
|
1245
1246
|
const BYTE** litPtr, const BYTE* const litLimit,
|
1246
|
-
const BYTE* const
|
1247
|
+
const BYTE* const prefixStart, const BYTE* const dictStart, const BYTE* const dictEnd)
|
1247
1248
|
{
|
1248
1249
|
BYTE* const oLitEnd = op + sequence.litLength;
|
1249
1250
|
size_t const sequenceLength = sequence.litLength + sequence.matchLength;
|
@@ -1253,21 +1254,21 @@ size_t ZSTD_execSequenceLong(BYTE* op,
|
|
1253
1254
|
const BYTE* match = sequence.match;
|
1254
1255
|
|
1255
1256
|
/* check */
|
1256
|
-
if (oMatchEnd>oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
|
1257
|
+
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
|
1257
1258
|
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
1258
|
-
if (oLitEnd>oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit,
|
1259
|
+
if (oLitEnd > oend_w) return ZSTD_execSequenceLast7(op, oend, sequence, litPtr, litLimit, prefixStart, dictStart, dictEnd);
|
1259
1260
|
|
1260
1261
|
/* copy Literals */
|
1261
|
-
ZSTD_copy8(op, *litPtr);
|
1262
|
+
ZSTD_copy8(op, *litPtr); /* note : op <= oLitEnd <= oend_w == oend - 8 */
|
1262
1263
|
if (sequence.litLength > 8)
|
1263
1264
|
ZSTD_wildcopy(op+8, (*litPtr)+8, sequence.litLength - 8); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
|
1264
1265
|
op = oLitEnd;
|
1265
1266
|
*litPtr = iLitEnd; /* update for next sequence */
|
1266
1267
|
|
1267
1268
|
/* copy Match */
|
1268
|
-
if (sequence.offset > (size_t)(oLitEnd -
|
1269
|
+
if (sequence.offset > (size_t)(oLitEnd - prefixStart)) {
|
1269
1270
|
/* offset beyond prefix */
|
1270
|
-
if (sequence.offset > (size_t)(oLitEnd -
|
1271
|
+
if (sequence.offset > (size_t)(oLitEnd - dictStart)) return ERROR(corruption_detected);
|
1271
1272
|
if (match + sequence.matchLength <= dictEnd) {
|
1272
1273
|
memmove(oLitEnd, match, sequence.matchLength);
|
1273
1274
|
return sequenceLength;
|
@@ -1277,7 +1278,7 @@ size_t ZSTD_execSequenceLong(BYTE* op,
|
|
1277
1278
|
memmove(oLitEnd, match, length1);
|
1278
1279
|
op = oLitEnd + length1;
|
1279
1280
|
sequence.matchLength -= length1;
|
1280
|
-
match =
|
1281
|
+
match = prefixStart;
|
1281
1282
|
if (op > oend_w || sequence.matchLength < MINMATCH) {
|
1282
1283
|
U32 i;
|
1283
1284
|
for (i = 0; i < sequence.matchLength; ++i) op[i] = match[i];
|
@@ -1331,8 +1332,8 @@ static size_t ZSTD_decompressSequencesLong(
|
|
1331
1332
|
BYTE* op = ostart;
|
1332
1333
|
const BYTE* litPtr = dctx->litPtr;
|
1333
1334
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
1334
|
-
const BYTE* const
|
1335
|
-
const BYTE* const
|
1335
|
+
const BYTE* const prefixStart = (const BYTE*) (dctx->base);
|
1336
|
+
const BYTE* const dictStart = (const BYTE*) (dctx->vBase);
|
1336
1337
|
const BYTE* const dictEnd = (const BYTE*) (dctx->dictEnd);
|
1337
1338
|
int nbSeq;
|
1338
1339
|
|
@@ -1353,9 +1354,9 @@ static size_t ZSTD_decompressSequencesLong(
|
|
1353
1354
|
int seqNb;
|
1354
1355
|
dctx->fseEntropy = 1;
|
1355
1356
|
{ U32 i; for (i=0; i<ZSTD_REP_NUM; i++) seqState.prevOffset[i] = dctx->entropy.rep[i]; }
|
1356
|
-
seqState.
|
1357
|
-
seqState.pos = (size_t)(op-
|
1358
|
-
seqState.
|
1357
|
+
seqState.prefixStart = prefixStart;
|
1358
|
+
seqState.pos = (size_t)(op-prefixStart);
|
1359
|
+
seqState.dictEnd = dictEnd;
|
1359
1360
|
CHECK_E(BIT_initDStream(&seqState.DStream, ip, iend-ip), corruption_detected);
|
1360
1361
|
FSE_initDState(&seqState.stateLL, &seqState.DStream, dctx->LLTptr);
|
1361
1362
|
FSE_initDState(&seqState.stateOffb, &seqState.DStream, dctx->OFTptr);
|
@@ -1370,9 +1371,9 @@ static size_t ZSTD_decompressSequencesLong(
|
|
1370
1371
|
/* decode and decompress */
|
1371
1372
|
for ( ; (BIT_reloadDStream(&(seqState.DStream)) <= BIT_DStream_completed) && seqNb<nbSeq ; seqNb++) {
|
1372
1373
|
seq_t const sequence = ZSTD_decodeSequenceLong(&seqState, isLongOffset);
|
1373
|
-
size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd,
|
1374
|
+
size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[(seqNb-ADVANCED_SEQS) & STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
1374
1375
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
1375
|
-
PREFETCH(sequence.match);
|
1376
|
+
PREFETCH(sequence.match); /* note : it's safe to invoke PREFETCH() on any memory address, including invalid ones */
|
1376
1377
|
sequences[seqNb&STOSEQ_MASK] = sequence;
|
1377
1378
|
op += oneSeqSize;
|
1378
1379
|
}
|
@@ -1381,7 +1382,7 @@ static size_t ZSTD_decompressSequencesLong(
|
|
1381
1382
|
/* finish queue */
|
1382
1383
|
seqNb -= seqAdvance;
|
1383
1384
|
for ( ; seqNb<nbSeq ; seqNb++) {
|
1384
|
-
size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd,
|
1385
|
+
size_t const oneSeqSize = ZSTD_execSequenceLong(op, oend, sequences[seqNb&STOSEQ_MASK], &litPtr, litEnd, prefixStart, dictStart, dictEnd);
|
1385
1386
|
if (ZSTD_isError(oneSeqSize)) return oneSeqSize;
|
1386
1387
|
op += oneSeqSize;
|
1387
1388
|
}
|
@@ -2450,14 +2451,16 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2450
2451
|
return ZSTD_decompressLegacyStream(zds->legacyContext, legacyVersion, output, input);
|
2451
2452
|
}
|
2452
2453
|
#endif
|
2453
|
-
return hSize;
|
2454
|
+
return hSize; /* error */
|
2454
2455
|
}
|
2455
2456
|
if (hSize != 0) { /* need more input */
|
2456
2457
|
size_t const toLoad = hSize - zds->lhSize; /* if hSize!=0, hSize > zds->lhSize */
|
2457
|
-
|
2458
|
-
|
2459
|
-
|
2460
|
-
|
2458
|
+
size_t const remainingInput = (size_t)(iend-ip);
|
2459
|
+
assert(iend >= ip);
|
2460
|
+
if (toLoad > remainingInput) { /* not enough input to load full header */
|
2461
|
+
if (remainingInput > 0) {
|
2462
|
+
memcpy(zds->headerBuffer + zds->lhSize, ip, remainingInput);
|
2463
|
+
zds->lhSize += remainingInput;
|
2461
2464
|
}
|
2462
2465
|
input->pos = input->size;
|
2463
2466
|
return (MAX(ZSTD_frameHeaderSize_min, hSize) - zds->lhSize) + ZSTD_blockHeaderSize; /* remaining header bytes + next block header */
|
@@ -2472,8 +2475,10 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2472
2475
|
&& (U64)(size_t)(oend-op) >= zds->fParams.frameContentSize) {
|
2473
2476
|
size_t const cSize = ZSTD_findFrameCompressedSize(istart, iend-istart);
|
2474
2477
|
if (cSize <= (size_t)(iend-istart)) {
|
2478
|
+
/* shortcut : using single-pass mode */
|
2475
2479
|
size_t const decompressedSize = ZSTD_decompress_usingDDict(zds, op, oend-op, istart, cSize, zds->ddict);
|
2476
2480
|
if (ZSTD_isError(decompressedSize)) return decompressedSize;
|
2481
|
+
DEBUGLOG(4, "shortcut to single-pass ZSTD_decompress_usingDDict()")
|
2477
2482
|
ip = istart + cSize;
|
2478
2483
|
op += decompressedSize;
|
2479
2484
|
zds->expected = 0;
|
@@ -2496,8 +2501,9 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2496
2501
|
}
|
2497
2502
|
|
2498
2503
|
/* control buffer memory usage */
|
2499
|
-
DEBUGLOG(4, "Control max
|
2500
|
-
(U32)(zds->
|
2504
|
+
DEBUGLOG(4, "Control max memory usage (%u KB <= max %u KB)",
|
2505
|
+
(U32)(zds->fParams.windowSize >>10),
|
2506
|
+
(U32)(zds->maxWindowSize >> 10) );
|
2501
2507
|
zds->fParams.windowSize = MAX(zds->fParams.windowSize, 1U << ZSTD_WINDOWLOG_ABSOLUTEMIN);
|
2502
2508
|
if (zds->fParams.windowSize > zds->maxWindowSize) return ERROR(frameParameter_windowTooLarge);
|
2503
2509
|
|
@@ -2555,17 +2561,21 @@ size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inB
|
|
2555
2561
|
/* fall-through */
|
2556
2562
|
case zdss_load:
|
2557
2563
|
{ size_t const neededInSize = ZSTD_nextSrcSizeToDecompress(zds);
|
2558
|
-
size_t const toLoad = neededInSize - zds->inPos;
|
2564
|
+
size_t const toLoad = neededInSize - zds->inPos;
|
2565
|
+
int const isSkipFrame = ZSTD_isSkipFrame(zds);
|
2559
2566
|
size_t loadedSize;
|
2560
|
-
if (
|
2561
|
-
|
2567
|
+
if (isSkipFrame) {
|
2568
|
+
loadedSize = MIN(toLoad, (size_t)(iend-ip));
|
2569
|
+
} else {
|
2570
|
+
if (toLoad > zds->inBuffSize - zds->inPos) return ERROR(corruption_detected); /* should never happen */
|
2571
|
+
loadedSize = ZSTD_limitCopy(zds->inBuff + zds->inPos, toLoad, ip, iend-ip);
|
2572
|
+
}
|
2562
2573
|
ip += loadedSize;
|
2563
2574
|
zds->inPos += loadedSize;
|
2564
2575
|
if (loadedSize < toLoad) { someMoreWork = 0; break; } /* not enough input, wait for more */
|
2565
2576
|
|
2566
2577
|
/* decode loaded input */
|
2567
|
-
{
|
2568
|
-
size_t const decodedSize = ZSTD_decompressContinue(zds,
|
2578
|
+
{ size_t const decodedSize = ZSTD_decompressContinue(zds,
|
2569
2579
|
zds->outBuff + zds->outStart, zds->outBuffSize - zds->outStart,
|
2570
2580
|
zds->inBuff, neededInSize);
|
2571
2581
|
if (ZSTD_isError(decodedSize)) return decodedSize;
|
@@ -72,6 +72,7 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
|
|
72
72
|
const void* dict, size_t dictSize,
|
73
73
|
ZSTD_parameters params, unsigned long long pledgedSrcSize)
|
74
74
|
{
|
75
|
+
if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* preserve "0 == unknown" behavior */
|
75
76
|
return ZSTD_initCStream_advanced(zbc, dict, dictSize, params, pledgedSrcSize);
|
76
77
|
}
|
77
78
|
|
@@ -103,7 +103,7 @@ unsigned ZDICT_getDictID(const void* dictBuffer, size_t dictSize)
|
|
103
103
|
/*-********************************************************
|
104
104
|
* Dictionary training functions
|
105
105
|
**********************************************************/
|
106
|
-
static unsigned ZDICT_NbCommonBytes (
|
106
|
+
static unsigned ZDICT_NbCommonBytes (size_t val)
|
107
107
|
{
|
108
108
|
if (MEM_isLittleEndian()) {
|
109
109
|
if (MEM_64bits()) {
|
@@ -339,7 +339,7 @@ typedef U32 DTable_max_t[FSE_DTABLE_SIZE_U32(FSE_MAX_TABLELOG)];
|
|
339
339
|
/****************************************************************
|
340
340
|
* Internal functions
|
341
341
|
****************************************************************/
|
342
|
-
FORCE_INLINE unsigned FSE_highbit32 (
|
342
|
+
FORCE_INLINE unsigned FSE_highbit32 (U32 val)
|
343
343
|
{
|
344
344
|
# if defined(_MSC_VER) /* Visual */
|
345
345
|
unsigned long r;
|
@@ -330,18 +330,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
330
330
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
331
331
|
|
332
332
|
|
333
|
-
/*
|
334
|
-
* Start by invoking BIT_initDStream().
|
335
|
-
* A chunk of the bitStream is then stored into a local register.
|
336
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
337
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
338
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
339
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
340
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
341
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
342
|
-
*/
|
343
|
-
|
344
|
-
|
345
333
|
/******************************************
|
346
334
|
* unsafe API
|
347
335
|
******************************************/
|
@@ -353,7 +341,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
353
341
|
/****************************************************************
|
354
342
|
* Helper functions
|
355
343
|
****************************************************************/
|
356
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
344
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
357
345
|
{
|
358
346
|
# if defined(_MSC_VER) /* Visual */
|
359
347
|
unsigned long r=0;
|
@@ -427,13 +415,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
427
415
|
return srcSize;
|
428
416
|
}
|
429
417
|
|
430
|
-
/*!BIT_lookBits
|
431
|
-
* Provides next n bits from local register
|
432
|
-
* local register is not modified (bits are still present for next read/look)
|
433
|
-
* On 32-bits, maxNbBits==25
|
434
|
-
* On 64-bits, maxNbBits==57
|
435
|
-
* @return : value extracted
|
436
|
-
*/
|
437
418
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
438
419
|
{
|
439
420
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -453,11 +434,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
453
434
|
bitD->bitsConsumed += nbBits;
|
454
435
|
}
|
455
436
|
|
456
|
-
/*!BIT_readBits
|
457
|
-
* Read next n bits from local register.
|
458
|
-
* pay attention to not read more than nbBits contained into local register.
|
459
|
-
* @return : extracted value.
|
460
|
-
*/
|
461
437
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
462
438
|
{
|
463
439
|
size_t value = BIT_lookBits(bitD, nbBits);
|
@@ -695,55 +671,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
695
671
|
|
696
672
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
697
673
|
|
698
|
-
/*
|
699
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
700
|
-
You will decode FSE-encoded symbols from the bitStream,
|
701
|
-
and also any other bitFields you put in, **in reverse order**.
|
702
|
-
|
703
|
-
You will need a few variables to track your bitStream. They are :
|
704
|
-
|
705
|
-
BIT_DStream_t DStream; // Stream context
|
706
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
707
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
708
|
-
|
709
|
-
The first thing to do is to init the bitStream.
|
710
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
711
|
-
|
712
|
-
You should then retrieve your initial state(s)
|
713
|
-
(in reverse flushing order if you have several ones) :
|
714
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
715
|
-
|
716
|
-
You can then decode your data, symbol after symbol.
|
717
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
718
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
719
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
720
|
-
|
721
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
722
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
723
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
724
|
-
|
725
|
-
All above operations only read from local register (which size depends on size_t).
|
726
|
-
Refueling the register from memory is manually performed by the reload method.
|
727
|
-
endSignal = FSE_reloadDStream(&DStream);
|
728
|
-
|
729
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
730
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
731
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
732
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
733
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
734
|
-
|
735
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
736
|
-
to properly detect the exact end of stream.
|
737
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
738
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
739
|
-
|
740
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
741
|
-
Checking if DStream has reached its end is performed by :
|
742
|
-
BIT_endOfDStream(&DStream);
|
743
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
744
|
-
FSE_endOfDState(&DState);
|
745
|
-
*/
|
746
|
-
|
747
674
|
|
748
675
|
/******************************************
|
749
676
|
* FSE unsafe API
|
@@ -332,17 +332,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
332
332
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
333
333
|
|
334
334
|
|
335
|
-
/*
|
336
|
-
* Start by invoking BIT_initDStream().
|
337
|
-
* A chunk of the bitStream is then stored into a local register.
|
338
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
339
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
340
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
341
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
342
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
343
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
344
|
-
*/
|
345
|
-
|
346
335
|
|
347
336
|
/******************************************
|
348
337
|
* unsafe API
|
@@ -355,7 +344,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
355
344
|
/****************************************************************
|
356
345
|
* Helper functions
|
357
346
|
****************************************************************/
|
358
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
347
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
359
348
|
{
|
360
349
|
# if defined(_MSC_VER) /* Visual */
|
361
350
|
unsigned long r=0;
|
@@ -428,14 +417,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
428
417
|
|
429
418
|
return srcSize;
|
430
419
|
}
|
431
|
-
|
432
|
-
/*!BIT_lookBits
|
433
|
-
* Provides next n bits from local register
|
434
|
-
* local register is not modified (bits are still present for next read/look)
|
435
|
-
* On 32-bits, maxNbBits==25
|
436
|
-
* On 64-bits, maxNbBits==57
|
437
|
-
* @return : value extracted
|
438
|
-
*/
|
439
420
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
440
421
|
{
|
441
422
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -455,11 +436,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
455
436
|
bitD->bitsConsumed += nbBits;
|
456
437
|
}
|
457
438
|
|
458
|
-
/*!BIT_readBits
|
459
|
-
* Read next n bits from local register.
|
460
|
-
* pay attention to not read more than nbBits contained into local register.
|
461
|
-
* @return : extracted value.
|
462
|
-
*/
|
463
439
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
464
440
|
{
|
465
441
|
size_t value = BIT_lookBits(bitD, nbBits);
|
@@ -697,55 +673,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
697
673
|
|
698
674
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
699
675
|
|
700
|
-
/*
|
701
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
702
|
-
You will decode FSE-encoded symbols from the bitStream,
|
703
|
-
and also any other bitFields you put in, **in reverse order**.
|
704
|
-
|
705
|
-
You will need a few variables to track your bitStream. They are :
|
706
|
-
|
707
|
-
BIT_DStream_t DStream; // Stream context
|
708
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
709
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
710
|
-
|
711
|
-
The first thing to do is to init the bitStream.
|
712
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
713
|
-
|
714
|
-
You should then retrieve your initial state(s)
|
715
|
-
(in reverse flushing order if you have several ones) :
|
716
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
717
|
-
|
718
|
-
You can then decode your data, symbol after symbol.
|
719
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
720
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
721
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
722
|
-
|
723
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
724
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
725
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
726
|
-
|
727
|
-
All above operations only read from local register (which size depends on size_t).
|
728
|
-
Refueling the register from memory is manually performed by the reload method.
|
729
|
-
endSignal = FSE_reloadDStream(&DStream);
|
730
|
-
|
731
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
732
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
733
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
734
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
735
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
736
|
-
|
737
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
738
|
-
to properly detect the exact end of stream.
|
739
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
740
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
741
|
-
|
742
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
743
|
-
Checking if DStream has reached its end is performed by :
|
744
|
-
BIT_endOfDStream(&DStream);
|
745
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
746
|
-
FSE_endOfDState(&DState);
|
747
|
-
*/
|
748
|
-
|
749
676
|
|
750
677
|
/******************************************
|
751
678
|
* FSE unsafe API
|
@@ -738,16 +738,6 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD);
|
|
738
738
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* bitD);
|
739
739
|
|
740
740
|
|
741
|
-
/*
|
742
|
-
* Start by invoking BIT_initDStream().
|
743
|
-
* A chunk of the bitStream is then stored into a local register.
|
744
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
745
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
746
|
-
* Local register is manually filled from memory by the BIT_reloadDStream() method.
|
747
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BIT_DStream_unfinished.
|
748
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
749
|
-
* Checking if DStream has reached its end can be performed with BIT_endOfDStream()
|
750
|
-
*/
|
751
741
|
|
752
742
|
|
753
743
|
/******************************************
|
@@ -761,7 +751,7 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, unsigned nbBits);
|
|
761
751
|
/****************************************************************
|
762
752
|
* Helper functions
|
763
753
|
****************************************************************/
|
764
|
-
MEM_STATIC unsigned BIT_highbit32 (
|
754
|
+
MEM_STATIC unsigned BIT_highbit32 (U32 val)
|
765
755
|
{
|
766
756
|
# if defined(_MSC_VER) /* Visual */
|
767
757
|
unsigned long r=0;
|
@@ -834,13 +824,6 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
|
|
834
824
|
return srcSize;
|
835
825
|
}
|
836
826
|
|
837
|
-
/*!BIT_lookBits
|
838
|
-
* Provides next n bits from local register
|
839
|
-
* local register is not modified (bits are still present for next read/look)
|
840
|
-
* On 32-bits, maxNbBits==25
|
841
|
-
* On 64-bits, maxNbBits==57
|
842
|
-
* @return : value extracted
|
843
|
-
*/
|
844
827
|
MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
845
828
|
{
|
846
829
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -860,11 +843,6 @@ MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
|
|
860
843
|
bitD->bitsConsumed += nbBits;
|
861
844
|
}
|
862
845
|
|
863
|
-
/*!BIT_readBits
|
864
|
-
* Read next n bits from local register.
|
865
|
-
* pay attention to not read more than nbBits contained into local register.
|
866
|
-
* @return : extracted value.
|
867
|
-
*/
|
868
846
|
MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
|
869
847
|
{
|
870
848
|
size_t value = BIT_lookBits(bitD, nbBits);
|
@@ -1011,55 +989,6 @@ static unsigned char FSE_decodeSymbol(FSE_DState_t* DStatePtr, BIT_DStream_t* bi
|
|
1011
989
|
|
1012
990
|
static unsigned FSE_endOfDState(const FSE_DState_t* DStatePtr);
|
1013
991
|
|
1014
|
-
/*!
|
1015
|
-
Let's now decompose FSE_decompress_usingDTable() into its unitary components.
|
1016
|
-
You will decode FSE-encoded symbols from the bitStream,
|
1017
|
-
and also any other bitFields you put in, **in reverse order**.
|
1018
|
-
|
1019
|
-
You will need a few variables to track your bitStream. They are :
|
1020
|
-
|
1021
|
-
BIT_DStream_t DStream; // Stream context
|
1022
|
-
FSE_DState_t DState; // State context. Multiple ones are possible
|
1023
|
-
FSE_DTable* DTablePtr; // Decoding table, provided by FSE_buildDTable()
|
1024
|
-
|
1025
|
-
The first thing to do is to init the bitStream.
|
1026
|
-
errorCode = BIT_initDStream(&DStream, srcBuffer, srcSize);
|
1027
|
-
|
1028
|
-
You should then retrieve your initial state(s)
|
1029
|
-
(in reverse flushing order if you have several ones) :
|
1030
|
-
errorCode = FSE_initDState(&DState, &DStream, DTablePtr);
|
1031
|
-
|
1032
|
-
You can then decode your data, symbol after symbol.
|
1033
|
-
For information the maximum number of bits read by FSE_decodeSymbol() is 'tableLog'.
|
1034
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
1035
|
-
unsigned char symbol = FSE_decodeSymbol(&DState, &DStream);
|
1036
|
-
|
1037
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
1038
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
1039
|
-
size_t bitField = BIT_readBits(&DStream, nbBits);
|
1040
|
-
|
1041
|
-
All above operations only read from local register (which size depends on size_t).
|
1042
|
-
Refueling the register from memory is manually performed by the reload method.
|
1043
|
-
endSignal = FSE_reloadDStream(&DStream);
|
1044
|
-
|
1045
|
-
BIT_reloadDStream() result tells if there is still some more data to read from DStream.
|
1046
|
-
BIT_DStream_unfinished : there is still some data left into the DStream.
|
1047
|
-
BIT_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
1048
|
-
BIT_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
1049
|
-
BIT_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
1050
|
-
|
1051
|
-
When reaching end of buffer (BIT_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
1052
|
-
to properly detect the exact end of stream.
|
1053
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
1054
|
-
BIT_reloadDStream(&DStream) >= BIT_DStream_completed
|
1055
|
-
|
1056
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
1057
|
-
Checking if DStream has reached its end is performed by :
|
1058
|
-
BIT_endOfDStream(&DStream);
|
1059
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
1060
|
-
FSE_endOfDState(&DState);
|
1061
|
-
*/
|
1062
|
-
|
1063
992
|
|
1064
993
|
/* *****************************************
|
1065
994
|
* FSE unsafe API
|
@@ -736,18 +736,6 @@ MEM_STATIC BITv05_DStream_status BITv05_reloadDStream(BITv05_DStream_t* bitD);
|
|
736
736
|
MEM_STATIC unsigned BITv05_endOfDStream(const BITv05_DStream_t* bitD);
|
737
737
|
|
738
738
|
|
739
|
-
/*!
|
740
|
-
* Start by invoking BITv05_initDStream().
|
741
|
-
* A chunk of the bitStream is then stored into a local register.
|
742
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
743
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
744
|
-
* Local register is explicitly reloaded from memory by the BITv05_reloadDStream() method.
|
745
|
-
* A reload guarantee a minimum of ((8*sizeof(size_t))-7) bits when its result is BITv05_DStream_unfinished.
|
746
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
747
|
-
* Checking if DStream has reached its end can be performed with BITv05_endOfDStream()
|
748
|
-
*/
|
749
|
-
|
750
|
-
|
751
739
|
/*-****************************************
|
752
740
|
* unsafe API
|
753
741
|
******************************************/
|
@@ -759,7 +747,7 @@ MEM_STATIC size_t BITv05_readBitsFast(BITv05_DStream_t* bitD, unsigned nbBits);
|
|
759
747
|
/*-**************************************************************
|
760
748
|
* Helper functions
|
761
749
|
****************************************************************/
|
762
|
-
MEM_STATIC unsigned BITv05_highbit32 (
|
750
|
+
MEM_STATIC unsigned BITv05_highbit32 (U32 val)
|
763
751
|
{
|
764
752
|
# if defined(_MSC_VER) /* Visual */
|
765
753
|
unsigned long r=0;
|
@@ -829,13 +817,6 @@ MEM_STATIC size_t BITv05_initDStream(BITv05_DStream_t* bitD, const void* srcBuff
|
|
829
817
|
return srcSize;
|
830
818
|
}
|
831
819
|
|
832
|
-
/*!BITv05_lookBits
|
833
|
-
* Provides next n bits from local register
|
834
|
-
* local register is not modified (bits are still present for next read/look)
|
835
|
-
* On 32-bits, maxNbBits==25
|
836
|
-
* On 64-bits, maxNbBits==57
|
837
|
-
* @return : value extracted
|
838
|
-
*/
|
839
820
|
MEM_STATIC size_t BITv05_lookBits(BITv05_DStream_t* bitD, U32 nbBits)
|
840
821
|
{
|
841
822
|
const U32 bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
@@ -855,11 +836,6 @@ MEM_STATIC void BITv05_skipBits(BITv05_DStream_t* bitD, U32 nbBits)
|
|
855
836
|
bitD->bitsConsumed += nbBits;
|
856
837
|
}
|
857
838
|
|
858
|
-
/*!BITv05_readBits
|
859
|
-
* Read next n bits from local register.
|
860
|
-
* pay attention to not read more than nbBits contained into local register.
|
861
|
-
* @return : extracted value.
|
862
|
-
*/
|
863
839
|
MEM_STATIC size_t BITv05_readBits(BITv05_DStream_t* bitD, U32 nbBits)
|
864
840
|
{
|
865
841
|
size_t value = BITv05_lookBits(bitD, nbBits);
|
@@ -995,54 +971,6 @@ static unsigned char FSEv05_decodeSymbol(FSEv05_DState_t* DStatePtr, BITv05_DStr
|
|
995
971
|
|
996
972
|
static unsigned FSEv05_endOfDState(const FSEv05_DState_t* DStatePtr);
|
997
973
|
|
998
|
-
/*!
|
999
|
-
Let's now decompose FSEv05_decompress_usingDTable() into its unitary components.
|
1000
|
-
You will decode FSEv05-encoded symbols from the bitStream,
|
1001
|
-
and also any other bitFields you put in, **in reverse order**.
|
1002
|
-
|
1003
|
-
You will need a few variables to track your bitStream. They are :
|
1004
|
-
|
1005
|
-
BITv05_DStream_t DStream; // Stream context
|
1006
|
-
FSEv05_DState_t DState; // State context. Multiple ones are possible
|
1007
|
-
FSEv05_DTable* DTablePtr; // Decoding table, provided by FSEv05_buildDTable()
|
1008
|
-
|
1009
|
-
The first thing to do is to init the bitStream.
|
1010
|
-
errorCode = BITv05_initDStream(&DStream, srcBuffer, srcSize);
|
1011
|
-
|
1012
|
-
You should then retrieve your initial state(s)
|
1013
|
-
(in reverse flushing order if you have several ones) :
|
1014
|
-
errorCode = FSEv05_initDState(&DState, &DStream, DTablePtr);
|
1015
|
-
|
1016
|
-
You can then decode your data, symbol after symbol.
|
1017
|
-
For information the maximum number of bits read by FSEv05_decodeSymbol() is 'tableLog'.
|
1018
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
1019
|
-
unsigned char symbol = FSEv05_decodeSymbol(&DState, &DStream);
|
1020
|
-
|
1021
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
1022
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
1023
|
-
size_t bitField = BITv05_readBits(&DStream, nbBits);
|
1024
|
-
|
1025
|
-
All above operations only read from local register (which size depends on size_t).
|
1026
|
-
Refueling the register from memory is manually performed by the reload method.
|
1027
|
-
endSignal = FSEv05_reloadDStream(&DStream);
|
1028
|
-
|
1029
|
-
BITv05_reloadDStream() result tells if there is still some more data to read from DStream.
|
1030
|
-
BITv05_DStream_unfinished : there is still some data left into the DStream.
|
1031
|
-
BITv05_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
1032
|
-
BITv05_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
1033
|
-
BITv05_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
1034
|
-
|
1035
|
-
When reaching end of buffer (BITv05_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
1036
|
-
to properly detect the exact end of stream.
|
1037
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
1038
|
-
BITv05_reloadDStream(&DStream) >= BITv05_DStream_completed
|
1039
|
-
|
1040
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
1041
|
-
Checking if DStream has reached its end is performed by :
|
1042
|
-
BITv05_endOfDStream(&DStream);
|
1043
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
1044
|
-
FSEv05_endOfDState(&DState);
|
1045
|
-
*/
|
1046
974
|
|
1047
975
|
|
1048
976
|
/* *****************************************
|