diff --git a/programs/fileio.c b/programs/fileio.c index e08c7f350..c833336dc 100644 --- a/programs/fileio.c +++ b/programs/fileio.c @@ -323,6 +323,7 @@ struct FIO_prefs_s { int excludeCompressedFiles; int patchFromMode; + int contentSize; }; @@ -494,6 +495,11 @@ void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value) prefs->patchFromMode = value != 0; } +void FIO_setContentSize(FIO_prefs_t* const prefs, int value) +{ + prefs->contentSize = value != 0; +} + /*-************************************* * Functions ***************************************/ @@ -817,6 +823,7 @@ static cRess_t FIO_createCResources(FIO_prefs_t* const prefs, CHECK( ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_contentSizeFlag, 1) ); /* always enable content size when available (note: supposed to be default) */ CHECK( ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_dictIDFlag, prefs->dictIDFlag) ); CHECK( ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_checksumFlag, prefs->checksumFlag) ); + CHECK( ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_contentSizeFlag, prefs->contentSize) ); /* compression level */ CHECK( ZSTD_CCtx_setParameter(ress.cctx, ZSTD_c_compressionLevel, cLevel) ); /* max compressed block size */ diff --git a/programs/fileio.h b/programs/fileio.h index c592542e5..64a7035b1 100644 --- a/programs/fileio.h +++ b/programs/fileio.h @@ -95,6 +95,7 @@ void FIO_setNoProgress(unsigned noProgress); void FIO_setNotificationLevel(int level); void FIO_setExcludeCompressedFile(FIO_prefs_t* const prefs, int excludeCompressedFiles); void FIO_setPatchFromMode(FIO_prefs_t* const prefs, int value); +void FIO_setContentSize(FIO_prefs_t* const prefs, int value); /*-************************************* * Single File functions diff --git a/programs/zstd.1.md b/programs/zstd.1.md index dc6e9b5d2..5b557e65c 100644 --- a/programs/zstd.1.md +++ b/programs/zstd.1.md @@ -198,6 +198,10 @@ the last one takes effect. default: enabled when output is into a file, and disabled when output is stdout. This setting overrides default and can force sparse mode over stdout. +* `--[no-]content-size`: + enable / disable whether or not the original size of the file is placed in + the header of the compressed file. The default option is + --content-size (meaning that the original size will be placed in the header). * `--rm`: remove source file(s) after successful compression or decompression * `-k`, `--keep`: diff --git a/programs/zstdcli.c b/programs/zstdcli.c index b7f068ac1..8e86c282b 100644 --- a/programs/zstdcli.c +++ b/programs/zstdcli.c @@ -634,7 +634,8 @@ int main(int const argCount, const char* argv[]) setRealTimePrio = 0, singleThread = 0, showDefaultCParams = 0, - ultra=0; + ultra=0, + contentSize=1; double compressibility = 0.5; unsigned bench_nbSeconds = 3; /* would be better if this value was synchronized from bench */ size_t blockSize = 0; @@ -748,6 +749,8 @@ int main(int const argCount, const char* argv[]) if (!strcmp(argument, "--priority=rt")) { setRealTimePrio = 1; continue; } if (!strcmp(argument, "--output-dir-flat")) {nextArgumentIsOutDirName=1; lastCommand=1; continue; } if (!strcmp(argument, "--show-default-cparams")) { showDefaultCParams = 1; continue; } + if (!strcmp(argument, "--content-size")) { contentSize = 1; continue; } + if (!strcmp(argument, "--no-content-size")) { contentSize = 0; continue; } if (!strcmp(argument, "--adapt")) { adapt = 1; continue; } if (longCommandWArg(&argument, "--adapt=")) { adapt = 1; if (!parseAdaptParameters(argument, &adaptMin, &adaptMax)) { badusage(programName); CLEAN_RETURN(1); } continue; } if (!strcmp(argument, "--single-thread")) { nbWorkers = 0; singleThread = 1; continue; } @@ -1256,6 +1259,7 @@ int main(int const argCount, const char* argv[]) FIO_setMemLimit(prefs, memLimit); if (operation==zom_compress) { #ifndef ZSTD_NOCOMPRESS + FIO_setContentSize(prefs, contentSize); FIO_setNbWorkers(prefs, nbWorkers); FIO_setBlockSize(prefs, (int)blockSize); if (g_overlapLog!=OVERLAP_LOG_DEFAULT) FIO_setOverlapLog(prefs, (int)g_overlapLog); @@ -1303,7 +1307,7 @@ int main(int const argCount, const char* argv[]) else operationResult = FIO_compressMultipleFilenames(prefs, filenames->fileNames, (unsigned)filenames->tableSize, outDirName, outFileName, suffix, dictFileName, cLevel, compressionParams); #else - (void)suffix; (void)adapt; (void)rsyncable; (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; (void)ZSTD_strategyMap; /* not used when ZSTD_NOCOMPRESS set */ + (void)contentSize; (void)suffix; (void)adapt; (void)rsyncable; (void)ultra; (void)cLevel; (void)ldmFlag; (void)literalCompressionMode; (void)targetCBlockSize; (void)streamSrcSize; (void)srcSizeHint; (void)ZSTD_strategyMap; /* not used when ZSTD_NOCOMPRESS set */ DISPLAY("Compression not supported \n"); #endif } else { /* decompression or test */ diff --git a/tests/playTests.sh b/tests/playTests.sh index c7605cc48..c020127fe 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -469,6 +469,19 @@ ls tmp* > tmpList $ZSTD -f tmp1 --filelist=tmpList --filelist=tmpList tmp2 tmp3 # can trigger an overflow of internal file list rm -rf tmp* +println "\n===> --[no-]content-size tests" + +$DATAGEN > tmp_contentsize +$ZSTD -f tmp_contentsize +$ZSTD -lv tmp_contentsize.zst | grep "Decompressed Size:" +$ZSTD -f --no-content-size tmp_contentsize +$ZSTD -lv tmp_contentsize.zst | grep "Decompressed Size:" && die +$ZSTD -f --content-size tmp_contentsize +$ZSTD -lv tmp_contentsize.zst | grep "Decompressed Size:" +$ZSTD -f --content-size --no-content-size tmp_contentsize +$ZSTD -lv tmp_contentsize.zst | grep "Decompressed Size:" && die +rm -rf tmp* + println "test : show-default-cparams regular" $DATAGEN > tmp $ZSTD --show-default-cparams -f tmp