# ################################################################
# Version number
-export VERSION=0.0.2
+export VERSION=0.1.0
export RELEASE=r$(VERSION)
DESTDIR?=
size_t FSE_initCStream(FSE_CStream_t* bitC, void* start, size_t maxSize)
{
- if (maxSize < 8) return (size_t)-FSE_ERROR_dstSize_tooSmall;
+ if (maxSize < sizeof(bitC->ptr)) return (size_t)-FSE_ERROR_dstSize_tooSmall;
bitC->bitContainer = 0;
bitC->bitPos = 0;
bitC->startPtr = (char*)start;
size_t nbBytes = bitC->bitPos >> 3;
FSE_writeLEST(bitC->ptr, bitC->bitContainer);
bitC->ptr += nbBytes;
- if (bitC->ptr <= bitC->endPtr)
- {
- bitC->bitPos &= 7;
- bitC->bitContainer >>= nbBytes*8;
- return;
- }
+ if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr;
+ bitC->bitPos &= 7;
+ bitC->bitContainer >>= nbBytes*8;
}
void FSE_flushCState(FSE_CStream_t* bitC, const FSE_CState_t* statePtr)
FSE_addBitsFast(bitC, 1, 1);
FSE_flushBits(bitC);
- if (bitC->bitPos > 7) /* still some data to flush => too close to buffer's end */
+ if (bitC->ptr >= bitC->endPtr) /* too close to buffer's end */
return 0; /* not compressible */
endPtr = bitC->ptr;
U16 nodeNb = STARTNODE;
U32 nodeRoot;
- // check
+ /* safety checks */
if (maxNbBits == 0) maxNbBits = HUF_DEFAULT_TABLELOG;
if (maxSymbolValue > HUF_MAX_SYMBOL_VALUE) return (size_t)-FSE_ERROR_GENERIC;
memset(huffNode0, 0, sizeof(huffNode0));
/* init */
op += 6; /* jump Table -- could be optimized by delta / deviation */
- errorCode = FSE_initCStream(&bitC, op, dstSize);
+ errorCode = FSE_initCStream(&bitC, op, oend-op);
if (FSE_isError(errorCode)) return 0;
n = srcSize & ~15; // mod 16
op += errorCode;
/* Compress */
- op += HUF_compress_usingCTable(op, oend - op, src, srcSize, CTable);
+ errorCode = HUF_compress_usingCTable(op, oend - op, src, srcSize, CTable);
+ if (FSE_isError(errorCode)) return errorCode;
+ if (errorCode==0) return 0;
+ op += errorCode;
/* check compressibility */
if ((size_t)(op-ostart) >= srcSize-1)
}
-size_t ZSTD_compressBegin(ZSTD_Cctx* ctx, void* dst, size_t maxDstSize)
+size_t ZSTD_compressBegin(ZSTD_Cctx* ctx, void* dst, size_t maxDstSize)
{
/* Sanity check */
if (maxDstSize < ZSTD_frameHeaderSize) return (size_t)-ZSTD_ERROR_maxDstSize_tooSmall;
static size_t ZSTD_compressCCtx(ZSTD_Cctx* ctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
{
BYTE* const ostart = (BYTE* const)dst;
- BYTE* const oend = ostart + maxDstSize;
BYTE* op = ostart;
/* Header */
/* Compression */
{
- size_t cSize = ZSTD_compressContinue(ctx, op, oend-op, src, srcSize);
+ size_t cSize = ZSTD_compressContinue(ctx, op, maxDstSize, src, srcSize);
if (ZSTD_isError(cSize)) return cSize;
op += cSize;
maxDstSize -= cSize;
/* Close frame */
{
- size_t endSize = ZSTD_compressEnd(ctx, op, oend-op);
+ size_t endSize = ZSTD_compressEnd(ctx, op, maxDstSize);
if(ZSTD_isError(endSize)) return endSize;
op += endSize;
}
# fullbench32: Same as fullbench, but forced to compile in 32-bits mode
# ##########################################################################
-RELEASE?= v0.0.2
+RELEASE?= v0.1.0
DESTDIR?=
PREFIX ?= /usr
all: zstd zstd32 fullbench fullbench32 fuzzer fuzzer32 datagen
-zstd: $(ZSTDDIR)/zstd.c xxhash.c bench.c fileio.c zstdcli.c
+zstd : $(ZSTDDIR)/zstd.c xxhash.c bench.c fileio.c zstdcli.c
$(CC) $(FLAGS) $^ -o $@$(EXT)
zstd32: $(ZSTDDIR)/zstd.c xxhash.c bench.c fileio.c zstdcli.c
U32 result = 0;
U32 testNb = 0;
U32 coreSeed = seed, lseed = 0;
- (void)startTest; (void)compressibility;
/* allocation */
srcBuffer = (BYTE*)malloc (srcBufferSize);
CHECK (!srcBuffer || !dstBuffer || !cBuffer, "Not enough memory, fuzzer tests cancelled");
/* Create initial sample */
- FUZ_generateSynthetic(srcBuffer, srcBufferSize, 0.50, &coreSeed);
+ FUZ_generateSynthetic(srcBuffer, srcBufferSize, compressibility, &coreSeed);
/* catch up testNb */
for (testNb=0; testNb < startTest; testNb++)
sampleStart = FUZ_rand(&lseed) % (srcBufferSize - sampleSize);
crcOrig = XXH64(srcBuffer + sampleStart, sampleSize, 0);
- /* compression tests*/
+ /* compression test */
cSize = ZSTD_compress(cBuffer, cBufferSize, srcBuffer + sampleStart, sampleSize);
CHECK(ZSTD_isError(cSize), "ZSTD_compress failed");
+ /* compression failure test */
+ {
+ size_t errorCode;
+ void* dBufferTooSmall = malloc(cSize-1); /* valgrind should catch overflows */
+ if (dBufferTooSmall==NULL) { DISPLAY("not enough memory !"); exit(1); }
+ errorCode = ZSTD_compress(dBufferTooSmall, cSize-1, srcBuffer + sampleStart, sampleSize);
+ CHECK(!ZSTD_isError(errorCode), "ZSTD_compress should have failed ! (buffer too small)");
+ free(dBufferTooSmall);
+ }
+
/* decompression tests*/
dSupSize = (FUZ_rand(&lseed) & 1) ? 0 : (FUZ_rand(&lseed) & 31) + 1;
dSize = ZSTD_decompress(dstBuffer, sampleSize + dSupSize, cBuffer, cSize);
DISPLAY( " -i# : Nb of tests (default:%u) \n", nbTestsDefault);
DISPLAY( " -s# : Select seed (default:prompt user)\n");
DISPLAY( " -t# : Select starting test number (default:0)\n");
- DISPLAY( " -p# : Select compressibility in %% (default:%i%%)\n", FUZ_COMPRESSIBILITY_DEFAULT);
+ DISPLAY( " -P# : Select compressibility in %% (default:%i%%)\n", FUZ_COMPRESSIBILITY_DEFAULT);
DISPLAY( " -v : verbose\n");
+ DISPLAY( " -p : pause at the end\n");
DISPLAY( " -h : display help and exit\n");
return 0;
}