@@ -3972,8 +3972,15 @@ size_t ZBUFFv05_decompressContinue(ZBUFFv05_DCtx* zbc, void* dst, size_t* maxDst
|
|||||||
zbc->outStart += flushedSize;
|
zbc->outStart += flushedSize;
|
||||||
if (flushedSize == toFlushSize) {
|
if (flushedSize == toFlushSize) {
|
||||||
zbc->stage = ZBUFFv05ds_read;
|
zbc->stage = ZBUFFv05ds_read;
|
||||||
if (zbc->outStart + BLOCKSIZE > zbc->outBuffSize)
|
if (zbc->outStart + BLOCKSIZE > zbc->outBuffSize) {
|
||||||
zbc->outStart = zbc->outEnd = 0;
|
/* Not enough room for next block - need to wrap buffer.
|
||||||
|
* Preserve history: copy the last windowSize bytes to the
|
||||||
|
* beginning so that back-references can still find valid data. */
|
||||||
|
size_t const windowSize = (size_t)1 << zbc->params.windowLog;
|
||||||
|
size_t const preserveSize = MIN(zbc->outEnd, windowSize);
|
||||||
|
memmove(zbc->outBuff, zbc->outBuff + zbc->outEnd - preserveSize, preserveSize);
|
||||||
|
zbc->outStart = zbc->outEnd = preserveSize;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* cannot flush everything */
|
/* cannot flush everything */
|
||||||
|
|||||||
Reference in New Issue
Block a user