mirror of
https://github.com/facebook/zstd.git
synced 2024-11-28 23:56:48 +08:00
zlibWrapper: added the totalInBytes flag - we need it as strm->total_in can be reset by user
This commit is contained in:
parent
957a6d596b
commit
502966ab9c
3
zlibWrapper/.gitignore
vendored
3
zlibWrapper/.gitignore
vendored
@ -20,3 +20,6 @@ zwrapbench
|
||||
*.bat
|
||||
*.zip
|
||||
*.txt
|
||||
|
||||
# Directories
|
||||
minizip/
|
@ -81,7 +81,8 @@ typedef enum { ZWRAP_useInit, ZWRAP_useReset, ZWRAP_streamEnd } ZWRAP_state_t;
|
||||
typedef struct {
|
||||
ZSTD_CStream* zbc;
|
||||
int compressionLevel;
|
||||
int streamEnd;
|
||||
int streamEnd; /* a flag to signal the end of a stream */
|
||||
unsigned long long totalInBytes; /* we need it as strm->total_in can be reset by user */
|
||||
ZSTD_customMem customMem;
|
||||
z_stream allocFunc; /* copy of zalloc, zfree, opaque */
|
||||
ZSTD_inBuffer inBuffer;
|
||||
@ -189,6 +190,7 @@ ZEXTERN int ZEXPORT z_deflateInit_ OF((z_streamp strm, int level,
|
||||
level = ZWRAP_DEFAULT_CLEVEL;
|
||||
|
||||
zwc->streamEnd = 0;
|
||||
zwc->totalInBytes = 0;
|
||||
zwc->compressionLevel = level;
|
||||
strm->state = (struct internal_state*) zwc; /* use state which in not used by user */
|
||||
strm->total_in = 0;
|
||||
@ -217,7 +219,10 @@ int ZWRAP_deflateReset_keepDict(z_streamp strm)
|
||||
return deflateReset(strm);
|
||||
|
||||
{ ZWRAP_CCtx* zwc = (ZWRAP_CCtx*) strm->state;
|
||||
if (zwc) zwc->streamEnd = 0;
|
||||
if (zwc) {
|
||||
zwc->streamEnd = 0;
|
||||
zwc->totalInBytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
strm->total_in = 0;
|
||||
@ -289,7 +294,7 @@ ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush))
|
||||
if (res != Z_OK) return ZWRAPC_finishWithError(zwc, strm, res);
|
||||
if (flush != Z_FINISH) zwc->comprState = ZWRAP_useReset;
|
||||
} else {
|
||||
if (strm->total_in == 0) {
|
||||
if (zwc->totalInBytes == 0) {
|
||||
if (zwc->comprState == ZWRAP_useReset) {
|
||||
size_t const errorCode = ZSTD_resetCStream(zwc->zbc, (flush == Z_FINISH) ? strm->avail_in : zwc->pledgedSrcSize);
|
||||
if (ZSTD_isError(errorCode)) { LOG_WRAPPERC("ERROR: ZSTD_resetCStream errorCode=%s\n", ZSTD_getErrorName(errorCode)); return ZWRAPC_finishWithError(zwc, strm, 0); }
|
||||
@ -317,6 +322,7 @@ ZEXTERN int ZEXPORT z_deflate OF((z_streamp strm, int flush))
|
||||
strm->total_out += zwc->outBuffer.pos;
|
||||
strm->avail_out -= zwc->outBuffer.pos;
|
||||
strm->total_in += zwc->inBuffer.pos;
|
||||
zwc->totalInBytes += zwc->inBuffer.pos;
|
||||
strm->next_in += zwc->inBuffer.pos;
|
||||
strm->avail_in -= zwc->inBuffer.pos;
|
||||
}
|
||||
@ -411,6 +417,7 @@ typedef struct {
|
||||
ZSTD_DStream* zbd;
|
||||
char headerBuf[16]; /* should be equal or bigger than ZSTD_frameHeaderSize_min */
|
||||
int errorCount;
|
||||
unsigned long long totalInBytes; /* we need it as strm->total_in can be reset by user */
|
||||
ZWRAP_state_t decompState;
|
||||
ZSTD_inBuffer inBuffer;
|
||||
ZSTD_outBuffer outBuffer;
|
||||
@ -511,6 +518,7 @@ ZEXTERN int ZEXPORT z_inflateInit_ OF((z_streamp strm,
|
||||
strcpy(zwd->version, version);
|
||||
|
||||
zwd->stream_size = stream_size;
|
||||
zwd->totalInBytes = 0;
|
||||
strm->state = (struct internal_state*) zwd; /* use state which in not used by user */
|
||||
strm->total_in = 0;
|
||||
strm->total_out = 0;
|
||||
@ -551,6 +559,7 @@ int ZWRAP_inflateReset_keepDict(z_streamp strm)
|
||||
if (zwd == NULL) return Z_STREAM_ERROR;
|
||||
ZWRAP_initDCtx(zwd);
|
||||
zwd->decompState = ZWRAP_useReset;
|
||||
zwd->totalInBytes = 0;
|
||||
}
|
||||
|
||||
strm->total_in = 0;
|
||||
@ -610,9 +619,9 @@ ZEXTERN int ZEXPORT z_inflateSetDictionary OF((z_streamp strm,
|
||||
if (ZSTD_isError(errorCode)) return ZWRAPD_finishWithError(zwd, strm, 0);
|
||||
zwd->decompState = ZWRAP_useReset;
|
||||
|
||||
if (strm->total_in == ZSTD_HEADERSIZE) {
|
||||
if (zwd->totalInBytes == ZSTD_HEADERSIZE) {
|
||||
zwd->inBuffer.src = zwd->headerBuf;
|
||||
zwd->inBuffer.size = strm->total_in;
|
||||
zwd->inBuffer.size = zwd->totalInBytes;
|
||||
zwd->inBuffer.pos = 0;
|
||||
zwd->outBuffer.dst = strm->next_out;
|
||||
zwd->outBuffer.size = 0;
|
||||
@ -650,8 +659,8 @@ ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
|
||||
if (zwd == NULL) return Z_STREAM_ERROR;
|
||||
if (zwd->decompState == ZWRAP_streamEnd) return Z_STREAM_END;
|
||||
|
||||
if (strm->total_in < ZLIB_HEADERSIZE) {
|
||||
if (strm->total_in == 0 && strm->avail_in >= ZLIB_HEADERSIZE) {
|
||||
if (zwd->totalInBytes < ZLIB_HEADERSIZE) {
|
||||
if (zwd->totalInBytes == 0 && strm->avail_in >= ZLIB_HEADERSIZE) {
|
||||
if (MEM_readLE32(strm->next_in) != ZSTD_MAGICNUMBER) {
|
||||
if (zwd->windowBits)
|
||||
errorCode = inflateInit2_(strm, zwd->windowBits, zwd->version, zwd->stream_size);
|
||||
@ -668,12 +677,13 @@ ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
|
||||
return res;
|
||||
}
|
||||
} else {
|
||||
srcSize = MIN(strm->avail_in, ZLIB_HEADERSIZE - strm->total_in);
|
||||
memcpy(zwd->headerBuf+strm->total_in, strm->next_in, srcSize);
|
||||
srcSize = MIN(strm->avail_in, ZLIB_HEADERSIZE - zwd->totalInBytes);
|
||||
memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
|
||||
strm->total_in += srcSize;
|
||||
zwd->totalInBytes += srcSize;
|
||||
strm->next_in += srcSize;
|
||||
strm->avail_in -= srcSize;
|
||||
if (strm->total_in < ZLIB_HEADERSIZE) return Z_OK;
|
||||
if (zwd->totalInBytes < ZLIB_HEADERSIZE) return Z_OK;
|
||||
|
||||
if (MEM_readLE32(zwd->headerBuf) != ZSTD_MAGICNUMBER) {
|
||||
z_stream strm2;
|
||||
@ -725,9 +735,9 @@ ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
|
||||
zwd->decompState = ZWRAP_useInit;
|
||||
}
|
||||
|
||||
if (strm->total_in < ZSTD_HEADERSIZE)
|
||||
if (zwd->totalInBytes < ZSTD_HEADERSIZE)
|
||||
{
|
||||
if (strm->total_in == 0 && strm->avail_in >= ZSTD_HEADERSIZE) {
|
||||
if (zwd->totalInBytes == 0 && strm->avail_in >= ZSTD_HEADERSIZE) {
|
||||
if (zwd->decompState == ZWRAP_useInit) {
|
||||
errorCode = ZSTD_initDStream(zwd->zbd);
|
||||
if (ZSTD_isError(errorCode)) { LOG_WRAPPERD("ERROR: ZSTD_initDStream errorCode=%s\n", ZSTD_getErrorName(errorCode)); goto error; }
|
||||
@ -736,12 +746,13 @@ ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
|
||||
if (ZSTD_isError(errorCode)) goto error;
|
||||
}
|
||||
} else {
|
||||
srcSize = MIN(strm->avail_in, ZSTD_HEADERSIZE - strm->total_in);
|
||||
memcpy(zwd->headerBuf+strm->total_in, strm->next_in, srcSize);
|
||||
srcSize = MIN(strm->avail_in, ZSTD_HEADERSIZE - zwd->totalInBytes);
|
||||
memcpy(zwd->headerBuf+zwd->totalInBytes, strm->next_in, srcSize);
|
||||
strm->total_in += srcSize;
|
||||
zwd->totalInBytes += srcSize;
|
||||
strm->next_in += srcSize;
|
||||
strm->avail_in -= srcSize;
|
||||
if (strm->total_in < ZSTD_HEADERSIZE) return Z_OK;
|
||||
if (zwd->totalInBytes < ZSTD_HEADERSIZE) return Z_OK;
|
||||
|
||||
if (zwd->decompState == ZWRAP_useInit) {
|
||||
errorCode = ZSTD_initDStream(zwd->zbd);
|
||||
@ -785,6 +796,7 @@ ZEXTERN int ZEXPORT z_inflate OF((z_streamp strm, int flush))
|
||||
strm->total_out += zwd->outBuffer.pos;
|
||||
strm->avail_out -= zwd->outBuffer.pos;
|
||||
strm->total_in += zwd->inBuffer.pos;
|
||||
zwd->totalInBytes += zwd->inBuffer.pos;
|
||||
strm->next_in += zwd->inBuffer.pos;
|
||||
strm->avail_in -= zwd->inBuffer.pos;
|
||||
if (errorCode == 0) {
|
||||
|
Loading…
Reference in New Issue
Block a user