mirror of
https://github.com/emmanuel-marty/lzsa.git
synced 2024-12-23 22:29:27 +00:00
Fix self-tests, in-memory benchmarks in raw mode
This commit is contained in:
parent
659f6c14a9
commit
2e48e926a1
@ -93,22 +93,27 @@ size_t lzsa_get_max_decompressed_size_inmem(const unsigned char *pFileData, size
|
||||
* @param pOutBuffer buffer for decompressed data
|
||||
* @param nFileSize compressed size in bytes
|
||||
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
||||
* @param nFlags compression flags (LZSA_FLAG_xxx)
|
||||
* @param pFormatVersion pointer to format version, updated if this function is successful
|
||||
*
|
||||
* @return actual decompressed size, or -1 for error
|
||||
*/
|
||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, int *pFormatVersion) {
|
||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, const unsigned int nFlags, int *pFormatVersion) {
|
||||
const unsigned char *pCurFileData = pFileData;
|
||||
const unsigned char *pEndFileData = pCurFileData + nFileSize;
|
||||
unsigned char *pCurOutBuffer = pOutBuffer;
|
||||
const unsigned char *pEndOutBuffer = pCurOutBuffer + nMaxOutBufferSize;
|
||||
int nFormatVersion = 0;
|
||||
int nPreviousBlockSize;
|
||||
const int nHeaderSize = lzsa_get_header_size();
|
||||
|
||||
if (nFlags & LZSA_FLAG_RAW_BLOCK) {
|
||||
int nEODBytes = (*pFormatVersion == 2) ? 2 : 4;
|
||||
return (size_t)lzsa_decompressor_expand_block(pFileData, (int)nFileSize - nEODBytes /* EOD marker */, pOutBuffer, 0, (int)nMaxOutBufferSize, *pFormatVersion);
|
||||
}
|
||||
|
||||
/* Check header */
|
||||
if ((pCurFileData + nHeaderSize) > pEndFileData ||
|
||||
lzsa_decode_header(pCurFileData, nHeaderSize, &nFormatVersion) != 0)
|
||||
lzsa_decode_header(pCurFileData, nHeaderSize, pFormatVersion) != 0)
|
||||
return -1;
|
||||
|
||||
pCurFileData += nHeaderSize;
|
||||
@ -135,7 +140,7 @@ size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOut
|
||||
if ((pCurFileData + nBlockDataSize) > pEndFileData)
|
||||
return -1;
|
||||
|
||||
nDecompressedSize = lzsa_decompressor_expand_block(pCurFileData, nBlockDataSize, pCurOutBuffer - nPreviousBlockSize, nPreviousBlockSize, (int)(pEndOutBuffer - pCurOutBuffer + nPreviousBlockSize), nFormatVersion);
|
||||
nDecompressedSize = lzsa_decompressor_expand_block(pCurFileData, nBlockDataSize, pCurOutBuffer - nPreviousBlockSize, nPreviousBlockSize, (int)(pEndOutBuffer - pCurOutBuffer + nPreviousBlockSize), *pFormatVersion);
|
||||
if (nDecompressedSize < 0)
|
||||
return -1;
|
||||
|
||||
@ -155,6 +160,5 @@ size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOut
|
||||
pCurFileData += nBlockDataSize;
|
||||
}
|
||||
|
||||
*pFormatVersion = nFormatVersion;
|
||||
return (int)(pCurOutBuffer - pOutBuffer);
|
||||
}
|
||||
|
@ -56,11 +56,12 @@ size_t lzsa_get_max_decompressed_size_inmem(const unsigned char *pFileData, size
|
||||
* @param pOutBuffer buffer for decompressed data
|
||||
* @param nFileSize compressed size in bytes
|
||||
* @param nMaxOutBufferSize maximum capacity of decompression buffer
|
||||
* @param nFlags compression flags (LZSA_FLAG_xxx)
|
||||
* @param pFormatVersion pointer to format version, updated if this function is successful
|
||||
*
|
||||
* @return actual decompressed size, or -1 for error
|
||||
*/
|
||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, int *pFormatVersion);
|
||||
size_t lzsa_decompress_inmem(const unsigned char *pFileData, unsigned char *pOutBuffer, size_t nFileSize, size_t nMaxOutBufferSize, const unsigned int nFlags, int *pFormatVersion);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
21
src/lzsa.c
21
src/lzsa.c
@ -470,11 +470,11 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
||||
size_t nDataSizeStep = 128;
|
||||
float fProbabilitySizeStep = 0.0005f;
|
||||
|
||||
for (nGeneratedDataSize = 1024; nGeneratedDataSize <= (4 * BLOCK_SIZE); nGeneratedDataSize += nDataSizeStep) {
|
||||
for (nGeneratedDataSize = 1024; nGeneratedDataSize <= ((nOptions & OPT_RAW) ? BLOCK_SIZE : (4 * BLOCK_SIZE)); nGeneratedDataSize += nDataSizeStep) {
|
||||
float fMatchProbability;
|
||||
|
||||
fprintf(stdout, "size %zd", nGeneratedDataSize);
|
||||
for (fMatchProbability = 0; fMatchProbability <= 0.995f; fMatchProbability += fProbabilitySizeStep) {
|
||||
for (fMatchProbability = ((nOptions & OPT_RAW) ? 0.5f : 0.1f); fMatchProbability <= 0.995f; fMatchProbability += fProbabilitySizeStep) {
|
||||
int nNumLiteralValues[12] = { 1, 2, 3, 15, 30, 56, 96, 137, 178, 191, 255, 256 };
|
||||
float fXorProbability;
|
||||
|
||||
@ -504,8 +504,8 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
||||
|
||||
/* Try to decompress it, expected to succeed */
|
||||
size_t nActualDecompressedSize;
|
||||
int nDecFormatVersion = 0;
|
||||
nActualDecompressedSize = lzsa_decompress_inmem(pCompressedData, pTmpDecompressedData, nActualCompressedSize, nGeneratedDataSize, &nDecFormatVersion);
|
||||
int nDecFormatVersion = nFormatVersion;
|
||||
nActualDecompressedSize = lzsa_decompress_inmem(pCompressedData, pTmpDecompressedData, nActualCompressedSize, nGeneratedDataSize, nFlags, &nDecFormatVersion);
|
||||
if (nActualDecompressedSize == -1) {
|
||||
free(pTmpDecompressedData);
|
||||
pTmpDecompressedData = NULL;
|
||||
@ -538,7 +538,8 @@ static int do_self_test(const unsigned int nOptions, const int nMinMatchSize, in
|
||||
for (fXorProbability = 0.05f; fXorProbability <= 0.5f; fXorProbability += 0.05f) {
|
||||
memcpy(pTmpCompressedData, pCompressedData, nActualCompressedSize);
|
||||
xor_data(pTmpCompressedData + lzsa_get_header_size() + lzsa_get_frame_size(), nActualCompressedSize - lzsa_get_header_size() - lzsa_get_frame_size() - lzsa_get_frame_size() /* footer */, nSeed, fXorProbability);
|
||||
lzsa_decompress_inmem(pTmpCompressedData, pGeneratedData, nActualCompressedSize, nGeneratedDataSize, &nDecFormatVersion);
|
||||
nDecFormatVersion = nFormatVersion;
|
||||
lzsa_decompress_inmem(pTmpCompressedData, pGeneratedData, nActualCompressedSize, nGeneratedDataSize, nFlags, &nDecFormatVersion);
|
||||
}
|
||||
}
|
||||
|
||||
@ -710,8 +711,13 @@ static int do_dec_benchmark(const char *pszInFilename, const char *pszOutFilenam
|
||||
size_t nFileSize, nMaxDecompressedSize;
|
||||
unsigned char *pFileData;
|
||||
unsigned char *pDecompressedData;
|
||||
int nFlags;
|
||||
int i;
|
||||
|
||||
nFlags = 0;
|
||||
if (nOptions & OPT_RAW)
|
||||
nFlags |= LZSA_FLAG_RAW_BLOCK;
|
||||
|
||||
if (pszDictionaryFilename) {
|
||||
fprintf(stderr, "in-memory benchmarking does not support dictionaries\n");
|
||||
return 100;
|
||||
@ -771,10 +777,7 @@ static int do_dec_benchmark(const char *pszInFilename, const char *pszOutFilenam
|
||||
size_t nActualDecompressedSize = 0;
|
||||
for (i = 0; i < 50; i++) {
|
||||
long long t0 = do_get_time();
|
||||
if (nOptions & OPT_RAW)
|
||||
nActualDecompressedSize = lzsa_decompressor_expand_block(pFileData, (int)nFileSize - 4 /* EOD marker */, pDecompressedData, 0, (int)nMaxDecompressedSize, nFormatVersion);
|
||||
else
|
||||
nActualDecompressedSize = lzsa_decompress_inmem(pFileData, pDecompressedData, nFileSize, nMaxDecompressedSize, &nFormatVersion);
|
||||
nActualDecompressedSize = lzsa_decompress_inmem(pFileData, pDecompressedData, nFileSize, nMaxDecompressedSize, nFlags, &nFormatVersion);
|
||||
long long t1 = do_get_time();
|
||||
if (nActualDecompressedSize == -1) {
|
||||
free(pDecompressedData);
|
||||
|
@ -102,11 +102,17 @@ size_t lzsa_compress_inmem(const unsigned char *pInputData, unsigned char *pOutB
|
||||
|
||||
int nOutDataSize;
|
||||
int nOutDataEnd = (int)(nMaxOutBufferSize - (lzsa_get_frame_size() + nCompressedSize + lzsa_get_frame_size() /* footer */));
|
||||
int nFrameSize = lzsa_get_frame_size();
|
||||
|
||||
if ((nFlags & LZSA_FLAG_RAW_BLOCK) != 0) {
|
||||
nFrameSize = 0;
|
||||
nOutDataEnd = (int)(nMaxOutBufferSize);
|
||||
}
|
||||
|
||||
if (nOutDataEnd > BLOCK_SIZE)
|
||||
nOutDataEnd = BLOCK_SIZE;
|
||||
|
||||
nOutDataSize = lzsa_compressor_shrink_block(&compressor, pInputData + nOriginalSize - nPreviousBlockSize, nPreviousBlockSize, nInDataSize, pOutBuffer + lzsa_get_frame_size() + nCompressedSize, nOutDataEnd);
|
||||
nOutDataSize = lzsa_compressor_shrink_block(&compressor, pInputData + nOriginalSize - nPreviousBlockSize, nPreviousBlockSize, nInDataSize, pOutBuffer + nFrameSize + nCompressedSize, nOutDataEnd);
|
||||
if (nOutDataSize >= 0) {
|
||||
/* Write compressed block */
|
||||
|
||||
@ -116,12 +122,14 @@ size_t lzsa_compress_inmem(const unsigned char *pInputData, unsigned char *pOutB
|
||||
nError = LZSA_ERROR_COMPRESSION;
|
||||
else {
|
||||
nCompressedSize += nBlockheaderSize;
|
||||
}
|
||||
}
|
||||
|
||||
if (!nError) {
|
||||
nOriginalSize += nInDataSize;
|
||||
nCompressedSize += nOutDataSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* Write uncompressible, literal block */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user